【问题标题】:COM multiple interface inheritanceCOM多接口继承
【发布时间】:2022-01-10 07:10:02
【问题描述】:

我最近在 Don box 的 Essential com 书中引用了一句话

interface ICatDog : ICat, IDog { // 非法,多碱基

COM 出于多种原因禁止多接口继承。一 原因是生成的 C++ 抽象基的二进制表示 类不会是编译器不变的

我想知道是否有人知道为什么多基对 com 不利并且会破坏编译器的不变性。

谢谢

【问题讨论】:

  • 请注意,它只是一个COM接口,不能从多个COM接口继承,换句话说,这很好:class CatDog : ICat, IDog。至于原因,这只是意味着 C++ 标准(当时,今天不确定)没有确保在二进制级别与使用两种不同编译器(例如 MSVC 与 GCC)编译的两个对象的适当兼容性
  • 所陈述的原因是相当荒谬的,任何用 C++ 编写的实用 COM 服务器实际上都依赖 MI 来实现它们的接口。他们只是想出了一个更好的方法来做到这一点,不需要广泛的规范来规定确切的 v-table 布局,给实现者很大的灵活性,一种解决歧义的方法和一个后门,如果他们的 C++ 编译器是异常。 IUnknown::QueryInterface() 是一个非常好的主意。

标签: inheritance com compiler-construction


【解决方案1】:

MIDL 工具/COM 接口规则的限制。

https://docs.microsoft.com/en-us/windows/win32/com/interface-design-rules

另见:

https://www.codeproject.com/Questions/877467/inheritance-two-ATL-interface

Extending MIDL interfaces and COM object design

https://www.codeproject.com/Articles/1249/A-Multiple-Inheritance-based-COM-Framework

https://www.ooportal.com/basic-com/module2/implementing-com-objects.php

http://computer-programming-forum.com/77-vc-atl/becc8c161a391551.htm

C++ COM design. Composition vs multiple inheritance

https://www.guusbosman.nl/downloads/PaperOop.html

“COM 采用 C++ 虚拟函数表的结构作为接口的二进制表示。COM 接口作为指向虚拟表的指针呈现给客户端。这部分是对 Microsoft 用于桌面环境的 DLL 技术的继承。这些允许多个客户端程序在执行时(动态地)链接对象实现。”

COM 不像大多数对象系统那样支持多对象继承。相反,它依赖于从单个对象的多个接口继承。每个对象都继承自 IUnknown。 IUnknown 接口包括用于在对象的接口之间导航的 QueryInterface() 方法。此外,此处还包括 AddRef() 和 Release() 方法。这些用于引用计数和垃圾收集。这样,每个服务器对象都可以控制自己的生命周期。每个接口都有一个全局唯一标识符 (GUID),必须在注册表中注册。此外,每个类也有自己唯一的类 ID (CLSID)。

COM+ 中的情况有点不同。根据 [Kirtland 97],COM+ 将支持实现继承以及对象引用(COM 不知道对象引用,只有接口引用)。但是,可以使用它,而不是强制性的。文章说,“它使版本控制成为一场噩梦(请参阅版本控制)”。原则上,大多数 COM 对象将被接口引用,而不是对象引用。

【讨论】:

  • 非常感谢您提供的链接,我已经完成了一些并完成了其余的工作。我仍然在努力理解为什么来自多个接口继承的新抽象类是不好的,为什么基于编译器的更改是可能的,因为 vtable 是不同的,为什么
猜你喜欢
  • 2017-07-23
  • 2010-12-24
  • 2020-09-09
  • 1970-01-01
  • 2015-04-02
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
相关资源
最近更新 更多