首页 > 解决方案 > COM:我可以查看是否有对我的一个 COM 对象的进程外引用吗?我可以释放它吗?

问题描述

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

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

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

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

我在内部使用相同的接口,所以我不能为接口使用单独的引用计数。公开的接口是IDispatch基于 - 的,因此不会发生自定义封送处理。

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

动机:服务器的关闭过程可能由用户发起,可能需要一段时间。在那个时候,来自外部客户端的所有调用都会阻塞;谨慎的做法是提前通知他们通话没有成功。

标签: c++winapicomatlcross-process

解决方案


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

CoDisconnectObject允许您告诉外部连接“离开”(虽然看起来可能不会立即通知外部调用者,但可能需要激活消息循环)。


推荐阅读