【发布时间】:2011-02-05 19:16:03
【问题描述】:
我有一个基于 ATL 7 的 CAtlServiceModuleT 类的 Windows 服务。该服务提供系统上各种应用程序使用的 COM 对象,如果服务在它们仍在运行时停止,这些其他应用程序自然会开始出错。
我知道如果 CComModule 的 GetLockCount() 返回 0,ATL DLL 会通过在 DllCanUnloadNow() 返回 S_OK 来解决这个问题。也就是说,它会检查以确保当前没有人使用 DLL 提供的任何 COM 对象。我想要服务中的等效功能。
这是我在覆盖 CAtlServiceModuleT::OnStop() 时所做的:
void CMyServiceModule::OnStop()
{
if( GetLockCount() != 0 ) {
return;
}
BaseClass::OnStop();
}
现在,当用户尝试从“服务”面板停止服务时,他们会看到一条错误消息:
Windows 无法停止本地计算机上的 XYZ 服务。 该服务没有返回错误。这可能是内部 Windows 错误或内部服务错误。 如果问题仍然存在,请联系您的系统管理员。
Stop 请求确实被拒绝了,但它似乎使服务处于错误状态。第二个停止请求会导致此错误消息:
Windows 无法停止本地计算机上的 XYZ 服务。
错误 1061:服务目前无法接受控制消息。
有趣的是,这次服务确实停止了(尽管我不希望它停止,因为仍然有未完成的 COM 引用)。
我有两个问题:
- 服务在被询问时拒绝停止是否被认为是不好的做法?
- 是否有礼貌的方式表示停止请求被拒绝;一个不会使服务进入不良状态的服务?
【问题讨论】:
-
我绝对认为当用户询问时不停止是一种不好的做法。除非您完全确信您的服务没有错误,否则您会强制他们重新启动,或者更糟糕的是,如果您的服务发生意外情况。
标签: com windows-services atl