COM底子[Java编程]
本文“COM底子[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
COM是一种二进制标准,努力于实施可彼此操作的对象.比方,COM认为一个对象的二进制筹划必须可以调用另一个COM对象里的服务.由于是对二进制筹划的一种描写,所以只要某种语言能生成这样的一种筹划,便可通过它实现COM对象.普通,程序员没必要关注象这样的一些初级细节,因为编译器可自动生成精确的筹划.比方,假定您的程序是用C++写的,那么大大都编译器都能生成符合COM标准的一张虚拟函数表格.对那些不生成可履行代码的语言,比方VB和Java,在运行期则会自动挂接到COM.
COM库也供应了几个基本的函数,比方用于成立对象或查找系统中一个已注册COM类的函数.
一个组件对象模子的基本目标包含:
■让对象调用其他对象里的服务
■答应新范例对象(或更新对象)无缝插入环境
第一点恰是面向对象程序计划要办理的问题:我们有一个客户对象,它能向一个服务器对象发出恳求.在这种情形下,“客户”和“服务器”这两个术语是在通例意义上利用的,并非指一些特定的硬件配置.关于任何面向对象的语言,第一个目标都是很简单到达的——只要您的代码是一个完好的代码块,同时实现了服务器对象代码以及客户对象代码.若改变了客户和服务器对象彼此间的沟通情势,只需简单地重新编译和链接一遍便可.重新启动利用程序时,它就会自动采取组件的最新版本.
但假如利用程序由一些未在自己掌握之下的组件对象构成,情形就会变得迥然有异——我们不能掌握它们的源码,并且它们的更新大概完好独立于我们的利用程序举行.比方,当我们在自己的程序里利用由其他厂商开辟的ActiveX控件时,就会面对这一情形.控件会安装到我们的系统里,我们的程序可以(在运行期)定位服务器代码,激活对象,同它成立链接,然后利用它.今后,我们可安装控件的新版本,我们的利用程序应当仍旧可以运行;即便在最糟的情形下,它也应礼貌地报告一条出错消息,比方“控件未找到”等等;普通不会莫名其妙地挂起或死机.
在这些情形下,我们的组件是在独立的可履行代码文件里实现的:DLL或EXE.若服务器对象在一个独立的可履行代码文件里实现,就需求由操作系统供应的一个尺度办法,从而激活这些对象.当然,我们并不想在自己的代码里利用DLL或EXE的物理名称及位置,因为这些参数大概常常发生改变.此时,我们想利用的是由操作系统保护的一些标识符.别的,我们的利用程序需求对服务器展示出来的服务举行的一个描写.下面这两个小节将辨别谈论这两个问题.
1. GUID和注册表
COM采取构造化的整数值(长度为128位)唯一性地标识系统中注册的COM项目.这些数字的正式名称叫作GUID(Globally Unique IDentifier,全局唯一标识符),可由特别的工具生成.此外,这些数字可以保证在“任何空间和时间”里举世无双,没有反复.在空间,是由于数字生成器会读取网卡的ID号码;在时间,是由于同时会用到系统的日期和时间.可用GUID标识COM类(此时叫作CLSID)大概COM接口(IID).固然名字差别,但基本概念与二进制构造都是相同的.GUID亦可在其他环境中利用,这里不再赘述.
GUID以及相关的信息都保存在Windows注册表中,大概说保存在“注册数据库”(Registration Database)中.这是一种分级式的数据库,内建于操作系统中,包容了与系统软硬件配置有关的大量信息.关于COM,注册表会跟踪系统内安装的组件,比方它们的CLSID、实现它们的可履行文件的名字及位置以及其他大量细节.此中一个对比重要的细节是组件的ProgID;ProgID在概念上近似于GUID,因为它们都标识着一个COM组件.辨别在于GUID是一个二进制的、通过算法生成的值.而ProgID则是由程序员定义的字串值.ProgID是伴随一个CLSID分配的.
我们说一个COM组件已在系统内注册,最最少的一个条件就是它的CLSID和它的履行文件已存在于注册表中(ProgID普通也已就位).在背面的例子里,我们主要任务就是注册与利用COM组件.
注册表的一项重要特点就是它作为客户和服务器对象之间的一个去耦层利用.操纵注册表内保存的一些信息,客户会激活服务器;此中一项信息是服务器履行模块的物理位置.若这个位置发生了变更,注册表内的信息就会呼应地更新.但这个更新历程关于客户来说是“透明”大概看不见的.后者只需直接利用ProgID或CLSID便可.换句话说,注册表使服务器代码的位置透明成为了大概.随着DCOM(分布式COM)的引入,在本地机械上运行的一个服务器乃至可移到网络中的一台远程机械,整个历程乃至不会惹起客户对它的丝毫注意(大大都情形下如此).
2. 范例库
由于COM具有动态链接的本领,同时由于客户和服务器代码可以脱离独立发展,所以客户随时都要动态侦测由服务器展示出来的服务.这些服务是用“范例库”(Type Library)中一种二进制的、与语言无关的情势描写的(就象接口和办法签名).它既可以是一个独立的文件(普通采取.TLB扩大名),也可以是链接到执路程序内部的一种Win32资源.运行期间,客户会操纵范例库的信息调用服务器中的函数.
我们可以写一个Microsoft Interface Definition Language(微软接口定义语言,MIDL)源文件,用MIDL编译器编译它,从而生成一个.TLB文件.MIDL语言的作用是对COM类、接口以及办法举行描写.它在名称、语法以及用处上都近似OMB/CORBA IDL.但是,Java程序员没必要利用MIDL.背面还会讲到另一种差别的Microsoft工具,它能读入Java类文件,并能生成一个范例库.
3. COM:HRESULT中的函数返回代码
由服务器展示出来的COM函数会返回一个值,采取预先定义好的HRESULT范例.HRESULT代表一个包含了三个字段的整数.这样便可以利用多个失利和成功代码,同时还可以利用其他信息.由于COM函数返回的是一个HRESULT,所以不能用返回值从函数调用里取回原始数据.若必须返回数据,可传送指向一个内存区域的指针,函数将在那个区域里填充数据.我们把这称为“外部参数”.作为Java/COM程序员,我们没必要过于关注这个问题,因为虚拟机会帮忙我们自动照管一切.这个问题将在后续的小节里报告.
以上是“COM底子[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:MS Java/COM集成
- ·下一篇文章:Java/COM集成
- ·中查找“COM底子”更多相关内容
- ·中查找“COM底子”更多相关内容