如何从COM服务器调用释放

我写了一个COM服务器,我写了代码,当COM客户端意外closures,检测情况,在这种情况下,我应该closuresCOM服务器内的COM服务器代码。

我怎样才能做到这一点?

UPD:我有COM服务器绞死或更正确的情况下,我不能从COM客户端连接到COM服务器,但包含COM服务器的应用程序是活着的,所以我认为COM服务器可以检测到所有旧的COM客户端断开/closures/崩溃,应用程序将重新启动,因为没有新的客户端连接。

我已经写在COM客户端在单独的线程下面的代码

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

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

UPD2:刚刚testing:12分钟后,我的COM服务器被closures

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

这是一个存在漏洞,只要你有两个进程或互相处理进程。 其中一人死亡,另一人死亡,不知道死亡过程中将再也没有另一个要求。 在进程外COM服务器的情况下,没有人打算调用IUnknown :: Release()来销毁对象。 COM没有其他的内置修复这个问题。 一个进程内服务器没有这个问题,崩溃的进程也把服务器拿出来。 这也是一个问题,没有很好的清理,但更容易处理。

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

COM将在客户端死机后的一段时间内释放服务器端对象在一个out-proc服务器中,但只有在该对象中没有执行任何调用的情况下。 这是关键 – COM不可能阻止正在进行的通话。 所以解决的办法就是让方法短时间运行,并保证在几秒钟的合理时间内完成。 这样,一旦客户端死亡,没有新的呼叫到达,一段时间后,进行中的呼叫自然结束,然后超时后,COM释放服务器中的对象,服务器可以自然停止。