ATL bietet eine Reihe von Makros zur Erstellung so genannter COM-Maps - Ketten von Regeln, wie sich der QueryInterface()-Aufruf auf ein bestimmtes Objekt verhält. Die Map beginnt mit BEGIN_COM_MAP und endet mit END_COM_MAP. Dazwischen können (unter anderem) die folgenden verwendet werden:
- COM_INTERFACE_ENTRY, COM_INTERFACE_ENTRY2 - um C++ zu bitten, diese Klasse einfach auf die entsprechende COM-Schnittstelle zu übertragen
- COM_INTERFACE_ENTRY_FUNC - um C++ zu bitten, eine Funktion aufzurufen, die die Schnittstelle abruft
Das Problem ist nun, dass ich COM_INTERFACE_ENTRY_FUNC für jede Schnittstelle, die ich offenlege, verwenden möchte, damit ich alle Aufrufe protokollieren kann - ich glaube, das wird mir beim Debuggen meiner Komponente helfen, wenn sie im Feld eingesetzt wird. Die Implementierung von CComObjectRootBase::InternalQueryInterface enthält ein ATLASSERT:
ATLASSERT(pEntries->pFunc == _ATL_SIMPLEMAPENTRY);
was bedeutet, dass das Folgende in Ordnung ist:
BEGIN_COM_MAP
COM_INTERFACE_ENTRY( IMyInterface1 )
COM_INTERFACE_ENTRY_FUNC( __uuidof(IMyInterface2), 0, OnQueryMyInterface2 )
END_COM_MAP
da hier der erste Eintrag zu einem Eintrag vom Typ _ATL_SIMPLEMAPENTRY führt, der folgende jedoch nicht:
BEGIN_COM_MAP
COM_INTERFACE_ENTRY_FUNC( __uuidof(IMyInterface1), 0, OnQueryMyInterface1 )
COM_INTERFACE_ENTRY_FUNC( __uuidof(IMyInterface2), 0, OnQueryMyInterface2 )
END_COM_MAP
da hier der Eintragstyp nicht _ATL_SIMPLEMAPENTRY ist.
Das macht überhaupt keinen Sinn. Warum bin ich gezwungen, einen "please, C++, do the static_cast"-Eintrag als ersten Eintrag in der COM-Map zu haben?
Upd: Nach vielen weiteren Stunden der Fehlersuche gelöst, Antwort hinzugefügt.