Dans ATL, il existe une macro BEGIN_COM_MAP pour déclarer une table qui contrôle le comportement de QueryInterface() lorsqu'il est appelé sur l'objet de classe correspondant.Pourquoi BEGIN_COM_MAP contient-il un DEBUG_QI_ENTRY?
L'intérieur a la ligne suivante:
static const _ATL_INTMAP_ENTRY _entries[] = { DEBUG_QI_ENTRY(x)
ce qui signifie que la première entrée de la table sera DEBUG_QI_ENTRY qui se développe comme suit:
#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
qui conduit efficace à chaque classe ayant cette entrée lorsque _ATL_DEBUG est défini. Mais dans CComObjectRootBase :: InternalQueryInterface() il y a une affirmation:
// First entry in the com map should be a simple map entry
//ATLASSERT(pEntries->pFunc == _ATL_SIMPLEMAPENTRY);
qui échoue pour que chaque classe lorsqu'il est compilé avec _ATL_DEBUG parce qu'il attend le pfunc être _ATL_SIMPLEMAPENTRY (qui est 1), mais trouve la place 0 mis là par DEBUG_QI_ENTRY().
Quel est le sens DEBUG_QI_ENTRY()
et comment puis-je utiliser les macros carte COM pour éviter le problème décrit?