ATL предоставляет набор макросов для создания так называемых COM-карт - цепочек правил поведения вызова QueryInterface () для данного объекта. Карта начинается с BEGIN_COM_MAP и заканчивается END_COM_MAP. В промежутке между ними может использоваться следующее (среди прочих):
- COM_INTERFACE_ENTRY, COM_INTERFACE_ENTRY2 - попросить C ++ просто привести этот класс к соответствующему интерфейсу COM
- COM_INTERFACE_ENTRY_FUNC - попросить C ++ вызвать функцию, которая будет получать интерфейс
Теперь проблема в том, что я хочу использовать COM_INTERFACE_ENTRY_FUNC для каждого интерфейса, который я выставляю, чтобы я мог регистрировать все вызовы - я верю, что это поможет мне отладить мой компонент, когда он развернут в поле. Реализация CComObjectRootBase :: InternalQueryInterface содержит ATLASSERT:
ATLASSERT(pEntries->pFunc == _ATL_SIMPLEMAPENTRY);
, что означает, что все в порядке:
BEGIN_COM_MAP
COM_INTERFACE_ENTRY( IMyInterface1 )
COM_INTERFACE_ENTRY_FUNC( __uuidof(IMyInterface2), 0, OnQueryMyInterface2 )
END_COM_MAP
, поскольку здесь первая запись приводит к записи типа _ATL_SIMPLEMAPENTRY, но следующее не является:
BEGIN_COM_MAP
COM_INTERFACE_ENTRY_FUNC( __uuidof(IMyInterface1), 0, OnQueryMyInterface1 )
COM_INTERFACE_ENTRY_FUNC( __uuidof(IMyInterface2), 0, OnQueryMyInterface2 )
END_COM_MAP
, поскольку здесь тип записи не будет _ATL_SIMPLEMAPENTRY.
Это не имеет никакого смысла вообще. Почему я вынужден использовать запись «пожалуйста, C ++, сделать static_cast» в качестве первой записи карты COM?
Upd: Исправлено после долгих часов отладки, добавлен ответ.