В 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), но вместо этого находит 0, помещенный туда DEBUG_QI_ENTRY ().
Какой смысл в DEBUG_QI_ENTRY()
и как мне использовать макросы COM-карты, чтобы избежать описанной проблемы?