Почему BEGIN_COM_MAP содержит DEBUG_QI_ENTRY? - PullRequest
0 голосов
/ 13 ноября 2009

В 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-карты, чтобы избежать описанной проблемы?

1 Ответ

1 голос
/ 13 ноября 2009

_ATL_DEBUG, похоже, не документировано, поэтому мне интересно, если это просто ловушка для отладки вызовов QueryInterface - если утверждение не удается, вы врываетесь в отладчик и можете проверить карту интерфейса, стек вызовов и т. Д.

Или, может быть, это какой-то остаток.

...