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 对象的进程外引用吗?我可以释放它吗?的主要内容,如果未能解决你的问题,请参考以下文章