第02章COM对象与接口.ppt
《第02章COM对象与接口.ppt》由会员分享,可在线阅读,更多相关《第02章COM对象与接口.ppt(50页珍藏版)》请在三一文库上搜索。
1、第二章 COM对象和接口,主要内容,COM对象的概念与特征 接口的定义与标识 接口的内存模型 接口的特点 IUknown接口 引用计数 接口查询 字典组件举例,COM基础三个概念,COM组件 组件:可独立发布的二进制组件 在Windows平台上表现为DLL或者EXE COM对象 通过COM接口提供服务 符合OO中对象的基本概念 COM接口 客户与对象之间的协议,对象实现COM接口,客户使用COM接口从而访问对象,需要思考的一些问题,COM组件 组件的类型:进程内组件(DLL)、进程外组件(EXE) 为方便起见,只讨论Windows平台上DLL类型的组件 COM对象 如何标识一个对象?对象以什么
2、形式存在?客户如何创建对象? 对象如何暴露接口?一个或是多个? COM接口 要求:跨编译器、跨语言、跨平台,2.1 COM对象,概念 COM对象是客户程序与组件程序进行交互的实体。 COM对象包含属性和方法(或者状态和操作): 属性反映对象的存在,也是区别于其他对象的要素; 方法是对象提供给外界的接口。 能够提供服务(通过COM接口) 对象的实现由组件完全包装起来,2.1.1 COM对象的标识CLSID,COM组件的位置透明性 客户程序并不直接访问COM对象,而是通过一个唯一的全局标识符进行对象的创建和初始化工作。 可选的标识符方案: 字符串形式:可读性好,名字冲突的可能性大 定长位数的整数:
3、如何保证唯一性?(管理组织 / 大随机数) GUID 是COM规范采取的方案 是一个128位的随机数 不绝对保证唯一性,但发生冲突的可能性非常小 例如: 54BF6567-1007-11D1-B0AA-444553540000 ,GUID续,GUID的C/C+结构描述 typedef struct _GUID DWORD Data1; WORD Data2; WORD Data3; BYTE Data48; GUID ; 保证随机性的考虑 空间上:网络中的计算机通常取网卡的地址(唯一的) 时间上:同一机器在不同时候产生的标识符总不相同,GUID (续),产生GUID的工具 Visual C+提
4、供的两个工具: UUIDGen.exe :命令行程序 GUIDGen.exe :基于对话框的程序 COM库提供的API函数 HRESULT CoCreateGuid ( GUID * pguid) ; GUID 与 CLSID CLSID是标识COM对象的GUID 二者在结构上完全一致,2.1.2 COM对象与C+对象的比较,层次差异 COM对象建立在二进制级的基础上 C+对象建立在源代码级的基础上 封装特性 COM对象的数据完全封装在对象内部,不能直接访问 C+对象的公有数据成员是可以访问的 可重用性 COM对象的重用表现为包容和聚合 C+对象的重用表现为继承与组合 多态性的表现形式不同 C
5、OM对象的多态需要通过接口来表现,2.2 COM接口,基本内容 接口定义与标识 用C+定义接口 IDL 接口的内存模型 接口的特点,2.2.2 接口定义和标识,定义 是一个函数集,以二进制的形式给出了从一方到另一方的调用规范;函数的地址封装在一个数据结构中。 这个数据结构称为“接口函数表” 在C+中称为“虚函数表”,简称vtable 对于一个接口来说,它的vtable是确定的,即: 接口成员函数的个数是不变的; 其先后顺序也是不变的 客户程序通过一个指向vtable的指针来调用接口成员函数,COM接口结构,COM接口举例(C语言),struct IDictionaryVtble; struct
6、 IDictionary IDictionaryVtble * pVtbl ; ; struct IDictionaryVtble BOOL ( * Initialize) (Idictionary * this); BOOL ( * LoadLibrary) (Idictionary * this, String); void ( * FreeLibrary) (Idictionary * this); ;,COM接口标识-IID,Interface Identifier 是GUID的一种用法 例如: extern “C” const IID IID_Iunkown = 0x00000000
7、, 0x0000, 0x0000 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 ; 如果客户程序要使用一个COM对象的某个接口,必须知道该接口的IID以及它能提供的方法。,2.2.3 用C+语言定义接口,COM接口结构中的vtable与class的vtable完全一致 因此,用class描述COM接口是最方便的手段 举例: class IDictionary virtual BOOL Initialize() = 0; virtual BOOL LoadLibrary(String) = 0; virtual void FreeLibrary()
8、 = 0; ;,类IDictionary的内存结构,2.2.4 接口描述语言IDL,以OSF 的 IDL为基础 基本数据类型 与C语言非常接近,包括结构、联合、枚举、typedef等 interface coclass library 可以产生类型库,举例,interface IDictionary HRESULT Initialize(); HRESULT LoadLibrary(in string); HRESULT InsertWord(in string, in string); HRESULT DeleteWord(in string); HRESULT LookupWord(in
9、string, out string *); HRESULT RestoreLibrary(in string); HRESULT FreeLibrary(); ; VC+的MIDL可以由IDL文件生成C/C+接口描述,IDL的意义,IDL语言无关 跨语言的中间语言 MIDL.exe产生C+头文件定义 相当于C+定义 MIDL.exe产生TLB类型库 COM本身提供了一套基础设施来解释类型库 所有的标准接口都可以在SDK中找到IDL描述,编译IDL文件,2.2.5 接口的内存模型,如果我们用C+实现字典对象,则类定义为: class CDictionary : public IDictiona
10、ry public : CDictionary(); CDictionary(); public : virtual BOOL Initialize(); virtual BOOL LoadLibrary(String); / private : struct DictWord *m_pData; char *m_DictFilename128; / ;,接口和字典对象的内存结构图,多个字典对象与接口的内存结构图,不同方法实现的字典对象与接口关系,2.2.6 接口的特点,二进制特性 接口不变性 继承性(扩展性) 多态性运行过程中的多态性 (lecture over),2.3 IUnkown 接
11、口,所有的COM接口都必须从IUnknown派生,原因在于Iunknown接口提供了两个重要的特性: 生存期控制:通过“引用计数”来控制 接口查询:QueryInterface函数 Iunknown的IDL定义: Interface IUnknown HRESULT QueryInterface( in REFIID iid, out void * ppv ) ; ULONG AddRef( void ) ; ULONG Release( void ) ; ,2.3 IUnkown 接口(续),Iunknown的C+定义: class IUnknown public: virtual HRES
12、ULT _stdcall QueryInterface( const IID,2.3.1 引用计数,目的:是为了控制对象的生命周期 多个客户可以独立地控制对象的生存 引用计数反映了COM对象被客户引用的个数 引用计数是个整数,从0开始 两个操作:增 1 和 减 1 当客户得到一个指向对象的接口指针时,引用计数1; 当客户用完该接口指针时,引用计数1; 当引用计数为0时,表示没有客户在使用对象或者接口删除,2.3.2 实现引用计数,引用计数多实现方案的原因 一个COM组件可以实现多个COM对象 一个COM对象可以实现多个COM接口 组件级实现 ? 对象级实现 ? 接口级实现? 实现方案比较(参见
13、下页的图) 设置一个针对整个组件的全局引用计数 所有对象必须一起释放 计数分辨率太粗 为每个COM对象设置一个引用计数(折中方案) 为每个接口设置一个引用计数 客户不一定会用到对象的所有接口,造成资源浪费 计数分辨率太细,实现引用计数的层次(或粒度),重新定义IDictionary,class IDictionary : public IUnknown virtual BOOL Initialize() = 0; virtual BOOL LoadLibrary(String) = 0; virtual BOOL InsertWord(String, String) = 0; virtual
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 02 COM 对象 接口
链接地址:https://www.31doc.com/p-3416331.html