簡體   English   中英

COM接口從ROT中消失

[英]COM interface disappears from ROT

我有兩個應用程序,我都寫過。 AppA是使用MFC用C ++編寫的。 在啟動過程中,它注冊一個CSingleDocTemplate並創建一個文檔。 該文檔提供一個COM接口並在ROT中注冊自己:

LPUNKNOWN punk = GetInterface(&IID_Welder); // doesn't AddRef
  ::RegisterActiveObject(punk, CLSID_Interface, ACTIVEOBJECT_WEAK, &m_dwRegister);

AppA銷毀后,將撤消ROT中的條目:

if (m_dwRegister)
    ::RevokeActiveObject(m_dwRegister, NULL);

僅在AppA終止時調用析構函數。

AppB用C#編寫,並且是AppA提供的接口的客戶端:

private void Connect()
  {
  welderInterface = (Welder.Interface)Marshal.GetActiveObject("Welder.Interface");
  Marshal.GetIUnknownForObject(welderInterface);    // AddRef's it ...
  }

private void Disconnect() { if (welderInterface != null) { Marshal.ReleaseComObject(welderInterface); welderInterface = null; } }

(為清楚起見,省略了錯誤處理)

在AppA啟動后,AppB首次運行時,一切運行正常; AppB可以根據需要多次調用ConnectDisconnect並使用它們之間的接口。 但是,如果APPB終止並再次運行(APPA仍在運行)的接口不再可用- Marshal.GetActiveObject拋出的異常MK_E_UNAVAILABLE 使接口再次可用的唯一方法是重新啟動AppA-這不是可接受的解決方案!

請有人能建議我如何解決此問題?

 ::RegisterActiveObject(punk, CLSID_Interface, ACTIVEOBJECT_WEAK, &m_dwRegister);

ACTIVEOBJECT_WEAK是您的問題。 從RegisterActiveObject文檔中:

弱注冊會在運行的對象表中保留一個指向該對象的指針,但不會增加引用計數。 因此,當與弱注冊對象的最后一個外部連接消失時,OLE釋放該對象的存根,並且該對象本身不再可用。

這正是程序中正在發生的事情。 用ACTIVEOBJECT_STRONG輕松解決問題。

我發現了問題。 當AppB斷開連接時,該接口被刪除,即使實現該接口的MFC文檔仍然有效。 我已經在MFC代碼中進行了相當深入的研究,但未找到任何內容,但它一定是在其中的某處發生的。

我在文檔構造函數中添加了接口,並在析構函數中釋放了接口,問題就解決了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM