1

COM_INTERFACE_ENTRY_IIDとCOM_INTERFACE_ENTRY2_IIDの両方が、クラスがそれぞれ共通のインターフェイスから派生した2つ以上のクラスから派生した場合のようです。このような:

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マップに入れれば、問題なく動作します。

両者に違いはありますか?

4

1 に答える 1

2

ATL Internals(ここでの質問に基づいて、間違いなく入手する必要のある本-それらのほとんどは完全にカバーされています!)によると、2つはほとんど同等です。

  • COM_INTERFACE_ENTRYはインターフェイス名のみを記述し、そのIIDをvtableオフセットにマップします
  • COM_INTERFACE_ENTRY2は、インターフェイス名と、vtableオフセットに使用する継承ツリーのブランチを示します。
  • COM_INTERFACE_ENTRY_IIDは、IIDをインターフェイスにマップし、それによって継承ツリーブランチを選択できるようにします
  • COM_INTERFACE_ENTRY2_IIDがすべてを実行します。IIDをインターフェイスにマップし、継承ツリーブランチについて明示します

ATLInternalsの作者は次のように述べています。

COM_INTERFACE_ENTRY2 [_IID]は、COM_INTERFACE_ENTRY [_IID]によって提供される機能以外の追加機能を提供しないため、私は常に後者を使用し、前者を忘れがちです。

COM_INTERFACE_ENTRY_IIDを使用する場合、既にブランチを選択しているため、COM_INTERFACE_ENTRY2[_IID]ファミリは何も追加しないという意味だと思います。ただし、COM_INTERFACE_ENTRY2は、そのCOM_INTERFACE_ENTRY_IIDを使用する方がやや簡単です。

于 2009-11-17T14:04:16.510 に答える