2009-11-13 110 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調用的鉤子 - 如果斷言失敗,你闖入調試器,可以檢查接口映射,調用堆棧等。

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