2009-07-28 9 views
1

Ich rufe die RegisterEventSource() -Funktion während meines Dienststopps auf. Aber es gibt während des Herunterfahrens des Systems null zurück. Gibt es einen Grund für dieses Verhalten?RegisterEventSource-Methode, die beim Herunterfahren von Windows 'null' zurückgibt

Fehler: Ich bekomme Fehlercode 0x800706b5 auf GetLastError() Wenn gegoogelt, kam ich zu wissen, dass es etwas mit fehlenden Registrierungsdaten zu tun hat.

Wie kann ich überprüfen, ob das System heruntergefahren wurde? (das ist äquivalent zu HasShutdownStarted() in C#)

Antwort

3

Dienste können angeben, ob sie benachrichtigt werden, wenn das System herunterfährt. Rufen Sie SetServiceStatus() mit SERVICE_ACCEPT_SHUTDOWN Flag auf. Sie erhalten dann die Nachricht SERVICE_CONTROL_SHUTDOWN in Ihrem Service Control-Meldungshandler.

EDIT: Wenn tatsächlich, wie Zach vorschlägt, das Problem, das Sie mit RegisterEventSource haben, ist, weil der Ereignisdienst bereits heruntergefahren hat, Ihre Ereignisprotokollschreibvorgänge in Reaktion auf diese Benachrichtigung können dieses Problem auch beheben.

+0

+1 Ich mag diese Lösung besser als Einrichten einer Dienstabhängigkeit, gibt es mehr Kontrolle. Als Antwort auf die Nachricht erhalten Sie die Möglichkeit, Ihren Dienst ordnungsgemäß zu beenden. –

2

Ich kann nur raten, warum RegisterEventSource während des Herunterfahrens des Systems null zurückgeben würde, da ich nie dieses Verhalten habe. [Haftungsausschluss: Ich habe meine Win32-Programmierungstage vor langer Zeit hinter mir gelassen, jetzt 100% .NET].

Ich konnte auch nicht den Fehlercode 0x800706b5 in einer beliebigen .h-Datei finden, auf die ich vom neuesten SDK zugreifen kann.

Könnte es sein, dass der Windows-Ereignisdienst während eines Systemabschlusses vor dem Dienst heruntergefahren wurde?

Sie könnten versuchen, eine Abhängigkeit zwischen Ihrem Dienst und dem Windows-Ereignisdienst einzurichten. Dies sollte sicherstellen, dass während eines Systemabschlusses Ihr Dienst zuerst heruntergefahren wird. Ironischerweise war der beste Ratschlag, wie ich das tun könnte, von Adobe: How to create a dependency between Windows services.

Verwandte Themen