Windows Service mit Delphi 2007

    Windows Service mit Delphi 2007

    Hallo zusammen!

    Wie erstelle ich einen ganz einfaches Windows Service mit Delphi 2007? Er soll einfach nur einen Timer starten, der regelmäßig eine Funktion ausführt.

    Ich habe einen kleinen Test-Service erstellt, aber wenn ich ihn mit dem Run-Befehl der Delphie IDE debugge, führt nur ein mal die onCreate-Methode aus und durchläuft ein einziges mal die onTimer-Methode. Danach wird der Service beendet.

    Installieren lässt er sich auch nicht. Es kommt dann die Fehlermeldung: "Exception EOSError in Modul MeinService.exe bei 0000F335. Systemfehler. Code: 5. Zugriff verweigert."

    Ach ja: Ich habe Windows 7 x64 laufen. Hat es was damit zu tun?

    Danke im Voraus!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kermes“ ()

    führt nur ein mal die onCreate-Methode aus und durchläuft ein einziges mal die onTimer-Methode. Danach wird der Service beendet


    ist normal, ist ja keine Anwendung im normalen Sinne.

    Code: 5. Zugriff verweigert


    - Wie installiert Du den Dienst?
    - Welche Rechte hat der Benutzer der den Dienst installieren will/soll?

    Windows 7 x64 laufen. Hat es was damit zu tun?


    Nein

    mfg
    S.Simon

    S.Simon schrieb:

    für diesen Fall müsstest Du mal ein wenig Code posten, so ist es schwer zu sagen.


    Ich habe eigentlich nur eine einzige Unit:

    Delphi-Code

    1. unit main;
    2. interface
    3. uses
    4. Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
    5. ExtCtrls, Registry;
    6. type
    7. TMeinService = class(TService)
    8. tmrIrgendwas: TTimer;
    9. procedure tmrIrgendwasTimer(Sender: TObject);
    10. procedure ServiceCreate(Sender: TObject);
    11. private
    12. { Private-Deklarationen }
    13. public
    14. function GetServiceController: TServiceController; override;
    15. { Public-Deklarationen }
    16. end;
    17. var
    18. MeinService: TMeinService;
    19. implementation
    20. {$R *.DFM}
    21. ...
    22. procedure ServiceController(CtrlCode: DWord); stdcall;
    23. begin
    24. MeinService.Controller(CtrlCode);
    25. end;
    26. function TMeinService.GetServiceController: TServiceController;
    27. begin
    28. Result := ServiceController;
    29. end;
    30. procedure TMeinService.ServiceCreate(Sender: TObject);
    31. begin
    32. Init;
    33. end;
    34. procedure TMeinService.tmrIrgendwasTimer(Sender: TObject);
    35. begin
    36. TuWas;
    37. end;
    38. end.


    Aus Gründen der Übersicht habe ich mal die Details weggelassen. Der Code in tmrIrgendwasTimer() scheint nicht ausgeführt zu werden bei mir.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DeddyH“ () aus folgendem Grund: Code- durch Delphi-Tags ([delphi][/delphi]) ersetzt, bitte künftig diese benutzen //MfG DeddyH

    Zunächst solltest du dir bewusst machen, wie denn so eine Service-Anwendung funktioniert.

    Egal was man mit dem Service macht (installieren, deinstallieren, ausführen) es wird immer die Anwendung gestartet und somit auch immer TMeinService.Create ausgeführt.

    Während der Installation/Deinstallation ist es aber wohl eher kontraproduktiv, wenn dann schon die Teile ausgeführt werden, die eigentlich nur dann laufen sollen, wenn der Service läuft.

    Dazu gibt es diese Events

    Delphi-Code

    1. TService.OnStart
    2. TService.OnStop
    3. TService.OnPause
    4. TService.OnContinue
    5. TService.OnShutdown

    Für den Part Installation/Deinstallation gibt es da auch Events

    Delphi-Code

    1. TService.OnBeforeInstall
    2. TService.OnAfterInstall
    3. TService.BeforeUninstall
    4. TService.AfterUninstall

    Die Events

    Delphi-Code

    1. TService.OnCreate
    2. TService.OnDestroy

    Werden aber immer aufgerufen, egal ob Installation/Deinstallation oder normaler Betrieb.

    Ein Blick in die Online-Hilfe bringt auch einige Erkenntnisse ;)

    Sir Rufo schrieb:

    Zunächst solltest du dir bewusst machen, wie denn so eine Service-Anwendung funktioniert.

    Egal was man mit dem Service macht (installieren, deinstallieren, ausführen) es wird immer die Anwendung gestartet und somit auch immer TMeinService.Create ausgeführt.

    Während der Installation/Deinstallation ist es aber wohl eher kontraproduktiv, wenn dann schon die Teile ausgeführt werden, die eigentlich nur dann laufen sollen, wenn der Service läuft.

    Ja das stimmt, aber in meinem Fall war das jetzt nicht schlimm. Aber warum wird mein Timer-Event nicht ausgeführt? Der Timer ist "enabled" und auf ein Intervall von 3000 eingestellt. Wenn der Service installiert und gestartet ist, wird das Timer-Event kein einziges Mal ausgeführt. Wenn ich den Service mit dem "Run"-Befehl in Delphi starte, so wird das Timer-Event zumindest ein Mal gestartet, bevor der Dienst schließlich beendet wird.