Freigeben über


Dienststatusübergänge

Ein Dienst ist für die Meldung von Statusänderungen an den Dienststeuerungs-Manager (Service Control Manager, SCM) verantwortlich. Dienststeuerungsprogramme und das System können den Status eines Diensts nur über das SCM ermitteln, daher ist es wichtig, dass ein Dienst seinen Zustand korrekt meldet. Ein Dienst meldet seinen Zustand, indem er die SetServiceStatus-Funktion mit einem Zeiger auf eine vollständig initialisierte SERVICE_STATUS-Struktur aufruft. Der dwCurrentState-Member der -Struktur enthält den zu meldenden Dienststatus.

Der Anfangszustand eines Diensts ist SERVICE_STOPPED. Wenn der SCM den Dienst startet, legt er den Dienststatus auf SERVICE_START_PENDING fest und ruft die ServiceMain-Funktion des Diensts auf. Der Dienst schließt dann seine Initialisierung mit einer der unter Service ServiceMain Function beschriebenen Techniken ab. Nachdem der Dienst seine Initialisierung abgeschlossen hat und bereit ist, Steuerungsanforderungen zu empfangen, ruft der Dienst SetServiceStatus auf, um SERVICE_RUNNING zu melden und die Steuerelementanforderungen anzugeben, für die der Dienst bereit ist. Der Übergang von SERVICE_START_PENDING zu SERVICE_RUNNING gibt den SCM- und Dienstüberwachungstools an, dass der Dienst erfolgreich gestartet wurde. Wenn der Dienst einen anderen Zustand als SERVICE_RUNNING meldet, markieren die SCM- oder Dienstüberwachungstools den Dienst möglicherweise als nicht gestartet.

Der SCM sendet nur die angegebenen Steuerelementanforderungen an den Dienst (mit Ausnahme der SERVICE_CONTROL_INTERROGATE Anforderung, die immer gesendet wird). Eine Liste der Steuerelementanforderungen, die ein Dienst akzeptieren kann, finden Sie im dwControlsAccepted-Member der SERVICE_STATUS-Struktur . Informationen zum Registrieren zum Empfangen von Geräteereignissen finden Sie unter der RegisterDeviceNotification-Funktion .

Der Dienststatus ändert sich in der Regel durch die Behandlung einer Steuerelementanforderung. Steuerungsanforderungen, die dazu führen, dass sich der Dienststatus ändert, umfassen SERVICE_CONTROL_STOP, SERVICE_CONTROL_PAUSE und SERVICE_CONTROL_CONTINUE. Wenn der Dienst eine langwierige Verarbeitung durchführen muss, um eine dieser Anforderungen zu verarbeiten, sollte er einen sekundären Thread erstellen, um die langwierige Verarbeitung auszuführen, und den entsprechenden ausstehenden Zustand an den SCM melden. (Für eine optimale Leistung unter Windows Vista und höheren Versionen von Windows sollte der Dienst zu diesem Zweck einen Workerthread aus einem Threadpool verwenden.) Der Dienst sollte dann den abgeschlossenen Zustandsübergang melden, wenn die langwierige Verarbeitung abgeschlossen ist. Weitere Informationen zum Behandeln von Steuerelementanforderungen finden Sie unter Service Control Handler Function.

Nur bestimmte Dienststatusübergänge sind gültig. Das folgende Diagramm zeigt die gültigen Übergänge.

gültige Dienst-status-Übergänge

Der an den SCM gemeldete Dienststatus bestimmt, wie der SCM mit dem Dienst interagiert. Wenn beispielsweise ein Dienst SERVICE_STOP_PENDING meldet, überträgt der SCM keine weiteren Steuerungsanforderungen an den Dienst, da dieser Zustand angibt, dass der Dienst heruntergefahren wird. Der nächste vom Dienst gemeldete Status sollte SERVICE_STOPPED werden, da dies der einzige gültige Zustand nach SERVICE_STOP_PENDING ist. Wenn ein Dienst jedoch einen ungültigen Übergang meldet, schlägt der SCM den Aufruf nicht fehl.

Das folgende Diagramm zeigt Dienststatusübergänge ausführlicher, einschließlich der Von einem Dienststeuerungsprogramm (dienstclient) initiierten Steuerungsanforderungen und der SetServiceStatus-Aufrufe , die ein Dienst durchführt, um Zustandsänderungen an den SCM zu melden. Wie bereits erwähnt, sendet der SCM nur Steuerungsanforderungen, die der Dienst angegeben hat, akzeptiert, sodass ein Dienst möglicherweise nicht alle im Diagramm dargestellten Anforderungen empfängt.

Service status Übergänge im Detail

ControlService

ControlServiceEx

SetServiceStatus