c++ - 如何将 PreShutdown 事件添加到 ATL 服务?

标签 c++ winapi service atl

我继承了基于旧 ATL 的服务的 C++ 代码,其中包含旧 ATL 向导的基本结构(_tWinMain()、Run()、RunMessageLoop() 等)。

特别是,这段代码已经处理了“Shutdown”和“Stop”事件——我被要求在“PreShutdown”事件中添加一个额外的关闭项。

我添加了 SERVICE_ACCEPT_PRESHUTDOWN 选项..

m_status.dwControlsAccepted |= SERVICE_ACCEPT_PRESHUTDOWN

..但我看不到如何捕获结果事件 - SERVICE_CONTROL_PRESHUTDOWN - 因为 ATL 似乎提供“OnShutdown”和“OnClose”方法但不包含我可以看到的“OnPreShutdown”条目。

任何人都可以指出一些允许我向现有代码添加 OnPreShutdown 的东西吗?

最佳答案

ATL Services 介绍了使用 ATL 实现服务.要处理默认 ATL 生成的服务不会处理的控制请求,您需要扩展默认生成的 Handler实现。

这是您需要做的事情的粗略描述(除了注册您已经注册的控制请求):

void CMyServiceModule::Handler(DWORD dwOpcode) throw() {
    if (SERVICE_CONTROL_PRESHUTDOWN == dwOpcode) {
        // Perform custom handling
    }
    else {
        // Pass all other control codes to default implementation
        __super::Handler(dwOpcode);
    }
}

作为替代方案,您可以覆盖 OnUnknownRequest自定义实现中的成员。对于默认实现未处理的所有代码调用此成员:

void CMyServiceModule::OnUnknownRequest(DWORD dwOpcode) {
    if (SERVICE_CONTROL_PRESHUTDOWN == dwOpcode) {
        // Perform custom handling
    }
    else {
        // Possibly handle other control codes
    }
}

关于c++ - 如何将 PreShutdown 事件添加到 ATL 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40105336/

相关文章:

java - CXF JAXRS - 如何将日期作为 QueryParam 传递

android - IntentService 工作队列状态

c++ - SFML 即使在覆盖虚拟绘图功能后也无法绘制对象

c# - 广播 Windows HWND_BROADCAST 消息

c++ - 模板实例化膨胀在实践中何时重要?

winapi - 使用 Shell_NotifyIcon 的气球工具提示适用于 Vista,但不适用于 XP

delphi - 使用WinAPI在Delphi中模拟键盘输入

android - 在某些设备中甚至使用 START_STICKY 后杀死应用程序后服务不会再次启动

c++ - 在 eclipse c/c++ 中使用 winavr gcc 时遇到问题

c++ - O(log n) 索引更新和搜索