COM:我可以查看是不是有对我的一个 COM 对象的进程外引用吗?我可以释放它吗?

Posted

技术标签:

【中文标题】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:我可以查看是否有对我的一个 COM 对象的进程外引用吗?我可以释放它吗? 【发布时间】:2020-10-20 04:20:17 【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

我认为你需要在你的对象上实现IExternalConnection 接口 CoDisconnectObject 2 @RbMm:谢谢,按预期工作。如果您想将其发布为答案,我很乐意接受。 【参考方案1】:

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

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

【讨论】:

以上是关于COM:我可以查看是不是有对我的一个 COM 对象的进程外引用吗?我可以释放它吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 XML 映射到 C# 对象

Facebook API SDK撤销访问权限

面向对象编程中“接口”的定义是啥

检查是不是在其他视图中查看?

面向对象函数式编程与并行

如何查看订阅是不是被取消?