ATL COM 对象的基础知识

下图描述了用于定义 ATL COM 对象的类和接口之间的关系。

Diagram of the classes and interfaces used to define an A T L object.

注意

此关系图显示 CComObject 派生自 CYourClass,而 CComAggObjectCComPolyObject 包含 CYourClass 作为成员变量。

有三种方法来定义 ATL COM 对象。 标准选项是使用派生自 CYourClassCComObject 类。 第二个选项是使用 CComAggObject 类创建聚合对象。 第三个选项是使用 CComPolyObject 类。 CComPolyObject 充当混合选项:它可以作为 CComObject 类或 CComAggObject 类运行,具体取决于首次创建它的方式。 有关如何使用 CComPolyObject 类的详细信息,请参阅 CComPolyObject 类

使用标准 ATL COM 时,请使用两个对象:一个外部对象和一个内部对象。 外部客户端通过外部对象中定义的包装函数访问内部对象的功能。 外部对象的类型为 CComObject

使用聚合对象时,外部对象不提供内部对象功能的包装器。 相反,外部对象提供由外部客户端直接访问的指针。 在此场景中,外部对象的类型为 CComAggObject。 内部对象是外部对象的成员变量,类型为 CYourClass

由于客户端不必通过外部对象与内部对象交互,因此聚合对象通常更高效。 此外,鉴于聚合对象的接口直接可用于客户端,外部对象不必知道聚合对象的功能。 但是,并非所有对象都可以聚合。 对于要聚合的对象,在设计时需要考虑到聚合。

ATL 分两个阶段实现 IUnknown

ATL COM 对象的其他方面由其他类处理:

  • CComCoClass 定义对象的默认类工厂和聚合模型。

  • IDispatchImpl 提供对象上任何双接口的 IDispatch Interface 部分的默认实现。

  • ISupportErrorInfoImpl 实现 ISupportErrorInfo 接口,确保错误信息能够正确地沿调用链向上传播。

本节内容

实现 CComObjectRootEx
显示用于实现 CComObjectRootEx 的示例 COM 映射条目。

实现 CComObject、CComAggObject 和 CComPolyObject
讨论 DECLARE_*_AGGREGATABLE 宏如何影响 CComObjectCComAggObjectCComPolyObject 的使用

支持 IDispatch 和 IErrorInfo
列出用于支持 IDispatchIErrorInfo 接口的 ATL 实现类。

支持 IDispEventImpl
讨论为类实现连接点的步骤。

更改默认类工厂和聚合模型
显示用于更改默认类工厂和聚合模型的宏。

创建聚合对象
列出创建聚合对象的步骤。

创建 ATL 项目
提供有关创建 ATL COM 对象的信息。

ATL
提供了关于如何使用 Active Template Library 进行编程的概念性主题的链接。

另请参阅

概念