通过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结构,可让类的构造函数和析构函数更小,并减小内存使用
- 通过ATL开发COM_2实现IUnknown接口
- 通过ATL实现IUnknown接口
- ATL中IUnknown接口的实现(一)
- 【原创】使用vc向导简历的ATL COM简单对象好像没有IUnknown接口的实现?
- 实现接口,从IUnknown开始
- IUnknown接口
- IUnknown接口
- IUnknown接口
- IUnknown接口
- IUnknown接口
- IUnknown接口
- IUnknown接口
- IUnKnown接口
- IUnknown接口
- ATL是通过接口映射表来实现QueryInterface
- ATL 实现IObjectSafety接口
- ATL 实现IObjectSafety 接口
- ATL 支持ActiveX控件开发的所实现的接口
- ODBC安装使用指南1
- 通过ATL开发COM_1概述
- validator验证表单实例之一
- 营销感触(二)了解某个客户,顺便打听他的领导是谁!
- 贾君鹏不回家吃饭的十个理由!
- 通过ATL开发COM_2实现IUnknown接口
- Firefox 3.5 启动慢的问题解决
- 句柄泄露
- URL相关介绍
- break -- continue
- windows 平台下安装使用QT
- 通过ATL开发COM_3实现类厂和组件的创建
- 高级进阶:12招全面提速你的Firefox 3.5
- 我第一次来这里