2011-11-29 23 views
1

在一個項目中,我正在與一個.EXE服務器中的一個對象通信(該對象執行對我應該緩存的昂貴查詢),並且我似乎已經得到了我的引用計數錯誤,這使得服務器進程釋放一個對象仍然有一個引用,使得主機進程失敗,出現了一些奇怪而有趣的方式,包括丟失數據和向供應商發送錯誤報告。調試COM引用計數器

有沒有一種方法可以讓COM提出一些可以在調試器中檢測到的條件,如果代理對象的引用計數已經降到零以某種方式使用?

+0

如果您的客戶端進程由於某些意外的原因而執行額外的'IUnknown :: Release',我不會期望它被轉發到真正的應用程序。相反,它會銷燬代理,而服務器進程存根仍然會正確管理實際對象上的引用計數。 –

+0

是的,這就是我所期望的 - 但是我可以讓服務器應用程序彈出一個窗口,一些對象的引用計數變爲負值。 –

+0

更有可能的是,它是一個錯誤的服務器,並不指望你使用它的方式。例如,它可能具有影響頂級引用計數的內部COM對象,例如後臺工作人員活動,它在進行時臨時引用主要對象。 –

回答

0

使用原始接口不可能這是可能的 - 引用計數由COM服務器維護,它如何被推送到服務器 - 實現在服務器代碼中,所以除非你有源代碼並且可以調試服務器,你無法得到它。

但是,很可能您的問題是由手動調用AddRef和Release引起的。如果是這種情況,您可以使用RAII /智能指針解決方案。 ATL提供了一個,但如果由於某種原因你不能使用它,創建你自己的就很容易了。然後,您不僅可以創建或使用提供的調試工具來跟蹤引用計數,您將不太可能首先得到它。

+0

服務器是進程外的,所以我保證住在我的地址空間的對象是代理服務器。因此我希望我可以利用這個事實進行調試。 –

+0

我想如果你絕望的話,你可以提供你自己的代理dll,它維護一個單獨的引用計數並替換你的註冊表中的那個,但它確實似乎有很多工作。 – AndrzejJ