2009-11-17 2 views
1

Похоже, что и COM_INTERFACE_ENTRY_IID, и COM_INTERFACE_ENTRY2_IID предназначены для случая, когда класс получен из двух или более классов, каждый из которых выведен из общего интерфейса. Пример:В чем разница между 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) 

в СОМ карте моего класса, и он будет работать Allright.

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

ответ

2

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

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

Автор АТЛ внутрикорпусных говорит:

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

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

Смежные вопросы