资源预览内容
第1页 / 共84页
第2页 / 共84页
第3页 / 共84页
第4页 / 共84页
第5页 / 共84页
第6页 / 共84页
第7页 / 共84页
第8页 / 共84页
第9页 / 共84页
第10页 / 共84页
亲,该文档总共84页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
哈尔滨工业大学计算机学院唐好选Email:tanghxhit.edu.cn,COM技术及组件开发,主要内容,COM的基本原理构件对象模型COM/DCOM基于COM构件的开发,COM是微软提出的第一个构件模型,源于OLE: Object Link and Embedding(动态链接和嵌入)OLE1 采用DDE(Dynamic Data Exchange:动态数据交换) 在不同的程序之间进行通信DDE缺点: 建立在Windows消息机制基础上,效率低、稳定性不好、使用不方便 COM是为克服上述不足而出现的,COM 技术的发展,COM定义了客户与构件之间互操作的标准,包括规约与实现两个部分规约部分定义了构件之间的通信机制,这些规约不依赖于任何特定的语言和操作系统实现部分就是COM库,为COM规约的具体实现提供了一些核心服务COM仅支持同一台计算机上(当然是Windows操作系统)的互操作,不支持分布式计算环境,COM 技术的发展,将COM技术延伸到分布计算环境,产生了所谓的DCOM (Distributed COM,分布构件对象模型) 用网络协议代替 本地进程之间的通信 针对分布环境提供了新特性: 位置透明 网络安全性 跨平台调用 等为了满足企业级应用的需求,推出了微软事务服务器 (MTS: Microsoft Transaction Server),把应用系统的客户程序、应用构件和各种资源有机结合起来,为分布式企业应用提供了一种服务器端的构件运行和部署环境,COM 技术的发展,为了使Windows真正成为企业应用平台,微软推出了分布式网络应用体系结构(Windows DNA: Distributed interNet Application Architecture),DNA是一个完整的、多层的企业应用体系结构:包含工具、数据库、操作系统、编程模型和应用服务等随着Windows 2000的发布,微软进一步把COM、DCOM、MTS统一起来,形成了真正适合于企业级应用的构件技术:COM+可以认为:COM/DCOM + MTS = COM+COM+是一种中间件技术规约,提供操作系统级的分布式“服务”,COM 技术的发展,Window DNA,是一个服务器端的开发平台,包括Windows NT/2000/2003 提供运行环境和支持COM/DCOM MSMQ 消息队列产品,支持构件间异步通信MTS 管理构件的应用服务Microsoft Wolfpack 支持集群服务器的软件Microsoft SQL Server Microsoft IIS Web服务器Microsoft Management Console 部署和管理工具,Window DNA,COM+基本结构,COM+目录负载平衡驻留内存数据库对象池新的事件模型构件管理和部署JIT激活,COM+,MTS事务支持资源分发管理安全模型易于管理,远程支持 DCOM分布式构件服务,COM基于接口的编程模型基本的构件服务,COM(Component Object Model),组件对象模型,是一种以组件为发布单元的对象模型,这种模型使得各个软件组件可以用一种统一的方式进行交互COM是一种协议,它建立了一个软件模块同另一个软件模块之间的连接,提供了组件之间进行交互的规范,也提供了实现交互的环境当这种连接建立起来后,两个模块之间就可以通过“接口”的机制来进行通讯,这些接口既不需要静态的或动态的连接入口点,也不需要编码很复杂的地址,什么是COM?,全局唯一标识符(Global Unique IDentifier)来源于OSF的通用统一标识符UUID(Universal Unique IDentifier),是一个128位整数用于标识COM对象(CLSID)和接口(IID)由于空间足够大, 冲突较小.可以用编程的方法生成具有唯一性的GUID VC: UUIDGEN.EXE, GUIDGEN.EXE对GUID值的传递通常通过引用进行,COM基本概念:GUID,基本概念:COM对象/COM构件/COM接口,基本概念:COM对象和COM构件,在COM规约中,“构件”和“对象”经常混淆,所谓COM对象是指符合COM规则的CoClass(构件类)的实例,每一个COM对象都有一个GUID,称为CLSID(CoClassID)COM构件是指以编译后的形式提供一组功能的COM对象独立于具体编程语言一个构件可以由多个类实现以二进制形式(DLL或EXE)发布可以在不妨碍客户的形式下被升级可以透明地在网络上被重新分配,COM接口是COM规范的核心内容,是COM对象显示出来的所有信息,是一组逻辑上相关的函数集合每一个接口都有一个GUID,称为接口标识符(简称IID:Interface IDentifier)COM接口具有不变性,只允许单继承一个COM对象可以实现多个接口,这体现了COM对象的多态性,这些接口由IUnknown接口来管理在C+中,可以用抽象基类来定义COM接口,基本概念:COM接口,新版本构件的处理,COM接口永远不会变化 :一个IID就是一个接口,当对组件进行升级时,一般不会修改已有的接口,而是加入一些新接口当下列条件中的任何一个变化时,应给新接口指定新IID接口中函数数目接口中函数顺序某个函数的参数某个函数参数的顺序某个函数参数的类型函数可能的返回值函数返回值的类型等不同版本接口的命名:在老名称后加一个数字,是所有COM对象都必须实现的接口,其它接口都直接或间接继承IUnknown(IID为00000000-0000-0000-C000-000000000046 )接口,包含三个基本操作AddRef:提供生存周期管理功能,增加对象引用计数Release:提供生存周期管理功能,用于释放对象QueryInterface:负责向客户提供接口查询功能,基本概念:IUnknown接口,IUknown接口的定义,定义在win32 SDK中的UNKNWN.h头文件中:interface IUnkown virtual HRESULT _stdcall QueryInterface( const IID&, void *ppv) = 0; virtual ULONG_stdcall AddRef() = 0; virtual ULONG_stdcall Release() = 0; ,微软接口定义语言MIDL(Microsoft Interface Definition Language)是定义COM接口的申述式语言通过独立于具体编程语言的方式来定义接口该语言基于OSF分布式计算环境(DCE)远程过程调用(RPC)的接口描述语言IDLCOM规范使用的IDL接口描述语言不仅可用于COM接口,同时还定义了一些常用的数据类型,也可描述自定义的数据结构,对于接口的成员函数,可以指定每个参数的类型、输入输出特性,甚至可支持变长度的数组的描述MIDL支持指针类型,与C/C+类似,基本概念:接口定义语言,接口定义例: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();,基本概念:接口定义语言,COM接口是一个二进制标准,客户同接口的连接并不是通过其名称或其成员函数的名称来实现的,而是通过其在内存块中的位置完成的COM接口是一个包含一个函数指针数组的内存结构,每一个数组元素包含的是一个由组件所实现的函数的地址C+通过纯抽象基类实现COM接口,实际上是定义了一个内存块的结构,但此内存只是在派生类中实现此抽象基类时才会被分配,派生类继承此抽象基类时将继承此内存结构,COM接口,虚拟函数表,COM接口的内存结构同C+编译器为抽象基类所生成的内存结构是相同的,对于如下利用纯抽象基类方式定义的接口interface IX virtual void _stdcall Fx1()=0; virtual void _stdcall Fx2()=0; virtual void _stdcall Fx3()=0; virtual void _stdcall Fx4()=0; ,提高接口实现的灵活性,实现抽象基类的类可能会将特定于实例的信息同vtbl一块保存,例子:一个实现接口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,&Fx1,&Fx2,&Fx3,&Fx4,Data1,Data2,pA,Fx1Fx2Fx3Fx4,CA,实例数据和vtbl一起保存,注意:COM组件决不会访问任何实例数据,在COM中,对一个组件的访问只能通过函数完成,绝不能直接通过变量纯抽象基类只有虚拟函数,没有实例数据,两个实例 共享同一Vtbl,所有COM接口都必须继承IUnknown接口,支持其定义的三个函数,而且必须是接口vtbl的前三个函数,IUnknown * CreateInstance();创建构件时,客户可以使用CreateInstance,而不是newCreateInstance的定义: IUnknown * CreateInstance() IUnknown * pI = static_cast (new foo); pI - AddRef(); return pI; ,IUnknown指针的获取,一个COM对象(构件)可以实现多个接口.使用QueryInterface查询某个构件是否支持某个特定的接口 void foo(Iunknown * pI)IX * pIX = NULL;HRESULT hr = pI-QueryInterface(IID_IX, (void *)&pIX);If (SUCCEEDED(hr) pIX-Fx(); ,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号