【发布时间】:2011-04-18 18:29:20
【问题描述】:
我有一个本机 Visual C++ NT 服务。当服务启动时,它的线程调用CoInitialize() 将线程附加到一个 STA - 服务线程通过 COM 接口使用 MSXML。
当服务接收到SERVICE_CONTROL_STOP 时,它会在消息队列中发布一条消息,然后检索该消息并调用OnStop() 处理程序。处理程序清理东西并调用CoUnitialize()。大多数情况下它都可以正常工作,但偶尔后一个调用会挂起。我无法稳定地重现这种行为。
我google了一会儿,发现了以下可能的解释:
- 未能释放所有拥有的 COM 对象
- repeatedly calling
CoInitializeEx()/CoUnitialize()for attaching to MTA - failing to dispatch messaged in STA threads
第一个不太可能 - 使用 MSXML 的代码经过了很好的测试和分析,它使用智能指针来控制对象的生命周期,因此泄漏对象的可能性很小。
第二个原因看起来不太可能。我附加到 STA 并且不会重复调用这些函数。
第三个看起来或多或少的可能性。当线程正在处理消息时,它不再运行消息循环 - 它已经在循环内。我想这可能是原因。
后者是否可能是导致此问题的原因?我还应该考虑哪些其他原因?如何轻松解决这个问题?
【问题讨论】:
标签: windows visual-c++ winapi com windows-services