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)
如果您的服务编码正确,则无法接受关机和预关机.文档明确说明了这一点.
来自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,因为如果没有后者,服务将无法停止(例如,为了卸载软件),并且必须强制终止(即杀死)进程.