ATL COM 对象的基础知识
下图描述了用于定义 ATL COM 对象的类和接口之间的关系。
注意
此关系图显示 CComObject
派生自 CYourClass
,而 CComAggObject
和 CComPolyObject
包含 CYourClass
作为成员变量。
有三种方法来定义 ATL COM 对象。 标准选项是使用派生自 CYourClass
的 CComObject
类。 第二个选项是使用 CComAggObject
类创建聚合对象。 第三个选项是使用 CComPolyObject
类。 CComPolyObject
充当混合选项:它可以作为 CComObject
类或 CComAggObject
类运行,具体取决于首次创建它的方式。 有关如何使用 CComPolyObject
类的详细信息,请参阅 CComPolyObject 类。
使用标准 ATL COM 时,请使用两个对象:一个外部对象和一个内部对象。 外部客户端通过外部对象中定义的包装函数访问内部对象的功能。 外部对象的类型为 CComObject
。
使用聚合对象时,外部对象不提供内部对象功能的包装器。 相反,外部对象提供由外部客户端直接访问的指针。 在此场景中,外部对象的类型为 CComAggObject
。 内部对象是外部对象的成员变量,类型为 CYourClass
。
由于客户端不必通过外部对象与内部对象交互,因此聚合对象通常更高效。 此外,鉴于聚合对象的接口直接可用于客户端,外部对象不必知道聚合对象的功能。 但是,并非所有对象都可以聚合。 对于要聚合的对象,在设计时需要考虑到聚合。
ATL 分两个阶段实现 IUnknown:
CComObject、CComAggObject 或 CComPolyObject 实现
IUnknown
方法。CComObjectRoot 或 CComObjectRootEx 管理
IUnknown
的引用计数和外部指针。
ATL COM 对象的其他方面由其他类处理:
CComCoClass 定义对象的默认类工厂和聚合模型。
IDispatchImpl 提供对象上任何双接口的
IDispatch Interface
部分的默认实现。ISupportErrorInfoImpl 实现
ISupportErrorInfo
接口,确保错误信息能够正确地沿调用链向上传播。
本节内容
实现 CComObjectRootEx
显示用于实现 CComObjectRootEx
的示例 COM 映射条目。
实现 CComObject、CComAggObject 和 CComPolyObject
讨论 DECLARE_*_AGGREGATABLE 宏如何影响 CComObject
、CComAggObject
和 CComPolyObject
的使用。
支持 IDispatch 和 IErrorInfo
列出用于支持 IDispatch
和 IErrorInfo
接口的 ATL 实现类。
支持 IDispEventImpl
讨论为类实现连接点的步骤。
更改默认类工厂和聚合模型
显示用于更改默认类工厂和聚合模型的宏。
创建聚合对象
列出创建聚合对象的步骤。
相关章节
创建 ATL 项目
提供有关创建 ATL COM 对象的信息。
ATL
提供了关于如何使用 Active Template Library 进行编程的概念性主题的链接。