c++ - 从 C++ 注册预关机通知的正确方法

标签 c++ winapi service notifications shutdown

我使用 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_SHUTDOWNSERVICE_ACCEPT_PRESHUTDOWN,但不能同时包含两者同时。

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

关于c++ - 从 C++ 注册预关机通知的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13329254/

相关文章:

c++ - 痛饮 Perl : wrong ELF class

java - Android jni 和 opencv 运行时无法加载库

winapi - 无法从启动时启动的应用程序打开 COM1

android - 检测我的无障碍服务是否启用

java - 什么会导致 Java ScheduleService 无法运行?

c++ - 具有完美转发的模板转换构造函数

c++ - 如何覆盖在 C++ 函数内部的另一个类中定义的虚方法

python - 从 Python 修改 Microsoft Outlook 联系人

c++ - WinAPI C++ 如何从 64 位应用程序加载资源

Java:如果 doOutput=false,则无法写入 URLConnection - 调用 setDoOutput(true)