我有两个应用程序,我都写过。
AppA是使用MFC用C ++编写的。在启动过程中,它注册一个CSingleDocTemplate并创建一个文档。该文档提供一个COM接口并在ROT中注册自己:
LPUNKNOWN朋克= GetInterface(&IID_Welder); //没有AddRef
:: RegisterActiveObject(punk,CLSID_Interface,ACTIVEOBJECT_WEAK和&m_dwRegister);
AppA销毁后,将撤消ROT中的条目:
如果(m_dwRegister)
:: RevokeActiveObject(m_dwRegister,NULL);
仅在AppA终止时调用析构函数。
AppB用C#编写,并且是AppA提供的接口的客户端:
私人void Connect()
{
welderInterface =(Welder.Interface)Marshal.GetActiveObject(“ Welder.Interface”);
元帅.GetIUnknownForObject(welderInterface); // AddRef ...
}
私人无效Disconnect()
{
如果(welderInterface!= null)
{
元帅.ReleaseComObject(welderInterface);
welderInterface = null;
}
}
(为清楚起见,省略了错误处理)
在AppA启动后,AppB首次运行时,一切运行正常; AppB可以根据需要多次调用Connect
和Disconnect
并使用它们之间的接口。但是,如果AppB终止并再次运行(AppA仍在运行),则该接口不再可用-Marshal.GetActiveObject
从MK_E_UNAVAILABLE
引发异常。使接口再次可用的唯一方法是重新启动AppA-这不是可接受的解决方案!
请有人能建议我如何解决此问题?
最佳答案
::RegisterActiveObject(punk, CLSID_Interface, ACTIVEOBJECT_WEAK, &m_dwRegister);
ACTIVEOBJECT_WEAK是您的问题。从RegisterActiveObject文档中:
弱注册会在运行的对象表中保留一个指向该对象的指针,但不会增加引用计数。因此,当与弱注册对象的最后一个外部连接消失时,OLE释放该对象的存根,并且该对象本身不再可用。
这正是程序中正在发生的事情。用ACTIVEOBJECT_STRONG轻松解决问题。
关于c# - COM接口(interface)从ROT中消失,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3387203/