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 den aktuellen Sperrstatus der Datenbank überprüfen, indem sie die QueryServiceLockStatus--Funktion aufruft.
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 StartService--Funktion wird zurückgegeben, nachdem ein neuer Thread erstellt wurde, um die ServiceMain--Funktion auszuführen. Das Dienststeuerungsprogramm kann den Status des neu gestarteten Diensts in einer SERVICE_STATUS Struktur abrufen, indem die QueryServiceStatus--Funktion aufgerufen wird. Während der Initialisierung sollte das dwCurrentState- Mitglied SERVICE_START_PENDING werden. Der dwWaitHint Member ist ein Zeitintervall in Millisekunden, das angibt, wie lange das Dienststeuerungsprogramm warten soll, bevor QueryServiceStatus erneut aufgerufen wird. Nach Abschluss der Initialisierung ändert sich der Dienst dwCurrentState- in SERVICE_RUNNING.
Der Dienststeuerungs-Manager unterstützt das Übergeben von benutzerdefinierten Umgebungsvariablen an einen Dienst beim Start nicht. Außerdem erkennt und übergibt der Dienststeuerungs-Manager änderungen an Umgebungsvariablen nicht, während der Dienst ausgeführt wird. Anstatt einen Dienst abhängig von einer Umgebungsvariable zu machen, verwenden Sie Registrierungswerte oder ServiceMain Argumente.
Im Folgenden finden Sie eine vereinfachte Übersicht darüber, was passiert, wenn ein typischer Dienst vom Dienststeuerungs-Manager gestartet wird:
- Der SCM liest den Dienstpfad aus der Registrierung und bereitet sich darauf vor, den Dienst zu starten. Dazu gehört auch der Erwerb der Dienstsperre. Jeder Versuch, einen anderen Dienst zu starten, während die Dienstsperre gehalten wird, wird blockiert, bis die Dienstsperre freigegeben wird.
- Der SCM startet den Prozess und wartet, bis der untergeordnete Prozess beendet wird (was einen Fehler angibt) oder den SERVICE_RUNNING Status meldet.
- Die Anwendung führt ihre sehr einfache Initialisierung durch und ruft die StartServiceCtrlDispatcher-Funktion auf.
- StartServiceCtrlDispatcher eine Verbindung mit dem Dienststeuerungs-Manager herstellt und einen zweiten Thread startet, der die ServiceMain-Funktion für den Dienst aufruft. ServiceMain- sollte SERVICE_RUNNING so bald wie möglich melden.
- Wenn der Dienststeuerungs-Manager benachrichtigt wird, dass der Dienst ausgeführt wird, wird die Dienstsperre freigegeben.
Wenn der Dienst seinen Status nicht innerhalb von 80 Sekunden aktualisiert, plus der letzte Wartehinweis, bestimmt 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 Dienst-.