从EXE COM服务器检测客户端进程终止

时间:2009-06-26 15:10:43

标签: windows com

我正在编写一个EXE COM服务器,它公开一个锁定系统资源的类。 在正常执行中,客户端释放资源(几秒钟后COM可执行文件关闭。 在异常执行中,客户端应用程序崩溃,使com服务器具有具有正引用计数的实例。 COM可执行文件运行约12分钟,直到终止。这意味着系统资源在此期间被锁定。

有没有办法即时检测客户端终止,如套接字IPC或驱动程序协议?如果不是,那么COM似乎不如其他IPC机制。

1 个答案:

答案 0 :(得分:1)

几年前我有同样的问题。我在这里找到答案:How To Turn Off the COM Garbage Collection Mechanism。简而言之:不,没有办法立即检测客户端终止。摘录:

  

当COM客户端正常终止时,   它释放对它的所有引用   服务器对象。当一个客户   然而,在那里异常终止   可能是杰出的参考   服务器对象。没有垃圾   收集机制,服务器代码   无法知道何时回收   为COM分配的资源   对象,然后可以导致   资源泄漏。解决这个问题   问题,COM实现自动化   垃圾收集机制   COM解析器进程(RPCSS)上   客户端机器ping服务器   机器代表客户端   过程

     

使用COM的GC的替代方案   协议(例如,使用定期   应用程序级“ping” - 方法   通知对象的调用   客户仍然活着,或使用   潜在的运输机制,如   TCP keepalives)显然很多   效率低下。因此,DCOM的   应使用默认的GC机制   对于必须关闭的任何对象   当他们的客户消失或   否则如果那些对象行为不端   会有效地成为内存泄漏   在服务器上。

     

服务器计算机上的解析程序   跟踪每个人的ping   服务器对象。 ping期限是2   分钟,目前,它是非   可配置的。当解析器上   服务器机器检测到一个对象   它没有被激活6分钟   假定该对象的所有客户端   已经终止或者没有   更长时间使用该对象。解析器   然后将释放所有外部   对象的引用。它做到了这一点   只需拥有对象的存根   manager(COM运行时代码)   传递对每个对象的呼叫)   ::对象的IUnknown上的Release()   接口。此时,对象的   参考计数到目前为止为零   关注COM运行时。 (那里   可能仍然是当地的参考   (同一公寓)客户,所以   对象的内部引用计数可以   不一定在这方面归零   点。)然后对象可以关闭   本身就失望了。

     

注意:垃圾收集适用于   所有服务器无论是否   他们的客户是本地的或远程的,或   本地和远程的组合。该   底层的ping机制是   在当地的情况不同,因为没有   生成网络数据包,但是   所有实际目的,行为   是一样的。