COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?

COM: can I see if there is an out-of-process reference to one of my COM objects? Can I release it?

本文关键字:是否 COM 进程 引用 我可以 释放 对象 我的 存在      更新时间:2023-10-16

>我有一个应用程序,它使外部客户端可以访问COM对象(通过在ROT中注册它(。

该对象使用 ATL 在C++中实现。

问题 1:是否可以确定对我的对象的引用之一是否来自进程外客户端?

动机:当外部引用被删除时,我需要释放一些相关对象(阻止某些操作(,即使外部引用意外死亡。我还想避免要求来电者"说再见"。

我在内部使用相同的接口,因此我无法为接口使用单独的引用计数。公开的接口是基于IDispatch的,因此不会进行自定义封送处理。

问题 2:是否可以告诉进程外引用一个对象(和/或所有对象(该对象不再"活动"?强制进程外接口上的任何调用返回,例如RPC_E_DISCONNECTED(与终止服务器进程后的方式相同,客户端会收到每个调用的RPC_E_SERVER_DIED(。

动机:服务器的关闭过程可能由用户启动,可能需要一段时间。在此期间,来自外部客户端的所有调用都会被阻止;谨慎的做法是尽早通知他们呼叫不成功。

外部引用可以通过实现IExternalConnection来监视,当添加或删除外部连接时,您会被调用。

CoDisconnectObject 允许您告诉外部连接"消失"(尽管似乎外部调用方可能不会立即收到通知,但消息循环可能需要处于活动状态(。