2

我正在编写一个 Com 服务器,并且我编写了检测 COM 客户端意外关闭时的情况的代码,在这种情况下,我应该在 COM 服务器代码中关闭 COM 服务器。

我怎样才能做到这一点?

UPD:我遇到了 COM 服务器挂起或更正确的情况,我无法从 COM 客户端连接到 COM 服务器,但包含 COM 服务器的应用程序仍处于活动状态,因此我认为 COM 服务器可以检测到所有旧 COM 客户端都已断开连接/关闭/崩溃并且应用程序将重新启动,因为没有附加新客户端。

我在 COM 客户端的单独线程中编写了以下代码

while(not we are closing)
{
   unknown->QueryInterface(IComServer, &server);

   if (server)
     return;
}

所以COM客户端可以等到服务器真正准备好工作

UPD2:刚刚测试:12 分钟后我的 COM 服务器关闭

4

3 回答 3

5

COM 定期 ping 客户端以查看它们是否还活着并从死客户端运行接口。所以你的服务器最终会发现。

于 2012-05-22T01:51:35.640 回答
3

只要您有两个或进程互操作,就会存在这个漏洞。其中一个死了,另一个继续运行,不知道死进程再也不会有另一个请求了。在进程外 COM 服务器的情况下,没有人会调用 IUnknown::Release() 来销毁对象。COM 没有针对该问题的内置修复程序。进程内服务器没有这个问题,崩溃的进程也将服务器取出。这也是一个问题,没有很好的清理,但更容易处理。

让服务器从中恢复是您必须自己添加的内容。例如,您可以让客户端传递其进程 ID,以便服务器可以获取进程句柄并使用 WaitForMultipleHandles() 检测客户端何时崩溃。假设它们都在机器上,那当然不是 COM 要求,也不是服务器可以找到的东西。

于 2012-05-22T01:05:51.317 回答
0

COM 将在客户端死亡后的某个时间在 out-proc 服务器中释放服务器端对象,但前提是该对象中没有执行调用。这是关键——COM 不可能停止正在进行的呼叫。因此解决方案是使方法运行时间短,并保证在一些合理的短时间(如几秒钟)内完成。这样,一旦客户端死亡,就没有新的调用来自它,并且在一段时间后正在进行的调用自然结束,然后在超时后 COM 释放服务器中的对象,服务器可以自然停止。

于 2012-05-22T06:22:52.703 回答