MFC与ATL中的COM组件开发:对象聚合实现

需积分: 12 69 下载量 115 浏览量 更新于2024-08-18 收藏 447KB PPT 举报
"这篇文档主要讨论了在ATL(Active Template Library)中如何实现对象的聚合,这是在MFC(Microsoft Foundation Classes)框架下进行COM(Component Object Model)开发的一个重要概念。文中通过CComAggObject模板类的示例,展示了如何创建一个具有聚合功能的对象,并介绍了非委托IUnknown和委托IUnknown的概念。此外,文档还概述了COM开发的基础,包括Win32 SDK对COM的支持以及COM接口的描述方法。" 在COM开发中,对象聚合是一种强大的技术,允许一个对象包含或"拥有"另一个对象,使得外部用户只能通过容器对象来访问内部对象。ATL是微软提供的一种轻量级库,专门用于高效地创建COM对象,它提供了CComAggObject类来简化对象聚合的实现。 CComAggObject模板类是ATL中实现聚合的关键,它继承自IUnknown并使用CComObjectRootEx模板作为基类。CComObjectRootEx提供了线程模型管理,这里的_threadModel参数(在这里是contained::_ThreadModel::ThreadModelNoCS)定义了对象的线程模型。CComAggObject定义了AddRef、Release和QueryInterface这三个IUnknown接口的方法,这些方法是所有COM接口的基础。 聚合的关键在于IUnknown的实现。在CComAggObject中,m_contained是一个CComContainedObject<contained>类型的成员,它是被聚合对象的实例。CComContainedObject会自动处理内部对象的引用计数,实现了非委托IUnknown,即对象的IUnknown接口直接由自身维护,而不是通过外部未知接口(outer unknown)。 非委托IUnknown是指对象的IUnknown接口不是由外部对象(如另一个COM对象)控制的。在这种情况下,对象能够独立地管理自己的生命周期。然而,在某些情况下,我们可能希望将对象的IUnknown接口委托给外部对象,这被称为委托IUnknown。在ATL中,如果需要实现委托IUnknown,可以使用CComAggObject的构造函数传递外部未知接口,这样外部对象就可以控制内部对象的引用计数和接口查询。 除了ATL,文档还提到了MFC对COM的支持,以及如何使用MFC开发COM组件。MFC通过COleObjectFactory和CComObject类提供了COM支持,但ATL通常被认为是更高效且更适用于COM编程的库。 最后,文档简要提到了Win32 SDK对COM的支持,包括提供了一系列头文件,如Unknwn.h、Wtypes.h、Objidl.h、Comdef.h和ObjBase.h,它们包含了COM接口的定义和库函数。开发者可以通过这些头文件和宏来描述和实现COM接口,例如DECLARE_INTERFACE_宏用于声明一个接口,并指定其父接口。 这篇文档深入探讨了ATL中的对象聚合,以及COM开发的基础知识,对于理解COM组件的创建和管理,特别是使用ATL的场景,有着重要的参考价值。