2012-03-06 67 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 
    } 
}