在ATL中有一个BEGIN_COM_MAP宏,用于声明一个表,该表控制QueryInterface()在相应类对象上调用时的行为。
其中包含以下内容:
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地图宏来避免所描述的问题?
答案 0 :(得分:1)
_ATL_DEBUG
似乎没有记录,所以我想知道它是否只是调试QueryInterface调用的一个钩子 - 如果断言失败,你进入调试器并可以检查接口映射,调用堆栈,等
或者也许是剩下的。