通过ATL开发COM_2实现IUnknown接口

来源:互联网 发布:数据回溯是什么意思 编辑:程序博客网 时间:2024/05/17 04:18

每个COM组件需要实现这三个功能
1. 实现IUnknown接口 (通过 CComObjectRootEx 实现)
2. 实现一个类工厂,支持组件的创建 (通过 CComCoClass 实现)
3. 实现自注册

 

ATL是如何实现IUnknown接口的?

 

组件通过派生CComObjectRootEx 获得 IUnknown支持


CComObjectRootBase 提供集合的IUnknown方法支持 :OuterAddRef 和 OuterRelease
CComObjectRootEx 提供非集合的IUnknown方法支持 :InternalAddRef 和 InternalRelease
另外CComObjectRootBase还提供 IUnknown的QueryInterface方法支持 :InternalQueryInterface 和 OuterQueryInterface

IUnknown方法最终通过 CComObject 对用户开放:



最终我们可以这样声明和使用ATL COM组件


-------------------------------------------------------------------------------------------------------------
其实共有9个类似 CComObject 的类用于处理对用户开放的IUnknown接口,创建可实例化的COM组件。
CComObject : 不支持集合,不能处理引用计数
CComObjectNoLock : 同CComObject, 且该对象生命周期不影响组件宿主文件的锁定计数。ATL在宿主类工厂实现中使用该类
CComAggObject : 支持集合
CComContainedObject : 类似一个集合对象
CComPolyObject 支持集合和标准实现,是一个占位实现
CComObjectStack :完全不支持引用计数,结合栈创建COM对象一起使用
CComObjectGlobal : 生存期与组件宿主文件生存期相同,类似全局C++对象
CComObjectCached :存储在对象的缓存里,ATL用它实现组件的类工厂
CComTearOffObject :只在需要时创建类

-------------------------------------------------------------------------------------------------------------
总结一下 IUnknown 的实现
1. 类厂会这样创建组件 CAtlMath
IAtlMath *pIMath = new CComObject <CAtlMath>; //非集合

2. CComObject 提供了IUnknown 接口的实现,它会调用 CAtlMath 的非集合内部IUnknown接口


3. 组件 CAtlMath 会派生于 CComObjectRootEx, CComObjectRootEx提供了部分非集合IUnknown接口


4. CComObjectRootEx 派生于 CComObjectRootBase,CComObjectRootBase提供了部分非集合IUnknown接口和全部集合IUnknown接口


ATL_NO_VTABLE : __declspec (novtable)
告诉编译器不要为类生成或初始化一个Vtable结构,可让类的构造函数和析构函数更小,并减小内存使用

原创粉丝点击