ATL对象聚合实现与COM开发详解

需积分: 10 3 下载量 35 浏览量 更新于2024-08-19 收藏 447KB PPT 举报
"该资源是关于DCOM技术开发的一份PPT,主要讲解了在ATL(Active Template Library)中如何实现对象聚合。内容涵盖了COM基础、MFC对COM的支持、ATL对COM的支持以及如何使用ATL开发COM组件。其中,重点讨论了ATL中的CComAggObject类模板,它是实现对象聚合的关键。" 在COM(Component Object Model)中,对象聚合是一种强大的特性,允许一个COM对象包含或“聚合”另一个COM对象,使得外部调用者可以通过单一的接口来访问被聚合对象的所有功能。ATL作为微软提供的轻量级COM库,提供了便捷的方式来实现这一特性。 在给出的代码片段中,`CComAggObject`是一个模板类,它继承自`IUnknown`接口和`CComObjectRootEx< contained::_ThreadModel::ThreadModelNoCS >`。`CComObjectRootEx`是ATL中用于管理对象引用计数和线程模型的基类,而`_ThreadModel::ThreadModelNoCS`则表明这个对象在没有临界区保护的情况下运行。`CComAggObject`实现了`IUnknown`的基本方法`AddRef`、`Release`和`QueryInterface`,这是所有COM接口的基础。 `CComAggObject`类中的关键成员变量`CComContainedObject<contained> m_contained;`是一个模板实例,它实际上持有被聚合的对象。`CComContainedObject`是ATL提供的,用于实现对象聚合的内部机制,它自动处理对被聚合对象的引用计数和接口查询转发。 `QueryInterface`方法是聚合的关键,因为它负责将对外部接口的请求转发到被聚合的对象上。如果请求的接口是`IUnknown`,那么`QueryInterface`直接处理;如果是其他接口,它会调用`m_contained`来处理,从而让被聚合的对象有机会暴露它的接口。 非委托`IUnknown`指的是`CComAggObject`自身不公开`IUnknown`接口,而委托`IUnknown`意味着`CComAggObject`会将`IUnknown`的调用委托给`m_contained`,这样外部对象只能通过`m_contained`来访问和管理聚合对象的生命周期。 在MFC(Microsoft Foundation Classes)中,虽然也支持COM开发,但ATL通常被认为是更高效的选择,特别是对于小型、高性能的COM组件。ATL的模板和宏使得COM接口的实现更加简洁,减少了代码量并提高了性能。 通过这份PPT,读者可以学习到如何使用ATL创建具有对象聚合特性的COM组件,理解COM对象的生命周期管理和接口查询机制,以及如何在实际项目中应用这些知识。此外,还涉及了Win32 SDK对COM的支持,包括COM库函数、接口定义以及如何使用宏来描述接口,这些都是进行COM开发的基础。