多个双重接口
你可能希望将双重接口的优点(即,vtable 和后期绑定的灵活性,使类可用于脚本语言以及 C++)与多种继承技术相结合。
虽然可以在单个 COM 对象上公开多个双重接口,但不建议这样做。 如果有多个双重接口,则必须只公开一个 IDispatch
接口。 可用于确保这种情况的技术具有缺点,例如函数丢失或代码复杂性增加。 考虑采用此方法的开发人员应仔细权衡优缺点。
公开单个 IDispatch 接口
通过从两个或多个 IDispatchImpl
专用化派生,可以在单个对象上公开多个双重接口。 但是,如果允许客户端查询 IDispatch
接口,则需要使用 COM_INTERFACE_ENTRY2 宏(或 COM_INTERFACE_ENTRY_IID)来指定要用于实现 IDispatch
的基类。
COM_INTERFACE_ENTRY2(IDispatch, IMyDualInterface)
由于只公开了一个 IDispatch
接口,因此只能通过 IDispatch
接口访问对象的客户端将无法访问任何其他接口中的方法或属性。
将多个双重接口合并为 IDispatch 的单个实现
ATL 不为将多个双重接口合并为 IDispatch
的单个实现提供任何支持。 但是,可通过几种已知方法手动组合接口,例如创建只包含 IDispatch
接口集的模板类、创建新对象来执行 QueryInterface
函数或使用基于 typeinfo 的嵌套对象的实现来创建 IDispatch
接口。
这些方法存在潜在的命名空间冲突以及代码复杂性和可维护性的问题。 不建议创建多个双重接口。