2012-03-06 77 views
1

我有一個ATL類。我想知道何時調用此類的QueryInterface以清除內存泄漏。COM_INTERFACE_ENTRY_BREAK宏不起作用

我在COM_MAP添加COM_INTERFACE_ENTRY_BREAK的,現在它看起來像:

BEGIN_COM_MAP(CMyClass) 
     COM_INTERFACE_ENTRY(IFace1) 
     COM_INTERFACE_ENTRY(IFace2) 

     //COM_INTERFACE_ENTRY_BREAK(IUnknown) // i included this too 
     COM_INTERFACE_ENTRY_BREAK(IFace1) 
     COM_INTERFACE_ENTRY_BREAK(IFace2) 
END_COM_MAP() 

當我開始調試(按F5鍵)我有QI術後無斷點。我敢肯定,齊叫,因爲_ATL_DEBUG_INTERFACES顯示在輸出窗口

ATL: QIThunk - 4 LEAK : Object = 0x02150CC0 Refcount = 1 MaxRefCount = 2 CMyClass - IUnknown

泄漏我應該怎麼纔能有一個斷點停在齊打電話嗎?

謝謝。

+1

'COM_INTERFACE_ENTRY_BREAK(IUnknown的)'只有打破** **明確。這並不意味着「通過'IUnknown :: QueryInterface'查詢時中斷」 – MSalters 2012-03-06 11:45:54

+0

你能更詳細地解釋一下嗎?這是否意味着我無法趕上我班級IFace1被查詢的時刻? – fogbit 2012-03-06 12:02:39

+0

你的意思是什麼「查詢」?你的意思是'IFace1 :: QueryInterface(any_IID)'或'IAny :: QueryInterface(IID_IFace1)'? – MSalters 2012-03-06 12:28:08

回答

2

顯然你想在AddRef()調用上創建一個斷點,而不是QI調用。是的,令人痛苦的是,如果使用ATL包裝,找到引用來自服務器的客戶端代碼中的錯誤並不能很好地工作。與通過在new/delete操作符上設置斷點來嘗試診斷內存泄漏完全不同,這種方式也不能很好地工作。

您可以在atlcom.h內的InternalAddRef()方法上設置斷點。但是它可能很嘈雜,如果你的服務器有很多接口,它可能會導致調試器暫時失去一點時間。

+0

謝謝你的回答,但我有一個包含很多ATL類的大項目,所以,如你所說,我得到了很多休息時間。 – fogbit 2012-03-07 08:27:11

1

我已經解決了這個問題COM_INTERFACE_ENTRY_FUNC_BLIND宏是這樣的:

BEGIN_COM_MAP(CMyClass) 
    COM_INTERFACE_ENTRY(IDummy) // NB!: this has to go before COM_INTERFACE_ENTRY_FUNC_BLIND 
    COM_INTERFACE_ENTRY_FUNC_BLIND(0, MyQueryInterface) 
END_COM_MAP 

MyQueryInterface是一個叫每一個界面查詢時間的函數。

我的作用是:若查詢了`IID_IUnknown`

QueryInterfaceFunc (void* pv, REFIID riid, LPVOID* ppv, DWORD dw) 
{ 
    if (riid == __uuidof(IFace1)) 
    { 
    DebugBreak(); // Break here in the case of querying IFace1 
    } 
}