Visual c++ 什么';COM_接口_条目_IID和COM_接口_条目2_IID之间的区别是什么?

Visual c++ 什么';COM_接口_条目_IID和COM_接口_条目2_IID之间的区别是什么?,visual-c++,com,atl,multiple-inheritance,Visual C++,Com,Atl,Multiple Inheritance,似乎COM_INTERFACE_ENTRY_IID和COM_INTERFACE_ENTRY2_IID都适用于类派生自两个或多个类的情况,每个类派生自一个公共接口。像这样: class CMyClass : public IPersistFile, public IPersistStream { }) (IPersistStream和IPersistFile都源自IPersist) 看来我可以随意加入其中任何一个 COM_INTERFACE_ENTRY_IID( __uuidof( IPers

似乎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地图,它会正常工作

这两者之间有什么区别吗?

根据(根据你的问题,你肯定会得到一本书——其中大部分都被详尽地介绍了!),这两者基本上是等价的

  • COM_INTERFACE_条目仅提及接口名称,并将其IID映射到vtable偏移量
  • COM_INTERFACE_ENTRY2提到接口名称以及继承树中用于vtable偏移的分支
  • COM_INTERFACE_ENTRY_IID将IID映射到接口,从而允许您选择继承树分支
  • COM_INTERFACE_ENTRY2_IID完成了这一切;将IID映射到接口,并明确表示继承树分支
ATL Internals的作者说:

自COM_接口_入口2[_IID] 除此之外,不提供任何额外功能 由 COM_接口_条目[_IID],我倾向于 总是使用后者,忘记它 以前的

我想他们的意思是,如果您使用COM_INTERFACE\u ENTRY\u IID,您已经选择了分支,因此COM_INTERFACE\u ENTRY2[\u IID]家族不会添加任何内容。但是COM接口入口2使用COM接口入口IID稍微简单一些

COM_INTERFACE_ENTRY2_IID( __uuidof( IPersist ), IPersist, IPersistFile )