[英]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可以根據需要多次調用Connect
和Disconnect
並使用它們之間的接口。 但是,如果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.