2009-11-13 107 views
0

在ATL中,有一个BEGIN_COM_MAP宏用于声明一个表,该表控制在相应的类对象上调用QueryInterface()时的行为方式。为什么BEGIN_COM_MAP包含DEBUG_QI_ENTRY?

它里面有如下一行:

static const _ATL_INTMAP_ENTRY _entries[] = { DEBUG_QI_ENTRY(x) 

这意味着第一个表项将DEBUG_QI_ENTRY它扩展如下:

#ifdef _ATL_DEBUG 
#define DEBUG_QI_ENTRY(x) \ 
     {NULL, \ 
     (DWORD_PTR)_T(#x), \ 
     (ATL::_ATL_CREATORARGFUNC*)0}, 
#else 
#define DEBUG_QI_ENTRY(x) 
#endif //_ATL_DEBUG 

其中有效线索,以每类有这个条目时_ATL_DEBUG被定义。但在CComObjectRootBase :: InternalQueryInterface()有一个断言:

// First entry in the com map should be a simple map entry 
//ATLASSERT(pEntries->pFunc == _ATL_SIMPLEMAPENTRY); 

当_ATL_DEBUG编译,因为它预计pFunc是_ATL_SIMPLEMAPENTRY(这是1),而是发现由DEBUG_QI_ENTRY 0放在那里它失败只是每类()。

DEBUG_QI_ENTRY()是什么意思,以及如何使用COM映射宏来避免描述的问题?

回答

1

_ATL_DEBUG似乎没有记录,所以我不知道它是否只是一个调试QueryInterface调用的钩子 - 如果断言失败,你闯入调试器,可以检查接口映射,调用堆栈等。

或者它可能是一些剩余的。