LPHANDLER_FUNCTION_EX Rückruffunktion (winsvc.h)
Eine anwendungsdefinierte Rückruffunktion, die mit der Funktion RegisterServiceCtrlHandlerEx verwendet wird. Ein Dienstprogramm kann es als Steuerelementhandlerfunktion eines bestimmten Diensts verwenden.
Der typ LPHANDLER_FUNCTION_EX definiert einen Zeiger auf diese Funktion. HandlerEx ist ein Platzhalter für den anwendungsdefinierten Namen.
Diese Funktion ersetzt die Handler-Steuerelementhandlerfunktion, die mit der Funktion RegisterServiceCtrlHandler verwendet wird. Ein Dienst kann entweder steuerelementhandler verwenden, aber der neue Steuerelementhandler unterstützt benutzerdefinierte Kontextdaten und zusätzliche erweiterte Steuerelementcodes.
Syntax
LPHANDLER_FUNCTION_EX LphandlerFunctionEx;
DWORD LphandlerFunctionEx(
[in] DWORD dwControl,
[in] DWORD dwEventType,
[in] LPVOID lpEventData,
[in] LPVOID lpContext
)
{...}
Parameter
[in] dwControl
Der Steuerelementcode. Dieser Parameter kann einen der folgenden Werte annehmen.
Steuerelementcode | Bedeutung |
---|---|
|
Benachrichtigt einen angehaltenen Dienst, dass er fortgesetzt werden soll. |
|
Benachrichtigt einen Dienst, um seine aktuellen Statusinformationen an den Dienststeuerungs-Manager zu melden.
Der Handler sollte einfach NO_ERROR zurückgeben; der SCM ist über den aktuellen Status des Diensts informiert. |
|
Benachrichtigt einen Netzwerkdienst, dass eine neue Komponente für die Bindung vorhanden ist. Der Dienst sollte an die neue Komponente gebunden werden.
Anwendungen sollten stattdessen Plug & Play Funktionalität verwenden. |
|
Benachrichtigt einen Netzwerkdienst, dass eine seiner Bindungen deaktiviert wurde. Der Dienst sollte seine Bindungsinformationen erneut lesen und die Bindung entfernen.
Anwendungen sollten stattdessen Plug & Play Funktionalität verwenden. |
|
Benachrichtigt einen Netzwerkdienst, dass eine deaktivierte Bindung aktiviert wurde. Der Dienst sollte seine Bindungsinformationen erneut lesen und die neue Bindung hinzufügen.
Anwendungen sollten stattdessen Plug & Play Funktionalität verwenden. |
|
Benachrichtigt einen Netzwerkdienst, dass eine Komponente für die Bindung entfernt wurde. Der Dienst sollte seine Bindungsinformationen erneut lesen und aus der entfernten Komponente aufgehoben werden.
Anwendungen sollten stattdessen Plug & Play Funktionalität verwenden. |
|
Benachrichtigt einen Dienst, der dienstspezifische Startparameter geändert hat. Der Dienst sollte seine Startparameter erneut lesen. |
|
benachrichtigt einen Dienst, der angehalten werden soll. |
|
Benachrichtigt einen Dienst, dass das System heruntergefahren wird. Dienste, die zusätzliche Zeit benötigen, um Bereinigungsaufgaben außerhalb der engen Zeiteinschränkung beim Herunterfahren des Systems auszuführen, können diese Benachrichtigung verwenden. Der Dienststeuerungs-Manager sendet diese Benachrichtigung an Anwendungen, die sich für diese Benachrichtigung registriert haben, bevor eine SERVICE_CONTROL_SHUTDOWN Benachrichtigung an Anwendungen gesendet wird, die sich für diese Benachrichtigung registriert haben.
Ein Dienst, der das Herunterfahren des Systems blockiert, bis der Dienst beendet wird, oder das über SERVICE_PRESHUTDOWN_INFO angegebene Timeoutintervall vor dem Auslaufen. Da sich dies auf die Benutzererfahrung auswirkt, sollten Dienste dieses Feature nur verwenden, wenn es unbedingt erforderlich ist, Datenverluste oder erhebliche Wiederherstellungszeit beim nächsten Systemstart zu vermeiden. Windows Server 2003 und Windows XP: Dieser Wert wird nicht unterstützt. |
|
Benachrichtigt einen Dienst, dass das System heruntergefahren wird, damit der Dienst Bereinigungsaufgaben ausführen kann. Beachten Sie, dass Dienste, die sich für SERVICE_CONTROL_PRESHUTDOWN Benachrichtigungen registrieren, diese Benachrichtigung nicht erhalten können, da sie bereits beendet wurden.
Wenn ein Dienst diesen Steuerelementcode akzeptiert, muss er beendet werden, nachdem er seine Bereinigungsaufgaben ausführt und NO_ERROR zurückgibt. Nachdem der SCM diesen Steuerelementcode gesendet hat, sendet er keine anderen Steuerelementcodes an den Dienst. Weitere Informationen finden Sie im Abschnitt "Hinweise" dieses Themas. |
|
benachrichtigt einen Dienst, der beendet werden soll.
Wenn ein Dienst diesen Steuerelementcode akzeptiert, muss er nach Erhalt beenden und NO_ERROR zurückgeben. Nachdem der SCM diesen Steuerelementcode gesendet hat, sendet er keine anderen Steuerelementcodes an den Dienst. Windows XP: Wenn der Dienst NO_ERROR zurückgibt und weiterhin ausgeführt wird, empfängt er weiterhin Steuerelementcodes. Dieses Verhalten wurde ab Windows Server 2003 und Windows XP mit SP2 geändert. |
Dieser Parameter kann auch eine der folgenden erweiterten Steuerelementcodes sein. Beachten Sie, dass diese Steuerelementcodes von der Handler-Funktion nicht unterstützt werden.
Steuerungscode | Bedeutung |
---|---|
|
Benachrichtigt einen Dienst von Geräteereignissen. (Der Dienst muss registriert sein, um diese Benachrichtigungen mithilfe der Funktion RegisterDeviceNotification zu erhalten.) Die Parameter dwEventType und lpEventData enthalten zusätzliche Informationen. |
|
Benachrichtigt einen Dienst, den das Hardwareprofil des Computers geändert hat. Der dwEventType-Parameter enthält zusätzliche Informationen. |
|
Benachrichtigt einen Dienst von Systemleistungsereignissen. Der dwEventType-Parameter enthält zusätzliche Informationen. Wenn dwEventTypePBT_POWERSETTINGCHANGE ist, enthält der parameter lpEventData auch zusätzliche Informationen. |
|
Benachrichtigt einen Dienst der Sitzungsänderungsereignisse. Beachten Sie, dass ein Dienst nur über die Anmeldung eines Benutzers benachrichtigt wird, wenn er vollständig geladen wird, bevor der Anmeldeversuch durchgeführt wird. Die Parameter dwEventType und lpEventData enthalten zusätzliche Informationen. |
|
Benachrichtigt einen Dienst, dass sich die Systemzeit geändert hat. Der parameter lpEventData enthält zusätzliche Informationen. Der dwEventType-Parameter wird nicht verwendet.
Windows Server 2008, Windows Vista, Windows Server 2003 und Windows XP: Dieser Steuerelementcode wird nicht unterstützt. |
|
Benachrichtigt einen Dienst, der für ein Dienstauslöserereignis registriert ist, das das Ereignis aufgetreten ist.
Windows Server 2008, Windows Vista, Windows Server 2003 und Windows XP: Dieser Steuerelementcode wird nicht unterstützt. |
|
Benachrichtigt einen Dienst, den der Benutzer ein Neustart initiiert hat.
Windows Server 2008 R2, Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003 und Windows XP: Dieser Steuerelementcode wird nicht unterstützt. |
Dieser Parameter kann auch ein benutzerdefinierter Steuerelementcode sein, wie in der folgenden Tabelle beschrieben.
Steuerelementcode | Bedeutung |
---|---|
|
Der Dienst definiert die Aktion, die dem Steuerelementcode zugeordnet ist. |
[in] dwEventType
Der Typ des Ereignisses, das aufgetreten ist. Dieser Parameter wird verwendet, wenn dwControlSERVICE_CONTROL_DEVICEEVENT, SERVICE_CONTROL_HARDWAREPROFILECHANGE, SERVICE_CONTROL_POWEREVENT oder SERVICE_CONTROL_SESSIONCHANGE ist. Andernfalls ist es null.
Wenn dwControlSERVICE_CONTROL_DEVICEEVENT ist, kann dieser Parameter eine der folgenden Werte sein:
- DBT_DEVICEARRIVAL
- DBT_DEVICEREMOVECOMPLETE
- DBT_DEVICEQUERYREMOVE
- DBT_DEVICEQUERYREMOVEFAILED
- DBT_DEVICEREMOVEPENDING
- DBT_CUSTOMEVENT
Wenn dwControlSERVICE_CONTROL_SESSIONCHANGE ist, kann dieser Parameter eine der Werte sein, die im wParam-Parameter der WM_WTSSESSION_CHANGE-Nachricht angegeben sind.
[in] lpEventData
Weitere Geräteinformationen, falls erforderlich. Das Format dieser Daten hängt vom Wert der dwControl - und dwEventType-Parameter ab.
Wenn dwControlSERVICE_CONTROL_DEVICEEVENT ist, entspricht diese Daten dem lParam-Parameter , den Anwendungen als Teil einer WM_DEVICECHANGE Nachricht empfangen.
Wenn dwControl SERVICE_CONTROL_POWEREVENT ist und dwEventTypePBT_POWERSETTINGCHANGE ist, ist diese Daten ein Zeiger auf eine POWERBROADCAST_SETTING Struktur.
Wenn dwControlSERVICE_CONTROL_SESSIONCHANGE ist, ist dieser Parameter ein Zeiger auf eine WTSSESSION_NOTIFICATION Struktur.
Wenn dwControlSERVICE_CONTROL_TIMECHANGE ist, ist diese Daten ein Zeiger auf eine SERVICE_TIMECHANGE_INFO Struktur.
[in] lpContext
Benutzerdefinierte Daten, die von RegisterServiceCtrlHandlerEx übergeben wurden. Wenn mehrere Dienste einen Prozess freigeben, kann der lpContext-Parameter den Dienst identifizieren.
Rückgabewert
Der Rückgabewert für diese Funktion hängt vom empfangenen Steuerelementcode ab.
In der folgenden Liste werden die Regeln für diesen Rückgabewert identifiziert:
- Wenn Ihr Dienst das Steuerelement nicht behandelt, geben Sie ERROR_CALL_NOT_IMPLEMENTED zurück. Ihr Dienst sollte jedoch NO_ERROR für SERVICE_CONTROL_INTERROGATE zurückgeben, auch wenn Ihr Dienst sie nicht behandelt.
- Wenn Ihr Dienst SERVICE_CONTROL_STOP oder SERVICE_CONTROL_SHUTDOWN behandelt, geben Sie NO_ERROR zurück.
- Wenn Ihr Dienst SERVICE_CONTROL_DEVICEEVENT behandelt, geben Sie NO_ERROR zurück, um die Anforderung und einen Fehlercode zu gewähren, um die Anforderung zu verweigern.
- Wenn Ihr Dienst SERVICE_CONTROL_HARDWAREPROFILECHANGE behandelt, geben Sie NO_ERROR zurück, um die Anforderung und einen Fehlercode zu gewähren, um die Anforderung zu verweigern.
- Wenn Ihr Dienst SERVICE_CONTROL_POWEREVENT behandelt, geben Sie NO_ERROR zurück, um die Anforderung und einen Fehlercode zu erteilen, um die Anforderung zu verweigern.
- Geben Sie für alle anderen Steuerelementcodes, die Ihre Diensthandpunkte behandeln, NO_ERROR zurück.
Hinweise
Wenn ein Dienst gestartet wird, sollte seine ServiceMain-Funktion sofort die RegisterServiceCtrlHandlerEx-Funktion aufrufen, um eine HandlerEx-Funktion zum Verarbeiten von Steuerelementanforderungen anzugeben. Um die zu akzeptierenden Steuerelementcodes anzugeben, verwenden Sie die Funktionen "SetServiceStatus " und "RegisterDeviceNotification ".
Der Steuerelement-Dispatcher im Hauptthread eines Diensts ruft die Steuerelementhandlerfunktion für den angegebenen Dienst auf, wenn er eine Steuerelementanforderung vom Dienststeuerelement-Manager empfängt. Nach der Verarbeitung der Steuerelementanforderung muss der Steuerelementhandler SetServiceStatus aufrufen, wenn sich der Dienststatus ändert, um seinen neuen Status dem Dienststeuerungs-Manager zu melden.
Die Steuerelementhandlerfunktion soll Benachrichtigungen empfangen und sofort zurückgeben. Die Rückruffunktion sollte die Parameter speichern und andere Threads erstellen, um zusätzliche Arbeit auszuführen. (Ihre Anwendung muss sicherstellen, dass solche Threads beendet wurden, bevor Sie den Dienst beenden.) Insbesondere sollte ein Steuerelementhandler Vorgänge vermeiden, die blockiert werden könnten, z. B. das Ausführen einer Sperrung, da dies zu einem Deadlock führen könnte oder dazu führt, dass das System nicht mehr reagiert.
Wenn der Dienststeuerungs-Manager einen Steuerelementcode an einen Dienst sendet, wartet er darauf, dass die Handlerfunktion zurückgegeben wird, bevor zusätzliche Steuerelementcodes an andere Dienste gesendet werden. Der Steuerelementhandler sollte so schnell wie möglich zurückgegeben werden; wenn es innerhalb von 30 Sekunden nicht zurückgegeben wird, gibt der SCM einen Fehler zurück. Wenn ein Dienst eine lange Verarbeitung durchführen muss, wenn der Dienst den Steuerelementhandler ausführt, sollte ein sekundärer Thread erstellt werden, um die lange Verarbeitung auszuführen und dann aus dem Steuerelementhandler zurückzugeben. Dadurch wird verhindert, dass der Dienst den Kontrollverteiler verbindet und andere Dienste vor dem Empfang von Kontrollcodes blockiert.
Der SERVICE_CONTROL_SHUTDOWN-Steuerelementcode sollte nur von Diensten verarbeitet werden, die während des Herunterfahrens absolut bereinigen müssen, da es eine begrenzte Zeit (etwa 20 Sekunden) für das Herunterfahren des Diensts verfügbar ist. Nach Ablauf dieser Zeit wird das Systemabfahren unabhängig davon fortgesetzt, ob das Herunterfahren des Diensts abgeschlossen ist. Beachten Sie, dass das System im herunterfahrenden Zustand (nicht neu gestartet oder heruntergefahren) bleibt, dass der Dienst weiterhin ausgeführt wird. Wenn ihr Dienst SERVICE_CONTROL_SHUTDOWN akzeptiert, muss er den Steuerelementcode behandeln und NO_ERROR zurückgeben. Wenn Sie einen Fehler für diesen Steuerelementcode zurückgeben und nicht rechtzeitig beenden können, kann die Zeit erhöht werden, die erforderlich ist, um das System herunterzufahren, da das System auf die vollständige Zeit warten muss, die für das Herunterfahren des Diensts zulässig ist, bevor das System herunterfahren kann.
Wenn der Dienst mehr Zeit zum Bereinigen benötigt, sollte es STOP_PENDING Statusnachrichten zusammen mit einem Wartenhinweis senden, sodass der Dienstcontroller weiß, wie lange gewartet werden soll, bevor er an das System meldet, dass das Herunterfahren des Diensts abgeschlossen ist. Um jedoch zu verhindern, dass ein Dienst das Herunterfahren beendet, gibt es einen Grenzwert, wie lange der Dienstcontroller wartet. Wenn der Dienst über das Services-Snap-In heruntergefahren wird, beträgt der Grenzwert 125 Sekunden. Wenn das Betriebssystem neu gestartet wird, wird der Zeitlimit im WaitToKillServiceTimeout-Wert des folgenden Registrierungsschlüssels angegeben:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
Achten Sie darauf, Plug & Play Geräteereignisse so schnell wie möglich zu behandeln. Andernfalls wird das System möglicherweise nicht mehr verfügbar. Wenn der Ereignishandler einen Vorgang ausführen soll, der die Ausführung blockieren kann (z. B. I/O), empfiehlt es sich, einen anderen Thread zu starten, um den Vorgang asynchron auszuführen.
Dienste können auch die Funktion "SetConsoleCtrlHandler " verwenden, um herunterfahrende Benachrichtigungen zu erhalten. Diese Benachrichtigung wird empfangen, wenn die ausgeführten Anwendungen heruntergefahren werden, was auftritt, bevor Dienste heruntergefahren werden.
Anforderungen
Unterstützte Mindestversion (Client) | Windows XP [nur Desktop-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2003 [nur Desktop-Apps] |
Zielplattform | Windows |
Kopfzeile | winsvc.h (enthalten Windows.h) |