Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何从COM服务器调用release_Windows_Com - Fatal编程技术网

Windows 如何从COM服务器调用release

Windows 如何从COM服务器调用release,windows,com,Windows,Com,我正在编写一个Com服务器,我已经编写了一些代码来检测Com客户端意外关闭时的情况,在这种情况下,我应该在Com服务器代码中关闭Com服务器 我该怎么做 UPD:当COM服务器被挂起或更正确地说,我无法从COM客户端连接到COM服务器,但包含COM服务器的应用程序处于活动状态,所以我认为COM服务器可以检测到所有旧COM客户端都已断开/关闭/崩溃,并且应用程序将重新启动,因为没有连接新客户端 我已经在COM客户端的单独线程中编写了以下代码 while(not we are closing) {

我正在编写一个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服务器关闭了

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


让服务器从中恢复是您必须自己添加的内容。例如,您可以让客户机传递其进程ID,以便服务器可以获取进程句柄,并在客户机使用WaitForMultipleHandles()时进行检测。假设他们都生活在机器上,这当然不是COM要求,服务器也无法发现。

COM定期ping客户端以查看它们是否仍然存在,并从死客户端运行接口。因此,您的服务器最终会找到答案。

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

你认为这样做有什么好处?@David Heffernan:显然,他不希望COM服务器进程徘徊不前无限期的。从未听说过,也从未亲眼见过。两小时前我启动了一个进程外服务器并杀死了客户端。它还在运行。我很想看到这方面的参考资料,它不适合谷歌。运行应该在客户端断开连接6或12分钟后发生,fwiw。这确实发生了。您是否在服务器对象的Release()方法上放置了断点以确认未调用它?“可能还有另一个引用使您的服务器保持活动状态。@Larry,我通过获得对msword的_应用程序接口的一个引用使它保持简单。”。它不会发生。msword可能有一个来自GUI的额外引用,因此它不会在没有用户操作的情况下自动关闭。普通COM服务器在客户端死机时接收
IUnknown::Release
调用。无gui。如果这是真的,那么肯定在什么地方有记录?这是DCOM特有的吗?我喜欢你这样的想法-Com客户端接收Com服务器的句柄,使用WaitForMultipleHandles创建线程,当Com服务器出现故障时,将null作为指向服务器的指针。因此,客户端可能永远不会调用挂起的服务器