COM原理及组件开发

上传人:ji****72 文档编号:50454116 上传时间:2018-08-08 格式:PPT 页数:84 大小:654.50KB
返回 下载 相关 举报
COM原理及组件开发_第1页
第1页 / 共84页
COM原理及组件开发_第2页
第2页 / 共84页
COM原理及组件开发_第3页
第3页 / 共84页
COM原理及组件开发_第4页
第4页 / 共84页
COM原理及组件开发_第5页
第5页 / 共84页
点击查看更多>>
资源描述

《COM原理及组件开发》由会员分享,可在线阅读,更多相关《COM原理及组件开发(84页珍藏版)》请在金锄头文库上搜索。

1、哈尔滨工业大学计算机学院 唐好选 Email:COM技术及组件开发主要内容uCOM的基本原理u构件对象模型COM/DCOMu基于COM构件的开发u COM是微软提出的第一个构件模型,源于OLE: Object Link and Embedding(动态链接和嵌入)OLE1 采用DDE(Dynamic Data Exchange:动态数据交换) 在不同的程序之间进行通信DDE缺点: 建立在Windows消息机制基础上,效率低、稳定性不好、使用不方便 u COM是为克服上述不足而出现的 COM 技术的发展u COM定义了客户与构件之间互操作的标准,包括规约与实现两个部分 u 规约部分定义了构件之间

2、的通信机制,这些规约不依赖 于任何特定的语言和操作系统 u 实现部分就是COM库,为COM规约的具体实现提供了一些核心服务 u COM仅支持同一台计算机上(当然是Windows操作系统)的互操作,不支持分布式计算环境COM 技术的发展u 将COM技术延伸到分布计算环境,产生了所谓的DCOM (Distributed COM,分布构件对象模型)用网络协议代替 本地进程之间的通信针对分布环境提供了新特性:位置透明网络安全性跨平台调用 等u 为了满足企业级应用的需求,推出了微软事务服务器 (MTS: Microsoft Transaction Server),把应用系统的客户程序、应用构件和各种资源

3、有机结合起来,为分布式企业应 用提供了一种服务器端的构件运行和部署环境COM 技术的发展u 为了使Windows真正成为企业应用平台,微软推出了分布式 网络应用体系结构(Windows DNA: Distributed interNet Application Architecture),DNA是一个完整的、多层的企业应用体系结构:包含工具、数据库、操作系统、编程模型 和应用服务等 u 随着Windows 2000的发布,微软进一步把COM、DCOM、 MTS统一起来,形成了真正适合于企业级应用的构件技术 :COM+ u 可以认为:COM/DCOM + MTS = COM+ u COM+是一种

4、中间件技术规约,提供操作系统级的分布 式“服务”COM 技术的发展Window DNAu 是一个服务器端的开发平台,包括 u Windows NT/2000/2003 提供运行环境和支持 u COM/DCOM u MSMQ 消息队列产品,支持构件间异步通信 u MTS 管理构件的应用服务 u Microsoft Wolfpack 支持集群服务器的软件 u Microsoft SQL Server u Microsoft IIS Web服务器 u Microsoft Management Console 部署和管理工具Window DNACOM+基本结构COM+目录负载平衡 驻留内存数据库 对象

5、池 新的事件模型 构件管理和部署 JIT激活COM+MTS事务支持 资源分发管理 安全模型 易于管理远程支持 DCOM分布式构件服务COM基于接口的编程模型基本的构件服务uCOM(Component Object Model),组件对象模型,是一种以组件为发布单元的对象模型,这种模型使得各个软件组件可以用一种统一的方式进行交互 uCOM是一种协议,它建立了一个软件模块同另一个软件模块之间的连接,提供了组件之间进行交互的规范,也提供了实现交互的环境 u当这种连接建立起来后,两个模块之间就可以通过“接口”的机制来进行通讯,这些接口既不需要静态的或动态的连接入口点,也不需要编码很复杂的地址什么是CO

6、M?u全局唯一标识符(Global Unique IDentifier)来源于OSF的通 用统一标识符UUID(Universal Unique IDentifier),是一个 128位整数 u用于标识COM对象(CLSID)和接口(IID) u由于空间足够大, 冲突较小.可以用编程的方法生成具有唯一性 的GUID uVC: UUIDGEN.EXE, GUIDGEN.EXE u对GUID值的传递通常通过引用进行COM基本概念:GUID基本概念:COM对象/COM构件/COM接口COM构件对象1对象2接口1接口2 接口3接口4基本概念:COM对象和COM构件u在COM规约中,“构件”和“对象”经

7、常混淆,所谓COM对象是指符合COM规则的CoClass(构件类)的实例,每一个COM对象都有一个GUID,称为CLSID(CoClassID)uCOM构件是指以编译后的形式提供一组功能的COM对象u独立于具体编程语言u一个构件可以由多个类实现 u以二进制形式(DLL或EXE)发布u可以在不妨碍客户的形式下被升级u可以透明地在网络上被重新分配uCOM接口是COM规范的核心内容,是COM对象显示出来的所有信息,是一组逻辑上相关的函数集合 u每一个接口都有一个GUID,称为接口标识符(简称IID:Interface IDentifier)uCOM接口具有不变性,只允许单继承u一个COM对象可以实现

8、多个接口,这体现了COM对象的多态性,这些接口由IUnknown接口来管理u在C+中,可以用抽象基类来定义COM接口基本概念:COM接口新版本构件的处理uCOM接口永远不会变化 :一个IID就是一个接口,当对组件 进行升级时,一般不会修改已有的接口,而是加入一些新接口 u当下列条件中的任何一个变化时,应给新接口指定新IID u接口中函数数目 u接口中函数顺序 u某个函数的参数 u某个函数参数的顺序 u某个函数参数的类型 u函数可能的返回值 u函数返回值的类型等 u不同版本接口的命名:在老名称后加一个数字u是所有COM对象都必须实现的接口,其它接口都直接或间接 继承IUnknown(IID为00

9、000000-0000-0000-C000-000000000046 )接 口,包含三个基本操作 uAddRef:提供生存周期管理功能,增加对象引用计数 uRelease:提供生存周期管理功能,用于释放对象 uQueryInterface:负责向客户提供接口查询功能基本概念:IUnknown接口IUknown接口的定义,定义在win32 SDK中的UNKNWN.h头文件中: interface IUnkown virtual HRESULT _stdcall QueryInterface( const IIDvirtual ULONG_stdcall AddRef() = 0;virtual

10、ULONG_stdcall Release() = 0; u微软接口定义语言MIDL(Microsoft Interface Definition Language)是定义COM接口的申述式语言u通过独立于具体编程语言的方式来定义接口 u该语言基于OSF分布式计算环境(DCE)远程过程调用(RPC)的接口描述语言IDLuCOM规范使用的IDL接口描述语言不仅可用于COM接口,同时还定义了一些常用的数据类型,也可描述自定义的数据结构,对于接口的成员函数,可以指定每个参数的类型、输入输出特性,甚至可支持变长度的数组的描述 uMIDL支持指针类型,与C/C+类似基本概念:接口定义语言u接口定义例:

11、interface IDictionary HRESULT Initialize();HRESULT LoadLibrary(in string);HRESULT InsertWord(in string, in string);HRESULT DeleteWord(in string);HRESULT LookWorld(in string,out string*);HRESULT RestoreLibrary(in string);HRESULT FreeLibrary(); 基本概念:接口定义语言uCOM接口是一个二进制标准,客户同接口的连接并不是通过其名称或其成员函数的名称来实现的,而

12、是通过其在内存块中的位置完成的 uCOM接口是一个包含一个函数指针数组的内存结构,每一个数组元素包含的是一个由组件所实现的函数的地址 uC+通过纯抽象基类实现COM接口,实际上是定义了一个内存块的结构,但此内存只是在派生类中实现此抽象基类时才会被分配,派生类继承此抽象基类时将继承此内存结构COM接口Vtbl指针虚拟函数表pIXIXvirtual void _stdcall Fx2()=0;virtual void _stdcall Fx3()=0;virtual void _stdcall Fx4()=0; u提高接口实现的灵活性,实现抽象基类的类可能会将特定于 实例的信息同vtbl一块保存例

13、子:一个实现接口IX的类CA,CA包含2个数据: class CA : public IX public:virtual void_stdcall Fx1() virtual void_stdcall Fx2() virtual void_stdcall Fx3() virtual void_stdcall Fx4() double Data1;double Data2; Vtbl的作用Vtbl指针虚拟函数表IX创建构件时,客户可以使用CreateInstance,而不是newuCreateInstance的定义:IUnknown * CreateInstance()IUnknown * pI

14、 = static_cast (new foo);pI - AddRef();return pI;IUnknown指针的获取u一个COM对象(构件)可以实现多个接口. u使用QueryInterface查询某个构件是否支持某个特定的接口void foo(Iunknown * pI) IX * pIX = NULL; HRESULT hr = pI-QueryInterface(IID_IX, (void *) If (SUCCEEDED(hr) pIX-Fx(); 接口查询u假定存在类 CA,继承接口 IX 与 IYHRESULT _stdcall CA: QueryInterface(con

15、st IID else if (iid = IID_IX) *ppv = static_cast(this); else if (iid = IID_IY) *ppv = static_cast(this); else *ppv = NULL;return E_NOINTERFACE; static_cast(*ppv)-AddRef(); return S_OK; QueryInterface的实现uQueryInterface返回的总是同一个IUnknown指针 u若客户曾经获取过某个接口,那么它将总能获取此接口u客户可以再次获取已经拥有的接口 u客户可以返回到起始接口 u若能够从某个接口

16、获取某特定接口,则可以从(该构件的)任意接口获取此接口QueryInterface的实现规则u 通过函数AddRef与Release实现 u 控制构件的生命期 u 解决内存管理问题 u 使构件能够自己将自己删除 u 使用规则 u 返回接口指针之前调用AddRef; u 使用完接口之后调用Release; u 赋值之后调用AddRef;引用计数在什么层次上进行计数:构件?对象?接口?构件构件引用记数对象引用记数对象引用记数对象1对象2接口接口接口接口接口引用记数接口引用记数接口引用记数接口引用记数引用计数的实现方式u 函数的参数中使用接口指针变量 u 对于输入参数,被调函数不必改变计数 u 对于输出参数,相当于生成了一个新的接口指针变量, 因此在返回之前,需要使计数增1 u 对于输入输出参数,参数修改之前计数减1,修改之后 计数加1,若参数未被修改,计数不变 u 对于局部接

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号