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映射宏來避免描述的問題?