>我有一个应用程序,它使外部客户端可以访问COM对象(通过在ROT中注册它(。
该对象使用 ATL 在C++中实现。
问题 1:是否可以确定对我的对象的引用之一是否来自进程外客户端?
动机:当外部引用被删除时,我需要释放一些相关对象(阻止某些操作(,即使外部引用意外死亡。我还想避免要求来电者"说再见"。
我在内部使用相同的接口,因此我无法为接口使用单独的引用计数。公开的接口是基于IDispatch
的,因此不会进行自定义封送处理。
问题 2:是否可以告诉进程外引用一个对象(和/或所有对象(该对象不再"活动"?强制进程外接口上的任何调用返回,例如RPC_E_DISCONNECTED
(与终止服务器进程后的方式相同,客户端会收到每个调用的RPC_E_SERVER_DIED
(。
动机:服务器的关闭过程可能由用户启动,可能需要一段时间。在此期间,来自外部客户端的所有调用都会被阻止;谨慎的做法是尽早通知他们呼叫不成功。
外部引用可以通过实现IExternalConnection来监视,当添加或删除外部连接时,您会被调用。
CoDisconnectObject 允许您告诉外部连接"消失"(尽管似乎外部调用方可能不会立即收到通知,但消息循环可能需要处于活动状态(。