В чем разница между COM_INTERFACE_ENTRY_IID и COM_INTERFACE_ENTRY2_IID? - PullRequest
1 голос
/ 17 ноября 2009

Похоже, что COM_INTERFACE_ENTRY_IID и COM_INTERFACE_ENTRY2_IID относятся к случаю, когда класс является производным от двух или более классов, каждый из которых происходит от общего интерфейса. Как это:

class CMyClass : public IPersistFile, public IPersistStream { 

};

(и IPersistStream, и IPersistFile являются производными от IPersist).

Похоже, я могу включить либо

COM_INTERFACE_ENTRY_IID( __uuidof( IPersist ), IPersistFile )

или

COM_INTERFACE_ENTRY2_IID( __uuidof( IPersist ), IPersist, IPersistFile )

в карту COM моего класса, и она будет работать нормально.

Есть ли разница между этими двумя?

1 Ответ

2 голосов
/ 17 ноября 2009

Согласно ATL Internals (книга, которую вы обязательно должны получить, основываясь на ваших вопросах здесь - большинство из них подробно рассмотрены!), Эти два в основном эквивалентны.

  • COM_INTERFACE_ENTRY только упоминает имя интерфейса и сопоставляет его IID со смещением vtable
  • COM_INTERFACE_ENTRY2 упоминает имя интерфейса и какую ветвь в дереве наследования использовать для смещения vtable
  • COM_INTERFACE_ENTRY_IID сопоставляет IID с интерфейсом и, таким образом, позволяет выбрать ветку дерева наследования
  • COM_INTERFACE_ENTRY2_IID делает все это; сопоставляет IID с интерфейсом и явно указывает на ветку дерева наследования

Автор ATL Internals говорит:

С COM_INTERFACE_ENTRY2 [_IID] не предоставляет никакой дополнительной функциональности за что предоставлено COM_INTERFACE_ENTRY [_IID], я склонен всегда используйте последнее и забудьте бывший.

Я думаю, что они хотели сказать, что если вы используете COM_INTERFACE_ENTRY_IID, вы уже выбираете ветвь, поэтому семейство COM_INTERFACE_ENTRY2 [_IID] ничего не добавляет. Но COM_INTERFACE_ENTRY2 несколько проще использовать этот COM_INTERFACE_ENTRY_IID.

...