c++ - COM:我可以查看是否有对我的一个 COM 对象的进程外引用吗?我可以释放它吗?
问题描述
我有一个应用程序使外部客户端可以访问 COM 对象(通过在 ROT 中注册它)。
该对象是使用 ATL 在 C++ 中实现的。
问题 1:是否可以确定对我的对象持有的引用之一是否来自进程外客户端?
动机:当外部引用被移除时,我需要释放一些相关的对象(阻止一些操作),即使外部引用意外死亡。我还想避免要求来电者“说再见”。
我在内部使用相同的接口,所以我不能为接口使用单独的引用计数。公开的接口是IDispatch
基于 - 的,因此不会发生自定义封送处理。
问题 2:是否可以告诉对象(和/或所有对象)的进程外引用该对象不再“活着”?强制进程外接口上的任何调用返回,例如RPC_E_DISCONNECTED
(以与终止服务器进程后相同的方式,客户端RPC_E_SERVER_DIED
每次调用都会收到一个)。
动机:服务器的关闭过程可能由用户发起,可能需要一段时间。在那个时候,来自外部客户端的所有调用都会阻塞;谨慎的做法是提前通知他们通话没有成功。
解决方案
可以通过实现IExternalConnection来监视外部引用,当添加或删除外部连接时,您会被调用。
CoDisconnectObject允许您告诉外部连接“离开”(虽然看起来可能不会立即通知外部调用者,但可能需要激活消息循环)。
推荐阅读
- makefile - Macros ($@, $< , $*) in Makefile?
- python - “密集”对象没有属性“操作”
- css - Font-size not working when resizing the page
- kubernetes - Can I enable pod to pod (via pod IP) communication with Istio?
- python - 谷歌云运行和网页抓取与硒
- javascript - Javascript Data Manipulation Inefficiency
- php - How to not select duplicated row when primary key is used in the same table?
- python - 有什么方法可以右键单击 Tkinter 列表框中的项目吗?
- c# - Outlook 加载项错误:由于邮件已更改,无法执行操作
- cmd - 为什么安装 Kivy 时 Cmd 显示错误?