![]() |
Wie erstelle ich einen Dienst für WinNT / Win2000 / Win XP
Ich habe in dem Beitrag
![]() Was ist ein Dienst? In WinNT/Win2000/WinXP (und neuer) gibt es die Möglichkeit Programme schon beim Starten des Betriebssystems, noch bevor sich ein Benutzer anmeldet, auszuführen. Diese Programme werden als Dienste (engl: Service) bezeichnet. Diese Dienste werden über die Diensteverwaltung gesteuert. Mit Systemsteuerung -> Verwaltung -> Dienste kommt man zur Diensteverwaltung. hier kann man sehen welche Dienste auf dem Rechner verfügbar sind. Es ist auch der Status und die Beschreibung zu sehen. (Von der Konsole (cmd.exe) kann man mit "net start" eine Liste der gestarteten Dienste sehen.) Wie erstellt man einen Dienst? Unter Delphi 7 geht das ganz einfach. (Ich habe gerade mal Delphi 5 gestartet, dort geht es auch.)
Zu jedem Dienst wird ein TServiceTread ausgeführt. (Es können auch mehrere Dienste in einer Exe enthalten sein.) Sollten mehrere Dienste in einer Applikation enthalten sein muss unbedingt threadsicher programmiert werden. Der TServiceThread ist so gestaltet, dass die Funktionalität des Dienstes in der OnExecute implementiert wird. Der TServiceThread hat seine eigene Execute Methode die OnStart und OnExecute aufruft.
Delphi-Quellcode:
Da die Ausführung der OnStart / OnExecute zeit braucht kann der Thread derweil nicht auf simultane Anfragen von anderen Clients reagieren. Deshalb kann man auch einen eigenen Thread erzeugen.
{*******************************************************}
{ Borland Delphi Visual Component Library } { Services } { Copyright (c) 1997,99 Inprise Corporation } {*******************************************************} unit SvcMgr; ... procedure TServiceThread.Execute; ... FService.Status := csStartPending; Started := True; if Assigned(FService.OnStart) then FService.OnStart(FService, Started); // wird Started in OnStart aud False gesetzt wird OnExecute nie aufgerufen if not Started then Exit; try FService.Status := csRunning; if Assigned(FService.OnExecute) then FService.OnExecute(FService) // onExecute aufrufen else ProcessRequests(True); ProcessRequests(False); ... Das würde dann so aussehen:
Delphi-Quellcode:
Das der TeigeneThread thadtsicher programmiert werden sollte versteht sich ja von selbst.
...
TeigenerThread = class(TThread) public procedure Execute; override; end; ... var eigenerThread: TeigenerThread; ... procedure TeigenerThread.Execute; begin while not Terminated do begin Beep; // Das braucht die Zeit, in der sonst der Dienst tot wäre. Sleep(500); end; end; ... procedure TService1.Service1Start(Sender: TService; var Started: Boolean); begin eigenerThread := TeigenerThread.Create(False); Started := True; end; ... procedure TService1.Service1Continue(Sender: TService; var Continued: Boolean); begin eigenerThread.Resume; Continued := True; end; ... procedure TService1.Service1Pause(Sender: TService; var Paused: Boolean); begin eigenerThread.Suspend; Paused := True; end; ... procedure TService1.Service1Stop(Sender: TService; var Stopped: Boolean); begin eigenerThread.Terminate; Stopped := True; end; ... Mein Tipp: Schreib dir mal einen Dienst, der in jedem Ereignis nur ein ShowMessage stehen hat. Damit kannst Du dann schnell rausbekommen wann welche Ereignisse aufgerufen werden. z.B.
Delphi-Quellcode:
Die erzeugte Exe Datei mußt Du Mit dem Parameter INSTALL aufrufen um den Dienst zu registrieren.
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs; type TService1 = class(TService) procedure ServiceAfterInstall(Sender: TService); procedure ServiceAfterUninstall(Sender: TService); procedure ServiceBeforeInstall(Sender: TService); procedure ServiceBeforeUninstall(Sender: TService); procedure ServiceContinue(Sender: TService; var Continued: Boolean); procedure ServiceCreate(Sender: TObject); procedure ServiceDestroy(Sender: TObject); procedure ServiceExecute(Sender: TService); procedure ServicePause(Sender: TService; var Paused: Boolean); procedure ServiceShutdown(Sender: TService); procedure ServiceStart(Sender: TService; var Started: Boolean); procedure ServiceStop(Sender: TService; var Stopped: Boolean); private { Private-Deklarationen } public function GetServiceController: TServiceController; override; { Public-Deklarationen } end; var Service1: TService1; implementation {$R *.DFM} procedure ServiceController(CtrlCode: DWord); stdcall; begin Service1.Controller(CtrlCode); end; function TService1.GetServiceController: TServiceController; begin Result := ServiceController; end; procedure TService1.ServiceAfterInstall(Sender: TService); begin showMessage('AfterInstall'); end; procedure TService1.ServiceAfterUninstall(Sender: TService); begin showMessage('AfterUninstall'); end; procedure TService1.ServiceBeforeInstall(Sender: TService); begin showMessage('BeforeInstall'); end; procedure TService1.ServiceBeforeUninstall(Sender: TService); begin showMessage('BeforeUninstall'); end; procedure TService1.ServiceContinue(Sender: TService; var Continued: Boolean); begin showMessage('OnContinue'); Continued := True; end; procedure TService1.ServiceCreate(Sender: TObject); begin showMessage('OnCreate'); end; procedure TService1.ServiceDestroy(Sender: TObject); begin showMessage('OnDestroy'); end; procedure TService1.ServiceExecute(Sender: TService); begin showMessage('OnExecute - begin'); while not Terminated do begin ServiceThread.ProcessRequests(False); end; showMessage('OnExecute - end'); end; procedure TService1.ServicePause(Sender: TService; var Paused: Boolean); begin showMessage('OnPause'); Paused := True; end; procedure TService1.ServiceShutdown(Sender: TService); begin showMessage('OnShutdown'); end; procedure TService1.ServiceStart(Sender: TService; var Started: Boolean); begin showMessage('OnStart'); Started := True; end; procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean); begin showMessage('OnStop'); Stopped := True; end; end. Mit Projekt1.exe UNINSTALL kannst Du den Dienst wieder aus der Diesteverwaltung entfernen. Ich hoffe das hilft Dir erst mal weiter. |
Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
Zitat:
![]() ![]() |
Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
Und mal als kleine Anmerkung nebenbei: die Komponenten
![]() Ansonsten: geiles Tutorial, MaBuSE. Werd ich mal ausprobieren. Könnte ich nämlich in einem meiner nächsten Projekte vielleicht gebrauchen... :) mfg, mh166 |
Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
Zitat:
Zitat:
Ansonsten hat Luckie Recht ;-) |
Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
Oh, aber nichts destotrotz sollte man meine Sicherheisthinweise beachten. Eventuell kannst du noch auf Ollis nonVCL NT Service Tutorial verweisen. Die Service Vorlage gibt es nämlich erst ab der Professional Version von Delphi.
Die Links: ![]() ![]() |
Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
Zitat:
![]() Dort steht auch wie man Dienste debuggt. (Ich habe den Teil mit den TeigenerThread an diesen Text angelehnt.) Es ist auch ein Beispiel in der Hilfe von Delphi vorhanden. Dieser Beispiel Dienst lauscht an Port 80 un loggt die Zugriffe in eine Textdatei. In der Delphi Hilfe nach "Service-Anwendungen" suchen. |
Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
Zitat:
|
Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
Noch was kleines zum Thema:
Erstellung eines Services mittels der Delphi-Vorlage (TService) hat eigentlich prima funktioniert. Auch das installieren mit PROGRAMMNAME /install bzw. /uninstall. Hat man allerdings den Dienst via InstallShield versucht zu installieren, hat das jedesmal einen Fehler 1053 nach sich geführt und der Dienst lies sich nicht installieren. Hab das jetzt auf Asserbads API-Gerüst gesetzt und siehe da - nun geht es auch mit Installshield. Hat mich dennoch ein wenig verwirrt und ich weiss noch nicht ganz, wem ich da jetz die Schuld in die Schuhe schieben soll ;) |
Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
Zitat:
|
Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
Zitat:
...:cat:... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz