我有一个应用程序使外部客户端可以访问 COM 对象(通过在 ROT 中注册它)。
该对象是使用 ATL 在 C++ 中实现的。
问题 1:是否可以确定对我的对象持有的引用之一是否来自进程外客户端?
动机:当外部引用被移除时,我需要释放一些相关的对象(阻止一些操作),即使外部引用意外死亡。我还想避免要求来电者“说再见”。
我在内部使用相同的接口,所以我不能为接口使用单独的引用计数。公开的接口是IDispatch
基于 - 的,因此不会发生自定义封送处理。
问题 2:是否可以告诉对象(和/或所有对象)的进程外引用该对象不再“活着”?强制进程外接口上的任何调用返回,例如RPC_E_DISCONNECTED
(以与终止服务器进程后相同的方式,客户端RPC_E_SERVER_DIED
每次调用都会收到一个)。
动机:服务器的关闭过程可能由用户发起,可能需要一段时间。在那个时候,来自外部客户端的所有调用都会阻塞;谨慎的做法是提前通知他们通话没有成功。