2009-11-13 7 views
0

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?

Répondre

1

_ATL_DEBUG ne semble pas être documenté, donc je me demande si c'est juste un crochet pour déboguer QueryInterface appelle - si l'assertion échoue, vous cassez dans le débogueur et peut inspecter la carte d'interface, la pile d'appels, etc.

Ou peut-être c'est un peu de restes.