为什么BEGIN_COM_MAP包含DEBUG_QI_ENTRY?

时间:2009-11-13 10:35:30

标签: visual-c++ com atl

在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地图宏来避免所描述的问题?

1 个答案:

答案 0 :(得分:1)

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

或者也许是剩下的。