COM_INTERFACE_ENTRY_IID和COM_INTERFACE_ENTRY2_IID之间有什么区别?

时间:2009-11-17 10:29:54

标签: 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( IPersist ), IPersistFile )

COM_INTERFACE_ENTRY2_IID( __uuidof( IPersist ), IPersist, IPersistFile )

进入我班级的COM地图,它可以正常工作。

两者之间有什么区别吗?

1 个答案:

答案 0 :(得分:2)

根据ATL Internals(你绝对应该得到的一本书,根据你在这里提出的问题 - 大部分内容都已经完全覆盖!),这两本书大致相同。

  • COM_INTERFACE_ENTRY仅提及接口名称,并将其IID映射到vtable偏移量
  • COM_INTERFACE_ENTRY2提到接口名称以及继承树中用于vtable offsetting的分支
  • 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更简单。