Dienststart
Um einen Dienst- oder Treiberdienst zu starten, verwendet das Dienststeuerungsprogramm die StartService-Funktion . Die StartService-Funktion schlägt fehl, wenn die Datenbank gesperrt ist. In diesem Fall sollte das Dienststeuerungsprogramm einige Sekunden warten und StartService erneut aufrufen. Sie kann die aktuelle status der Datenbank überprüfen, indem die QueryServiceLockStatus-Funktion aufgerufen wird.
Wenn das Dienststeuerungsprogramm einen Dienst startet, kann es die StartService-Funktion verwenden, um ein Array von Argumenten anzugeben, die an die ServiceMain-Funktion des Diensts übergeben werden sollen. Die Funktion StartService gibt zurück, nachdem ein neuer Thread erstellt wurde, um die ServiceMain-Funktion auszuführen. Das Dienststeuerungsprogramm kann die status des neu gestarteten Diensts in einer SERVICE_STATUS-Struktur abrufen, indem die QueryServiceStatus-Funktion aufgerufen wird. Während der Initialisierung sollte der dwCurrentState-Member SERVICE_START_PENDING werden. Das dwWaitHint-Element ist ein Zeitintervall in Millisekunden, das angibt, wie lange das Dienststeuerungsprogramm warten soll, bevor QueryServiceStatus erneut aufgerufen wird. Nach Abschluss der Initialisierung ändert der Dienst dwCurrentState in SERVICE_RUNNING.
Der Dienststeuerungs-Manager unterstützt das Übergeben benutzerdefinierter Umgebungsvariablen an einen Dienst beim Start nicht. Außerdem erkennt der Dienststeuerungs-Manager keine Änderungen an Umgebungsvariablen, während der Dienst ausgeführt wird. Anstatt einen Dienst von einer Umgebungsvariablen abhängig zu machen, verwenden Sie Registrierungswerte oder ServiceMain-Argumente .
Im Folgenden finden Sie eine vereinfachte Übersicht darüber, was geschieht, wenn ein typischer Dienst vom Dienststeuerungs-Manager gestartet wird:
- Der SCM liest den Dienstpfad aus der Registrierung und bereitet den Start des Diensts vor. Dies schließt den Erwerb der Dienstsperre ein. Jeder Versuch, einen anderen Dienst zu starten, während die Dienstsperre beibehalten wird, wird blockiert, bis die Dienstsperre aufgehoben wird.
- Der SCM startet den Prozess und wartet, bis entweder der untergeordnete Prozess beendet wird (was auf einen Fehler hinweist) oder den SERVICE_RUNNING status meldet.
- Die Anwendung führt ihre sehr einfache Initialisierung durch und ruft die Funktion StartServiceCtrlDispatcher auf.
- StartServiceCtrlDispatcher stellt eine Verbindung mit dem Dienststeuerungs-Manager her und startet einen zweiten Thread, der die ServiceMain-Funktion für den Dienst aufruft. ServiceMain sollte SERVICE_RUNNING so schnell wie möglich melden.
- Wenn der Dienststeuerungs-Manager benachrichtigt wird, dass der Dienst ausgeführt wird, wird die Dienstsperre freigegeben.
Wenn der Dienst seine status nicht innerhalb von 80 Sekunden aktualisiert, plus dem letzten Wartehinweis, ermittelt der Dienststeuerungs-Manager, dass der Dienst nicht mehr reagiert. Der Dienststeuerungs-Manager protokolliert ein Ereignis und beendet den Dienst.
Wenn das Programm einen Treiberdienst startet, wird StartService zurückgegeben, nachdem der Gerätetreiber seine Initialisierung abgeschlossen hat.
Weitere Informationen finden Sie unter Starten eines Diensts.