从C++注册预关闭通知的正确方法

ahm*_*md0 4 c++ service winapi notifications shutdown

我使用C++编写本地服务应用程序,但我找不到正确的注册预关闭通知的方法(对于Windows之后的操作系统).我相信自Vista之后就添加了SERVICE_CONTROL_PRESHUTDOWN通知,但是当你调用SetServiceStatus时我们需要指定:

dwServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_PRESHUTDOWN;
Run Code Online (Sandbox Code Playgroud)

要么

dwServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PRESHUTDOWN;
Run Code Online (Sandbox Code Playgroud)

Nik*_*lis 7

如果您的服务编码正确,则无法接受关机和预关机.文档明确说明了这一点.

来自http://msdn.microsoft.com/en-us/library/windows/desktop/ms683241(v=vs.85).aspx:

请参阅SERVICE_CONTROL_PRESHUTDOWN:"处理此通知的服务会阻止系统关闭,直到服务停止或通过SERVICE_PRESHUTDOWN_INFO指定的preshutdown超时间隔到期为止."

在同一页面中,有关SERVICE_CONTROL_SHUTDOWN添加的部分:"请注意,注册SERVICE_CONTROL_PRESHUTDOWN通知的服务无法接收此通知,因为它们已停止."

因此,正确的方法是将dwControlsAccepted设置为包括SERVICE_ACCEPT_SHUTDOWN或SERVICE_ACCEPT_PRESHUTDOWN,具体取决于您的需要,但不能同时包含两者.

但请注意,您可能希望接受更多控件.您应该始终至少允许SERVICE_CONTROL_INTERROGATE,并且几乎肯定允许SERVICE_CONTROL_STOP,因为如果没有后者,服务将无法停止(例如,为了卸载软件),并且必须强制终止(即杀死)进程.

  • 在 SERVICE_STOP_PENDING 中,您不应该接受更多控制(除非您真的很迂腐,可能是“SERVICE_CONTROL_INTERROGATE”),因为您正在关闭,这是一种不可逆转的状态。在 SERVICE_START_PENDING 中同样适用 - 要么不接受任何内容,要么只接受“SERVICE_CONTROL_INTERROGATE”。但请注意,您的服务应该在“SERVICE_START_PENDING”中花费*​​最少的时间*,并且不要执行任何冗长/不必要的初始化。 (2认同)