![]() |
Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
ah alles klar, ich möchte auch kakein dienst erstlelen, war nur mal so ne frage *G*
|
Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
Hi,
erstmal vielen Dank für dieses TUT. Hat mir auf jeden Fall super weitergeholfen. Mein Problem jedoch ist, wenn ich den Service installiert habe und starte, startet er meine Anwendung (ShellExecute in der ServiceStart-Prozedur), aber der Status in der Dienste verwaltung ändert sich nicht. Es steht zwar, dass der Dienst gestartet ist, aber ich habe nicht die Möglichkeit ihn wieder zu beenden. Was mache ich denn noch falsch? Wird der Status nicht über 'started := true' übergeben? Hoffe, Ihr könnt mir weiterhelfen!
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, shellAPI, tlhelp32; type TTestService = 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 TestService: TTestService; ProgHandle, RemoteHandle: THandle; implementation {$R *.DFM} procedure ServiceController(CtrlCode: DWord); stdcall; begin TestService.Controller(CtrlCode); end; function TTestService.GetServiceController: TServiceController; begin Result := ServiceController; end; procedure TTestService.ServiceAfterInstall(Sender: TService); begin showMessage('AfterInstall'); end; procedure TTestService.ServiceAfterUninstall(Sender: TService); begin showMessage('AfterUninstall'); end; procedure TTestService.ServiceBeforeInstall(Sender: TService); begin showMessage('BeforeInstall'); end; procedure TTestService.ServiceBeforeUninstall(Sender: TService); begin showMessage('BeforeUninstall'); end; procedure TTestService.ServiceContinue(Sender: TService; var Continued: Boolean); begin showMessage('OnContinue'); Continued := True; end; procedure TTestService.ServiceCreate(Sender: TObject); begin showMessage('OnCreate'); ServiceExecute(self); end; procedure TTestService.ServiceDestroy(Sender: TObject); begin showMessage('OnDestroy'); end; procedure TTestService.ServiceExecute(Sender: TService); begin showMessage('OnExecute - begin'); { while not Terminated do begin ServiceThread.ProcessRequests(False); end; } showMessage('OnExecute - end'); end; procedure TTestService.ServicePause(Sender: TService; var Paused: Boolean); begin showMessage('OnPause'); Paused := True; end; procedure TTestService.ServiceShutdown(Sender: TService); begin showMessage('OnShutdown'); end; procedure TTestService.ServiceStart(Sender: TService; var Started: Boolean); begin ShellExecute(ProgHandle, 'open', PChar('notepad.exe'), Nil, Nil, SW_NORMAL); // showMessage('OnStart'); Started := True; end; procedure TTestService.ServiceStop(Sender: TService; var Stopped: Boolean); begin RemoteHandle := FindWindow(NIL,'unbenannt - Editor'); if RemoteHandle<>0 then PostMessage(RemoteHandle, wm_close, 1, 1); // showMessage('OnStop'); Stopped := True; end; end. |
Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
Zitat:
|
Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
Erstmal vielen Dank für das Tutorial :thumb:
Zitat:
Delphi-Quellcode:
Nun wartet ProcessRequest auf die nächste Message, bevor es weitergeht. Da man ja eh mit dem Timer auf genau eine solche wartet, empfiehlt sich das.
ServiceThread.ProcessRequests(True);
Ansonsten muss man zu mindestens irgendetwas tun, um die Endlosschleife zu entschärfen (sleep?!) Noch eine weitere Frage: Kann ich auch irgendwie komfortabel eine Beschreibung definieren, die in Systemsteuerung -> Verwaltung -> Dienste angezeigt wird? Gruß Malte PS: Ich hoffe ich darf den Thread nach so langer Zeit noch aufwärmen... |
Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
mit der Funktion ChangeServiceConfig2A kannst du die Beschreibung ändern
Delphi-Quellcode:
function ChangeServiceConfig2A(hService: HWND; dwInfoLevel: DWord; lpInfo: Pointer): BOOL; stdcall; external 'advapi32.dll';
[...] var lDescription : TSERVICE_DESCRIPTION; lManager, lServiceHandle : Cardinal; begin lManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); if (lManager <> 0) then begin lServiceHandle := OpenService(lManager, 'NameDeinesService'{bei Ableitung von TService wäre das: PChar(Self.Name)}, SERVICE_ALL_ACCESS); if (lServiceHandle <> 0) then begin lDescription.lpDescription := 'Deine Beschreibung'; ChangeServiceConfig2A(lServiceHandle, SERVICE_CONFIG_DESCRIPTION, @lDescription); CloseServiceHandle(lServiceHandle); end; CloseServiceHandle(lManager); end; |
Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
@SirThornberry: Das sieht doch ganz gut aus, aber...
Ich habe jetzt die Unit Winsvc eingebunden und mir den Typ TSERVICE_DESCRIPTION mithilfe des PSDKs zusammengebastelt:
Delphi-Quellcode:
Aber die Konstante SERVICE_CONFIG_DESCRIPTION kann ich nirgendwo finden :gruebel:
type
PServiceDescription = ^TServiceDescription; {$EXTERNALSYM _SERVICE_DESCRIPTION} _SERVICE_DESCRIPTION = record lpDescription: LPTSTR; end; {$EXTERNALSYM SERVICE_DESCRIPTION} SERVICE_DESCRIPTION = _SERVICE_DESCRIPTION; TServiceDescription = _SERVICE_DESCRIPTION; Gruß Malte |
Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
Es wird hier häufig geschrieben, dass der Dienst möglichst nicht interaktiv sein sollte.
Nun wie kann ich dennoch etwas für den Benutzer ausgeben? Mir schwebt ein Konzept vor, dass im Autostart sozusagen das Frontend (eine stinknormale exe) gestartet wird. Aber ich weiß jetzt nicht wie man das machen könnte. MfG xZise |
Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
Das ist auch der zugehende Weg. Du musst entweder per Netzprotokoll oder durch Pipes, IPC o.ä. mit dem Dienst kommunizieren.
|
Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
Wenn es nur um einfache Ausgabe geht, kann man auch die Messagebox mit MB_SERVICE_NOTIFICATION verwenden.
|
Re: Wie erstelle ich einen Dienst für WinNT / Win2000 / Win
Zitat:
Nun eine ganz andere Frage zu der Schleife. Und zwar erstelle ich eine UDP-Verbindung mithilfe von UdpSockUtil. Nun weiß ich nicht, wie ich die Schleife gestalten muss, weil das Pollen übernimmt ja die Komponente. Aber der Dienst wird ja ohne "Aufgaben" beendet. Kann man irgendwo sagen: "KillOnIdle := false"? ^^ MfG xZise |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:40 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