2013-01-16 39 views
0

我已經使用VC#爲另一個應用程序創建了一個UI前端(稱爲「B」)(我們稱之爲「A」)。 B是一個獨立的EXE,它必須是(因爲某些原因)由A.稱爲防止應用程序關閉時減少COM引用計數器

流動的電流(DLL是不可能的,因爲安全策略。):

  1. 啓動A (它充當COM服務器)。
  2. 讓A使用system()調用來執行B.
  3. B創建一個COM連接到A.
  4. 用戶關閉乙
  5. A閉合,太。 < < <這是問題所在!

所需流量是:

...(5)一種未關閉。

據我所知,我認爲造成不良行爲的原因是COM參考計數器自動減少。因爲B正在使用現有的A實例,所以計數器先前爲1,因此減少爲0,導致A完全關閉。(這是一個真正的問題,因爲此時用戶可能會丟失A中的數據。)

我已經試圖影響GC保持活着,但沒有成功。

的問題是:

如何防止甲的關閉,例如,通過避免參考計數器的遞減?

+0

聲音就像引用計數在另一端是錯誤的 - 如果A引用了自身(1),那麼當B創建引用時,它應該增加(2)。然後,當B關閉時,它的引用應該被正確地移除(1),但是如果需要的話,A仍然應該有自己的引用。 –

+0

這可能是這種情況,因爲應用程序A「以某種方式」COM,但可能不是「真正」。 – Hardy

回答

0

如果您有權訪問A中的com對象,那麼您可以對其執行Marshal.AddRef以增加ref計數器,即聲明A也正在使用COM對象。

+0

使用'instance = new A()'創建A對象後,實例的值從NULL更改爲'System._ComObject'(根據調試器)。當試圖添加引用時:'IntPtr ptrDOORS = new IntPtr(); \t \t \t \t Marshal.StructureToPtr(instance,ptrDOORS,true); \t \t \t \t Marshal.AddRef(ptrDOORS);'有一個'instance'爲空的錯誤。 – Hardy

+0

您不能正確檢索IntPtr。從Marshal.AddRef的文檔「您可以調用Marshal.GetComInterfaceForObject,Marshal.GetIUnknownForObject或Marshal.GetIDispatchForObject以獲取表示IUnknown接口指針的IntPtr值。」 – Bond

+0

啊,GetUnknownForObject完成了這項工作。 – Hardy

相關問題