我使用 C++ 编写了一个本地服务应用程序,但我找不到注册预关机通知的正确方法(适用于 Windows XP 之后的操作系统)。我相信自 Vista 以来已经添加了 SERVICE_CONTROL_PRESHUTDOWN 通知,但是当您调用 SetServiceStatus 时我们是否需要指定:
dwServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_PRESHUTDOWN;
或
dwServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PRESHUTDOWN;
最佳答案
如果您的服务编码正确,您不能同时接受关闭和预关闭。文档明确说明了这一点。
来自 http://msdn.microsoft.com/en-us/library/windows/desktop/ms683241(v=vs.85).aspx :
引用 SERVICE_CONTROL_PRESHUTDOWN
:
A service that handles this notification blocks system shutdown until the service stops or the preshutdown time-out interval specified through SERVICE_PRESHUTDOWN_INFO expires.
在同一页面中,有关SERVICE_CONTROL_SHUTDOWN
的部分添加:
Note that services that register for SERVICE_CONTROL_PRESHUTDOWN notifications cannot receive this notification because they have already stopped.
因此,正确的方法是根据您的需要将 dwControlsAccepted
设置为包含 SERVICE_ACCEPT_SHUTDOWN
或 SERVICE_ACCEPT_PRESHUTDOWN
,但不能同时包含两者同时。
但请注意,您可能想要接受更多控件。您应该始终至少允许SERVICE_CONTROL_INTERROGATE
,并且几乎肯定允许SERVICE_CONTROL_STOP
,因为没有后者,服务无法停止(例如,为了卸载软件)和进程将不得不被强制终止(即杀死)。
关于c++ - 从 C++ 注册预关机通知的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13329254/