COM组件探究与接口实现_第1页
COM组件探究与接口实现_第2页
COM组件探究与接口实现_第3页
COM组件探究与接口实现_第4页
COM组件探究与接口实现_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、com组件探究与接口实现摘要:在com组件模型屮,接口是最为重要的概念,在整个应用 系统中起决定性作用,外界和组件方所有的交互都通过接口实现, 因此接口设计的优劣直接影响组件的质量。接口是一组方法的集 合,其方法也称为接口成员函数。com组件为com对象提供活动空 间,com对象以com接口的方式提供服务。在com屮接口就是一切, 对于客户来说,一个组件就是一个接口集,客户只要知道接口就可 以对组件进行操作了。随着com技术的不断完善,com技术将得到 更广泛的应用。关键词:com组件;com接口; iunknowncom components study and interface real

2、izationyang fcngmci(ningxia yinchuan evening news, yinchuan 750004, china)abstract:the com component model, the interface is the most important concepts in the entire application system play a decisive role in the outside wor1d and interact with the component side through all of the interface, the i

3、nterface design will directly affect the quality of components interface is a collection of methods,the method is also known as the interface member functions com components to provide space for the com objects, com objects to com interface approach to service delivery in com, the interface is every

4、thing,for customers, a component is a set of interfaces, customers can know the interfaces of the components can operate as technology continues to improve com, com technology will be more widely usedkeywords:com components:com interface;iunknown一、引言com是一个可以用于构造软件组件的模型,它由微软提出并发布, 在数十年的时间内不断成长,到目前为止,

5、com技术已经和java bean、corba 起被并称为组件开发的三大标准。com具有构件开 发语言的无关性、跨平台性、构件运行位置和进程透明性、组件配 置灵活性和运行安全性等特性,而且它有流行的开发环境支持(如 vc、vb> dclphi等),对比其他组件技术,com开发过程简单,容 易入手,这些因素使得com成为当前广受欢迎的组件开发技术之一。 在com组件模型中,接口是最为重要的概念,在整个应用系统中起 决定性作用,外界和组件方所有的交互都通过接口实现,因此接口 设计的优劣直接影响组件的质量。良好的接口的设计有利于提高组 件的可用性、可理解性,有利于软件的维护、扩展和重用;不合理

6、 的设计则会导致组件难于理解、难于选择,从而影响整个软件的可 靠性。本文将通过对组件技术的研究,分析实现com接口的方法。二、com简介组件对象模型(component object model, com)是微软公司1993 年创建的一种软件组件结构标准。冃的是为了使应用程序更易于定 制。把一个庞大的应用程序分成多个模块,每一个模块保持功能独 立性,在协同工作时,通过相互z间的接口完成实际的任务。我们 把每一个这样的模块称为com组件,这些组件可以在不同的计算机 上用不同的程序设计语言单独开发,单独编译,单独调试和测试。 当所有的组件开发完成后,把它们组合在一起就得到了完整的应用 程序。com

7、是微软的activex, directx以及ole技术的基础,它被 设计成一个动态互变组件的规范,为windows程序模块之间的相互 通讯提供了统一的标准,只耍客户和组件共同遵循这一规范,双方 就可以透明地通讯。用com开发出来的组件实际上是一些小的二进 制代码,可以给应用程序、操作系统以及其它组件提供一些服务。多个com组件对象可以连接起来以形成应用程序或组件系统,并且 组件可以在运行时、不重新链接或编译应用程序的情况下被卸下或 替换掉。三、com结构在com标准中,引入了面向对象的思想,类似与c+中对象的概念, 对象是某个类的一个实例,称为com对象。接口是一组方法的集合, 其方法也称为接

8、口成员函数。com组件为com对象提供活动空间, com对象以com接口的方式提供服务。com组件、com对象、com接 口之间的关系如图1所示。图1: com组件、对象、接口关系图每个com组件包含多个com对象,每个com对象提供多个com接 口供客户使用。com组件有两种,一是进程内组件,是一个dll (动态连接库)文 件;二是进程外组件,是一个exe (可执行程序)文件。当另外的 组件或普通程序(即组件的客户程序)调用组件的功能时,它首先 创建一个com对象,然后通过该对象所实现的com接口调用它所捉 供的服务。进程内组件是dll程序,当客户调用进程内组件程序的 方法时,进程内组件和客

9、户程序在同一进程地址空间内,客户程序 得到的接口指针直接指向组件的vtable其效率非常高。进程外组 件是exe程序,它不能提供引出函数供其它程序调用,因此进程外 组件必须支持两个命令行参数/regserver和/unregserver,以便完 成组件的注册和取消注册操作。四、com接口定义与实现(-)接口的定义在com屮接口就是一切,对于客户来说,一个组件就是一个接口 集,客户只要知道接口就可以对组件进行操作了。接口类似与c+的抽象基类,定义一个接口意味着定义一个抽象方 法的集合,这些方法会被一个类实现,用户会调用这个类的一个实 例(对象)。接口是用 idl (interface descr

10、iption language), 接口描述语言)来定义的。下面是一个简单的接口文件:total idl.import “unknwn. idl”object, uuid (ddc68871-e08etlcf-a535-00aa00615b03) _interface itotal: iunknownhresult inputdata (in short n);hresult sum (out short *psum);上面定义了接口 itotalo因为任何接口都是从iunknown接口继承 的,所以在文件的开头包含了 import指令(类似c+的include指 令)。每个com接口必须有2

11、个idl属性,object属性说明该接口 是com接口,uuid属性用128位的全局唯一标识符guid (globally unique identifier)在全球范围内唯一的标识一个接口。接口方 法的参数具有方向属性,in属性表示参数是输入到服务器的参数, out属性表示参数是从服务器输出的参数。上面的接口有两个方法 inputdata和sum,参数n输入到服务器,然后服务器计算1+2+ +n的和,通过psum参数把计算结果传冋到客户。hresult返冋值 检查执行是否成功或失败。接口文件是由midi exe程序编译的。(二)接口的内存结构客户用一个指向接口的指针来调用接口方法,接口指针又

12、指向另 一个指针(pvtable),pvtable指向接口函数表(又称虚拟函数表,vtable),接口函数 表的每一个项为4个字节的函数指针,每个函数指针与对象的函数 实现连接起来(如图2麻)o图2:接口的内存结构(%1) com接口的特性com最重要的特点是一个接口一旦公布将永远保持不变.组件升级 口寸,现有的接口不需改变,而只需加入一些新的接口。在com中, 用一个128比特的全局唯一标识符(globallyunique identifier, guid)的结构来标识一个接口,称为接口标识符(interface identifier) 根据定义,guid在时间和空间上都是唯一的,这样 就可

13、以保证每个接口标识符都是唯一的。微软提供了两个产生guid 的程序:命令行方式的guidgen. exe和对话框方式的guidgen. exe. 另外,在微软的集成编程环境visual studio中编写com组件时, 系统会自动生成guid,并加入到源程序中。若两个不同的组件支持 同一个接口,客户就可以使用相同的代码处理其中任何一个组件, 这就是组件的多态性。任何com接口都可实现iunknown接口,因 此com库可以按一种统一的方式来处理任意com组件。(%1) iunknown 接口对于com组件,只要保持接口不变,对其实现可以任意修改,而 不会影响到客户对该组件的调用。真正的com接

14、口必须继承接口 iunknown接口包含三个成员函数queryinterface> addref和 release, queryinterface的功能是查询某个组件是否支持某个特 定的接口,若支持该函数将返回一个指向该接口的指针,否则返回 值将是一个错误代码,客户对于某个组件不可能知道其支持的全部 接口,通过该函数可以查询是否支持某个特定的接口。addref和 release的功能是管理组件的生命周期。实现的是一种名为引用计 数的内存管理技术,可以使组件能自行决定何时将自己删除。弓i用 记数是一个整数,当对象被创建时,引用记数开始从0增加。当调 用addref时,对象的引用记数加1。当

15、调用release时,对象的引 用记数减1。当对象的引用记数为0时,对象可以自己释放自己。 用一个矩形表示com对象,对象所支持的接口用一个小圆圈表示, 在矩形和小圆圈之间用一条线相连,这样就能很好地表示对象和接 口之间的关系。则ftotal对象可以表示为图3。图3: ftotal对象表示形式(%1) 接口的实现不同的程序开发人员对不同的语言有自己的喜好,只要选择的语 言支持com组件的生成,我们就可以用此语言来开发com程序。用 c+语言,可以用类来实现com接口,如下所示:class ctotal: public itotal public:ctotal ();virtual ctotal

16、 ();hresult-stdcall queryinterface (refiid riid, void *ppv); /refiid 是接口的 guidunsigned long-stdcall addref ();unsigned long-stdcall release 0 ;hresuit-stdcall inputdata (short n);hresult-stdcall sum ( short *psum);每一个类也用guid来唯一标识,称为clsido有了类以后,就可 以定义类的对象(com对象)ftotal二ncwctotal。四、结束语通过对组件的研究,可以知道程序的成功运行正如我们希望的那 样,一次开发,多次使用,提高了软件的复用率,增强了软件的可 靠性,即使采用不同的开发语言,也可以毫不费力地在各自的环境 中实现,这将极大地提高软件开发速度,降低

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论