• 学前教育
  • 小学学习
  • 初中学习
  • 高中学习
  • 语文学习
  • 数学学习
  • 英语学习
  • 作文范文
  • 文科资料
  • 理科资料
  • 文档大全
  • 当前位置: 雅意学习网 > 数学学习 > 正文

    COM组件探究与接口实现|封装COM组件

    时间:2020-03-11 07:31:54 来源:雅意学习网 本文已影响 雅意学习网手机站

       摘要:在COM组件模型中,接口是最为重要的概念,在整个应用系统中起决定性作用,外界和组件方所有的交互都通过接口实现,因此接口设计的优劣直接影响组件的质量。接口是一组方法的集合,其方法也称为接口成员函数。COM组件为COM对象提供活动空间,COM对象以COM接口的方式提供服务。在COM中接口就是一切,对于客户来说,一个组件就是一个接口集,客户只要知道接口就可以对组件进行操作了。随着COM技术的不断完善,COM技术将得到更广泛的应用。
       关键词:COM组件;COM接口;IUnknown
       中图分类号:TP311.52 文献标识码:A 文章编号:1007-9599 (2011) 23-0000-02
       COM Components Study and Interface Realization
       Yang Fengmei
       (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 world and interact with the component side through all of the interface,the interface 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 everything,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 used.
       Keywords:COM components;COM interface;IUnknown
       一、引言
       COM是一个可以用于构造软件组件的模型,它由微软提出并发布,在数十年的时间内不断成长,到目前为止,COM技术已经和Java Bean、CORBA一起被并称为组件开发的三大标准。COM具有构件开发语言的无关性、跨平台性、构件运行位置和进程透明性、组件配置灵活性和运行安全性等特性,而且它有流行的开发环境支持(如VC、VB、Delphi等),对比其他组件技术,COM开发过程简单,容易入手,这些因素使得COM成为当前广受欢迎的组件开发技术之一。在COM组件模型中,接口是最为重要的概念,在整个应用系统中起决定性作用,外界和组件方所有的交互都通过接口实现,因此接口设计的优劣直接影响组件的质量。良好的接口的设计有利于提高组件的可用性、可理解性,有利于软件的维护、扩展和重用;不合理的设计则会导致组件难于理解、难于选择,从而影响整个软件的可靠性。本文将通过对组件技术的研究,分析实现COM接口的方法。
       二、COM简介
       组件对象模型(Component Object Model,COM)是微软公司于1993年创建的一种软件组件结构标准。目的是为了使应用程序更易于定制。把一个庞大的应用程序分成多个模块,每一个模块保持功能独立性,在协同工作时,通过相互之间的接口完成实际的任务。我们把每一个这样的模块称为COM组件,这些组件可以在不同的计算机上用不同的程序设计语言单独开发,单独编译,单独调试和测试。当所有的组件开发完成后,把它们组合在一起就得到了完整的应用程序。COM是微软的ActiveX,DirectX以及OLE技术的基础,它被设计成一个动态互变组件的规范,为Windows程序模块之间的相互通讯提供了统一的标准,只要客户和组件共同遵循这一规范,双方就可以透明地通讯。用COM开发出来的组件实际上是一些小的二进制代码,可以给应用程序、操作系统以及其它组件提供一些服务。多个COM组件对象可以连接起来以形成应用程序或组件系统,并且组件可以在运行时、不重新链接或编译应用程序的情况下被卸下或替换掉。
       三、COM结构
       在COM标准中,引入了面向对象的思想,类似与C++中对象的概念,对象是某个类的一个实例,称为COM对象。接口是一组方法的集合,其方法也称为接口成员函数。COM组件为COM对象提供活动空间,COM对象以COM接口的方式提供服务。COM组件、COM对象、COM接口之间的关系如图1所示。
      
       图1:COM组件、对象、接口关系图
       每个COM组件包含多个COM对象,每个COM对象提供多个COM接口供客户使用。
       COM组件有两种,一是进程内组件,是一个DLL(动态连接库)文件;二是进程外组件,是一个EXE(可执行程序)文件。当另外的组件或普通程序(即组件的客户程序)调用组件的功能时,它首先创建一个COM对象,然后通过该对象所实现的COM接口调用它所提供的服务。进程内组件是DLL程序,当客户调用进程内组件程序的方法时,进程内组件和客户程序在同一进程地址空间内,客户程序得到的接口指针直接指向组件的Vtable其效率非常高。进程外组件是EXE程序,它不能提供引出函数供其它程序调用,因此进程外组件必须支持两个命令行参数/RegServer和/UnregServer,以便完成组件的注册和取消注册操作。
       四、COM接口定义与实现
       (一)接口的定义
       在COM中接口就是一切,对于客户来说,一个组件就是一个接口集,客户只要知道接口就可以对组件进行操作了。
       接口类似与C++的抽象基类,定义一个接口意味着定义一个抽象方法的集合,这些方法会被一个类实现,用户会调用这个类的一个实例(对象)。接口是用IDL(Interface Description Language),接口描述语言)来定义的。下面是一个简单的接口文件:
       total・idl.
       import“unknwn.idl”
       [object,uuid(DDC68871-E08E-11cf-A535-00AA00615B03)]
       interface Itotal:Iunknown
       {
       HRESULT inputdata([in] short n);
       HRESULT sum([out] short *psum);
       }
       上面定义了接口Itotal。因为任何接口都是从IUnknown接口继承的,所以在文件的开头包含了import指令(类似C++的include指令)。每个COM接口必须有2个IDL属性,object属性说明该接口是COM接口,uuid属性用128位的全局唯一标识符GUID(Globally Unique Identifier)在全球范围内唯一的标识一个接口。接口方法的参数具有方向属性,in属性表示参数是输入到服务器的参数,out属性表示参数是从服务器输出的参数。上面的接口有两个方法inputdata和sum,参数n输入到服务器,然后服务器计算1+2+…+n的和,通过psum参数把计算结果传回到客户。HRESULT返回值检查执行是否成功或失败。接口文件是由MIDL・EXE程序编译的。
       (二)接口的内存结构
       客户用一个指向接口的指针来调用接口方法,接口指针又指向另一个指针(pVtable),
       pVtable指向接口函数表(又称虚拟函数表,Vtable),接口函数表的每一个项为4个字节的函数指针,每个函数指针与对象的函数实现连接起来(如图2所示)。
      
       图2:接口的内存结构
       (三)COM接口的特性
       COM最重要的特点是一个接口一旦公布将永远保持不变.组件升级时,现有的接口不需改变,而只需加入一些新的接口。在COM中,用一个128比特的全局唯一标识符(GloballyUnique Identifier,GUID)的结构来标识一个接口,称为接口标识符(Interface Identifier).根据定义,GUID在时间和空间上都是唯一的,这样就可以保证每个接口标识符都是唯一的。微软提供了两个产生GUID的程序:命令行方式的GUIDGEN.EXE和对话框方式的GUIDGEN.EXE.另外,在微软的集成编程环境Visual Studio中编写COM组件时,系统会自动生成GUID,并加入到源程序中。若两个不同的组件支持同一个接口,客户就可以使用相同的代码处理其中任何一个组件,这就是组件的多态性。任何COM接口都可实现IUnknown接口,因此COM库可以按一种统一的方式来处理任意COM组件。
       (四)IUnknown接口
       对于COM组件,只要保持接口不变,对其实现可以任意修改,而不会影响到客户对该组件的调用。真正的COM接口必须继承接口Iunknown接口包含三个成员函数QueryInterface、AddRef和Release.QueryInterface的功能是查询某个组件是否支持某个特定的接口,若支持该函数将返回一个指向该接口的指针,否则返回值将是一个错误代码,客户对于某个组件不可能知道其支持的全部接口,通过该函数可以查询是否支持某个特定的接口。AddRef和Release的功能是管理组件的生命周期。实现的是一种名为引用计数的内存管理技术,可以使组件能自行决定何时将自己删除。引用记数是一个整数,当对象被创建时,引用记数开始从0增加。当调用AddRef时,对象的引用记数加1。当调用Release时,对象的引用记数减1。当对象的引用记数为0时,对象可以自己释放自己。用一个矩形表示COM对象,对象所支持的接口用一个小圆圈表示,在矩形和小圆圈之间用一条线相连,这样就能很好地表示对象和接口之间的关系。则ftotal对象可以表示为图3。
      
       图3:ftotal对象表示形式
       (五)接口的实现
       不同的程序开发人员对不同的语言有自己的喜好,只要选择的语言支持COM组件的生成,我们就可以用此语言来开发COM程序。用C++语言,可以用类来实现COM接口,如下所示:
       class Ctotal:public Itotal
       { public:
       Ctotal();
       virtual ~Ctotal();
       HRESULT-stdcall QueryInterface(REFIID riid,void **ppv); //REFIID是接口的GUID
       unsigned long-stdcall AddRef();
       unsigned long-stdcall Release();
       HRESULT-stdcall inputdata(short n);
       HRESULT-stdcall sum( short *psum);
       private: long m-cref; //m-cref是对象的引用记数
       }
       每一个类也用GUID来唯一标识,称为CLSID。有了类以后,就可以定义类的对象(COM对象)ftotal=newCtotal。
       四、结束语
       通过对组件的研究,可以知道程序的成功运行正如我们希望的那样,一次开发,多次使用,提高了软件的复用率,增强了软件的可靠性,即使采用不同的开发语言,也可以毫不费力地在各自的环境中实现,这将极大地提高软件开发速度,降低费用。然而接口设计中遇到的间题也还不少,如接口的复杂性、接口度量、兼容性等依然是值得进一步考虑和研究的。通过对COM接口及组件的一些基本论述,对COM技术已经有了进一步认识。COM是一种技术,但也可以说是一种编程思想,COM技术的出现使应用程序的开发、维护、扩展更加容易。在COM组件框架的应用程序中,应用程序由组件拼装而成,由于COM组件的语言无关性、接口的多态性和不变性,使得任何语言开发的COM组件都可以被用不同语言开发的应用程序调用,随着COM技术的不断完善,COM技术将得到更广泛的应用。

    推荐访问:探究 组件 接口 COM组件探究与接口实现 com组件+回调接口 为什么要用接口回调

    • 文档大全
    • 故事大全
    • 优美句子
    • 范文
    • 美文
    • 散文
    • 小说文章