我有两个应用程序,我都写过。
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可以根据需要多次调用ConnectDisconnect并使用它们之间的接口。但是,如果AppB终止并再次运行(AppA仍在运行),则该接口不再可用-Marshal.GetActiveObjectMK_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/

10-11 15:34