Dienststatusübergänge
Ein Dienst ist für das Melden von Änderungen in seinem Zustand an den Dienststeuerungs-Manager (Service Control Manager, SCM) verantwortlich. Dienststeuerungsprogramme und das System können den Status eines Diensts nur aus dem SCM herausfinden, daher ist es wichtig, dass ein Dienst seinen Zustand korrekt meldet. Ein Dienst meldet seinen Status durch Aufrufen der SetServiceStatus--Funktion mit einem Zeiger auf eine vollständig initialisierte SERVICE_STATUS Struktur. Das dwCurrentState- Mitglied 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 techniken ab, die in ServiceMain Functionbeschrieben sind. Nachdem der Dienst seine Initialisierung abgeschlossen hat und bereit ist, mit dem Empfang von Steuerelementanforderungen zu beginnen, ruft der Dienst SetServiceStatus- auf, um SERVICE_RUNNING zu melden und die Steuerelementanforderungen anzugeben, die der Dienst akzeptiert. Der Übergang von SERVICE_START_PENDING zu SERVICE_RUNNING weist auf die SCM- und Dienstüberwachungstools hin, die der Dienst erfolgreich gestartet hat. Wenn der Dienst einen anderen Status als SERVICE_RUNNING meldet, markieren die SCM- oder Dienstüberwachungstools den Dienst möglicherweise als fehlgeschlagen.
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- Element der SERVICE_STATUS-Struktur. Informationen zum Registrieren zum Empfangen von Geräteereignissen finden Sie in der funktion RegisterDeviceNotification.
Der Dienststatus ändert sich in der Regel aufgrund der Verarbeitung einer Steuerelementanforderung. Steuerelementanforderungen, die dazu führen, dass sich der Dienststatus ändert, umfassen SERVICE_CONTROL_STOP, SERVICE_CONTROL_PAUSE und SERVICE_CONTROL_CONTINUE. Wenn der Dienst eine lange Verarbeitung durchführen muss, um eine dieser Anforderungen zu verarbeiten, sollte ein sekundärer Thread erstellt werden, um die langwierige Verarbeitung durchzuführen und den entsprechenden ausstehenden Zustand an den SCM zu melden. (Für eine optimale Leistung in Windows Vista und höheren Versionen von Windows sollte der Dienst einen Arbeitsthread aus einem Threadpool verwenden, zu diesem Zweck.) Der Dienst sollte dann den abgeschlossenen Zustandsübergang melden, wenn die lange 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.
Der dienststatus, der dem SCM gemeldet wurde, bestimmt, wie der SCM mit dem Dienst interagiert. Wenn beispielsweise ein Dienst SERVICE_STOP_PENDING meldet, überträgt der SCM keine weiteren Kontrollanforderungen an den Dienst, da dieser Zustand angibt, dass der Dienst heruntergefahren wird. Der vom Dienst gemeldete nächste Zustand 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.
Im folgenden Diagramm werden Dienststatusübergänge ausführlicher dargestellt, einschließlich der von einem Dienststeuerungsprogramm (dem Dienstclient) initiierten Steuerelementanforderungen und der SetServiceStatus- Aufrufe, die ein Dienst zum Melden von Statusänderungen an das SCM vorgibt. Wie bereits erwähnt, sendet der SCM nur Steuerelementanforderungen, die der Dienst angegeben hat, dass er akzeptiert, sodass ein Dienst möglicherweise nicht alle im Diagramm angezeigten Anforderungen empfängt.
Verwandte Themen