CORBA技术及在Delphi中的实现
【打印文章】
秦志强
一、 引言
进入90年代以来,分布式组件对象标准极大地推动了以异构环境下协同工作为目标的虚拟环境研究。当今国际上已有三大分布式组件对象标准:一个是OMG组织推出的CORBA,即公共对象请求代理结构;一个是微软公司推出的DCOM,即分布式组件对象模型;还有一个是SUN公司推出的用JAVA语言开发开发的分布对象模型RMI,即远程方法激活。在三种分布式组件标准中,CORBA标准在结构标准实现的灵活性、跨语言能力、跨平台实现及安全性等方面的综合对比中优于DCOM和RMI,所以它往往成为真正的开放式结构应用程序的首选标准。本文主要讨论CORBA技术,并探讨了在Delphi中的实现方法。
二、 CORBA及相关技术
1、 CORBA的概念和用途
CORBA是OMG(Object Management Group)提出的一个分布式对象技术的规范,它是针对多种对象系统在分布式计算环境中如何以对象方式集成而提出的,它为对象管理定义了一个对象模型-OMG参考模型(OMG reference model)及其框架结构。该模型由ORG、对象服务、公共设施、领域接口及应用对象等5个主要部分组成。该模型及其框架结构将面向对象技术与客户/服务器计算模式结合起来,有效地解决了对象封装和分布式计算环境中资源共享、代码可重用、可移植及应用间地互操作性等问题。
2、 Com与Corba的比较
COM和CORBA都提供了一种创建分布式、面向对象的结构体系的方法,即它们都提供了从另一台机器中调用一个存在于二进制可执行文件中的对象方法。COM和CORBA都有许多用于支持它们的实用程序,例如MTS、ITS、调度程序、注册表。然而,每个结构体系都有各自独特的优点。
COM作为一项以Microsoft和Windows为基础的技术,具有归并到全世界90%的台式计算机的优势,它不受约束并且拥有广泛的厂家支持。
CORBA可能是目前可真正提供全方位支持的较好系统。如,它在处理故障及加载分布方面比COM有更好的支持。当然,CORBA还是比COM更好地支持广泛的操作系统。
3、 Org
ORG(Object Request Broker)常被称作一组服务的类名称,这组服务用于连接客户和服务器,并在客户和服务器之间来回传递方法调用和信息。
因为ORG是在DLL里实现的,所以,它们驻留在服务器和客户实现的处理中,它们必须安装在所有使用CORBA的客户及服务器上。
4、 Smart Agent?
Smart Agent是一项用来帮助客户自动对一个服务器进行定位的目录服务。其宗旨在于帮助客户机连接到服务器上,并执行其他一些类似负载均衡和重启崩溃对象这样的重要任务。即:Smart Agent具有目录服务,它能查出对象的位置,并把客户程序接到这些对象上。
5、 代理、存根和框架
在一个分布式的应用程序里,客户不能直接与服务器通信,同样一个服务器也不直接与客户交流。函数的调用及其参数都必须通过网络从一个应用程序中调度到另一个应用程序里。为了使该体系工作,客户和服务器两边都要建立一个代理。客户这边的代理称为存根(Stub),而服务器的代理则叫框架(Skeleton)。
存根实现方法如下:
function TcorbaTestObjectStub.GetName:WideString;
var
OutBuf:ImarshalOutBuffer;
InBuf:ImarshalInBuffer;
Begin
Fstub.createRequest('GetName',True,OutBuf);
Fstub.Invoke(OutBuf,InBuf);
Result:=UnmarshalWideText(InBuf);
End;
其中,Fstub数据成员来自于CorbaObj单元,在CorbaObj单元里它被声明为Istub类型。Fstub.createRequest方法用一个ImarshalOutBuffer类型的变量与想调用的函数的名字进行连接,这个变量可通过Internet传输。当该包建好后,就可以调用Invoke将信息传递到服务器并从同一个服务器中得到反馈信息。ImarshalInBuffer类型的InBuf变量包含了该反馈信息,可以调用UnmershalWideText。
框架的目的在于接收由存根对Invoke的调用而传来的消息。当它收到消息后,就调用真正的GetName方法,接着把结果包装起来迅速传给客户,实现方法如下:
Procedure
TcorbaTestSkeleton.GetName(constInBuf:ImarshalInBuffer;Cookie:Pointer);
Var
OutBuf: ImarshalOutBuffer;
Retval: WideString;
Begin
Retval:=Fintf.GetName;
Fskeleton.GetReplyBuffer(Cookie,OutBuf);
OutBuf.PutWideText(PwideChar(Pointer(Retval)));
End;
该程序分两步:
第一步:是从由Delphi自动设置的内部Fintf变量调用Get Name。Fintf仅仅是一个指向对象真实接口的指针。因为现在正处于服务器本身当中,因此,这是指向你所创建的实际对象的真实指针。
第二步:是将函数结果包装起并把它送回客户端,你将通过调用GetReplyBuffer和PutWideText完成该步骤。
6、 接口定义语言
接口定义语言(IDL)用于定义对象的接口,一个对象的接口指定该对象所支持的类型和操作,因而唯一定义了可用于该对象的请求形式。所有接口均隐式从CORBA模块中定义的Object接口中导出。
接口定义语言(IDL)的重要特征是其语言无关性,这使得对象可用不同的程序设计语言构造,且依然可相互通信,CORBA规范通过精确定义基本数据类型的长度,保证了在异构硬件平台上的互操作性。
三、 Delphi4中CORBA客户和服务器对象分布式工作机理
Delphi4工具支持CORBA标准,并为开发分布式应用程序提供了优良的环境。
图中客户和服务器两边都有一个代理。在Delphi4中,真实的存根与框架由Delphi4在创建CORBA对象时自动生成,并存放于CORBA对象_TLB.pas命名的文件中。存根与框架这对代理使客户感觉到好象真的与服务器直接通信,而它们的具体实现存在于服务器中。在Delphi4中ORB就是一组动态连接库,它们提供了网络传输层以下的通信机制。图中的OsAgent不是CORBA标准中的一部分,它的宗旨在于帮助客户机连接到服务器上去,并执行其它一些类似于负载均衡和重启崩溃等重要任务。当客户程序启动时,它使用ORB与OsAgent进行通信,使客户机自动连接到服务器上去,换句话说,OsAgent有目录服务功能,它能够自动找出对象的位置。应该指出的是,在实现分布式应用程度过程中,客户、服务器双方必须都安装有OsAgent程序,同时必须在通信之前启动了OsAgent服务。
四、 Delphi中两个重要的CORBA存储库
1、 Interface Reposity
Interface Reposity是一个用来存储有关对象的具体内容的地方。该资源库有三种用途:
1)、它为用户提供了一个场所,用户可以通过它来查看有关对象的详细信息。
2)、它提供了允许CORBA对方法调用进行类型检查的机制。
3)、它允许在运行期间对一个对象进行动态调用。
2、 Implementation Reposity
Implementation Reposity用来存储有关服务器的信息,这样服务器才能自动被Smart Agent启动,尤其是Implementation Reposity含有有关服务器的名字及用来找到它的可执行程序的路径信息。
当一项叫做OAD(即Object Activation Daemon)的CORBA服务器需要启动一个服务器时,OAD可以通过查看Implementation Reposity,并执行其中的文件来给服务器定位。换句话说,Implementation Reposity中存储着服务器的路径、可执行文件名及其他一些相关的信息,如果该服务器并未运行但却已在Implementation Reposity中注册过了,那么Smart Agent可以请求OAD来启动它。
五、 在Delphi中使用CORBA
为在Delphi中使用Corba技术,首先要创建服务器和客户,然后在此基础上创建各类实用程序。服务器和客户程序创建如下:
1、 服务器的创建
创建CORBA服务器所需的步骤如下:
1)、创建一个标准的应用程序并保存到自己的目录中。在该目录下建立两个附加子目录,一个叫Client,另一个叫Server。
2)、选择New|File,转到multitier页面,选择CORBA Object。当提示为对象取个名字的时候,应叫它CorbaTestObject,而让其他所有设置都处在默认的状态。
3)、打开Type Library Edit建立一个叫GetName的方法,它是IcorbaTestObject的一部分,小心别把它加到根上(Project Name).在此处编辑器是不允许一个方法加入的。
4)、该方法的返回类型应该是一个WideString。在Parameters页面的靠近顶端处设置它,这个方法的COM IDL是:HRESULT_Stdcall GetName([out,retval])BSTR *Name).而Delphi的声明是:Function GetName:WideString[dispid$00000001];safecall;这个方法自动说明为Safecall,但这在Type Library Editor中可能不太明显。
5)、单击Refresh按钮来产生方法的代码。完成这个方法的实现代码,让它返回一个对象名字的字符串。
6)、存盘,执行一次该程序。到这一阶段,该应用程序必须提前运行,否则客户就无法访问它。
2、 客户程序的创建
建立一个客户应用程序的步骤:
1)、启动一个正规的应用程序
2)、将由服务器创建的XXX_TLB.pas文件加到主窗体的uses子句中,然后再把CornInit也加到uses子句中。
3)、创建一个按钮响应方法。
4)、从XXX_TLB.pas文件中获得CreateInstance的调用,并将它复制到按钮响应方法中,去掉无关的存储单元,保存其返回的类型。
5)、声明一个叫FcorbaTest的局部变量,它是属于对象返回的类型,在此处便是ICorbaTestObject,将从TLB中复制来的函数的返回值赋给它,将你所选择的任何字符串输送给CreateInstance.
FcorbaTest:=TcorbaTestObjectCorbaFactory.CreateInstance('CorbaTest');
6)、写一段代码从对象实例中调用方法,该对象实例是从TLB中复制的函数中返回的。
7)、确定Smart Agent已启动,然后启动服务器与客户应用程序,接着调用服务器所定义的方法(注:除非正在使用OAD,否则要明确启动服务器与客户应用程序,因为它是不会自动启动的)。
四、结束语
CORBA通过ORG机制为远程对象的激活提供了基本机制,而不管实现这些对象所使用的平台和技术,而且CORBA还为对象管理提供了一组对象服务,如名字服务、事件服务、事物处理服务及永久对象服务等。因此该技术为分布式应用的开发提供了强有力的支持,具有广泛的应用基础。
一、 引言
进入90年代以来,分布式组件对象标准极大地推动了以异构环境下协同工作为目标的虚拟环境研究。当今国际上已有三大分布式组件对象标准:一个是OMG组织推出的CORBA,即公共对象请求代理结构;一个是微软公司推出的DCOM,即分布式组件对象模型;还有一个是SUN公司推出的用JAVA语言开发开发的分布对象模型RMI,即远程方法激活。在三种分布式组件标准中,CORBA标准在结构标准实现的灵活性、跨语言能力、跨平台实现及安全性等方面的综合对比中优于DCOM和RMI,所以它往往成为真正的开放式结构应用程序的首选标准。本文主要讨论CORBA技术,并探讨了在Delphi中的实现方法。
二、 CORBA及相关技术
1、 CORBA的概念和用途
CORBA是OMG(Object Management Group)提出的一个分布式对象技术的规范,它是针对多种对象系统在分布式计算环境中如何以对象方式集成而提出的,它为对象管理定义了一个对象模型-OMG参考模型(OMG reference model)及其框架结构。该模型由ORG、对象服务、公共设施、领域接口及应用对象等5个主要部分组成。该模型及其框架结构将面向对象技术与客户/服务器计算模式结合起来,有效地解决了对象封装和分布式计算环境中资源共享、代码可重用、可移植及应用间地互操作性等问题。
2、 Com与Corba的比较
COM和CORBA都提供了一种创建分布式、面向对象的结构体系的方法,即它们都提供了从另一台机器中调用一个存在于二进制可执行文件中的对象方法。COM和CORBA都有许多用于支持它们的实用程序,例如MTS、ITS、调度程序、注册表。然而,每个结构体系都有各自独特的优点。
COM作为一项以Microsoft和Windows为基础的技术,具有归并到全世界90%的台式计算机的优势,它不受约束并且拥有广泛的厂家支持。
CORBA可能是目前可真正提供全方位支持的较好系统。如,它在处理故障及加载分布方面比COM有更好的支持。当然,CORBA还是比COM更好地支持广泛的操作系统。
3、 Org
ORG(Object Request Broker)常被称作一组服务的类名称,这组服务用于连接客户和服务器,并在客户和服务器之间来回传递方法调用和信息。
因为ORG是在DLL里实现的,所以,它们驻留在服务器和客户实现的处理中,它们必须安装在所有使用CORBA的客户及服务器上。
4、 Smart Agent?
Smart Agent是一项用来帮助客户自动对一个服务器进行定位的目录服务。其宗旨在于帮助客户机连接到服务器上,并执行其他一些类似负载均衡和重启崩溃对象这样的重要任务。即:Smart Agent具有目录服务,它能查出对象的位置,并把客户程序接到这些对象上。
5、 代理、存根和框架
在一个分布式的应用程序里,客户不能直接与服务器通信,同样一个服务器也不直接与客户交流。函数的调用及其参数都必须通过网络从一个应用程序中调度到另一个应用程序里。为了使该体系工作,客户和服务器两边都要建立一个代理。客户这边的代理称为存根(Stub),而服务器的代理则叫框架(Skeleton)。
存根实现方法如下:
function TcorbaTestObjectStub.GetName:WideString;
var
OutBuf:ImarshalOutBuffer;
InBuf:ImarshalInBuffer;
Begin
Fstub.createRequest('GetName',True,OutBuf);
Fstub.Invoke(OutBuf,InBuf);
Result:=UnmarshalWideText(InBuf);
End;
其中,Fstub数据成员来自于CorbaObj单元,在CorbaObj单元里它被声明为Istub类型。Fstub.createRequest方法用一个ImarshalOutBuffer类型的变量与想调用的函数的名字进行连接,这个变量可通过Internet传输。当该包建好后,就可以调用Invoke将信息传递到服务器并从同一个服务器中得到反馈信息。ImarshalInBuffer类型的InBuf变量包含了该反馈信息,可以调用UnmershalWideText。
框架的目的在于接收由存根对Invoke的调用而传来的消息。当它收到消息后,就调用真正的GetName方法,接着把结果包装起来迅速传给客户,实现方法如下:
Procedure
TcorbaTestSkeleton.GetName(constInBuf:ImarshalInBuffer;Cookie:Pointer);
Var
OutBuf: ImarshalOutBuffer;
Retval: WideString;
Begin
Retval:=Fintf.GetName;
Fskeleton.GetReplyBuffer(Cookie,OutBuf);
OutBuf.PutWideText(PwideChar(Pointer(Retval)));
End;
该程序分两步:
第一步:是从由Delphi自动设置的内部Fintf变量调用Get Name。Fintf仅仅是一个指向对象真实接口的指针。因为现在正处于服务器本身当中,因此,这是指向你所创建的实际对象的真实指针。
第二步:是将函数结果包装起并把它送回客户端,你将通过调用GetReplyBuffer和PutWideText完成该步骤。
6、 接口定义语言
接口定义语言(IDL)用于定义对象的接口,一个对象的接口指定该对象所支持的类型和操作,因而唯一定义了可用于该对象的请求形式。所有接口均隐式从CORBA模块中定义的Object接口中导出。
接口定义语言(IDL)的重要特征是其语言无关性,这使得对象可用不同的程序设计语言构造,且依然可相互通信,CORBA规范通过精确定义基本数据类型的长度,保证了在异构硬件平台上的互操作性。
三、 Delphi4中CORBA客户和服务器对象分布式工作机理
Delphi4工具支持CORBA标准,并为开发分布式应用程序提供了优良的环境。
图中客户和服务器两边都有一个代理。在Delphi4中,真实的存根与框架由Delphi4在创建CORBA对象时自动生成,并存放于CORBA对象_TLB.pas命名的文件中。存根与框架这对代理使客户感觉到好象真的与服务器直接通信,而它们的具体实现存在于服务器中。在Delphi4中ORB就是一组动态连接库,它们提供了网络传输层以下的通信机制。图中的OsAgent不是CORBA标准中的一部分,它的宗旨在于帮助客户机连接到服务器上去,并执行其它一些类似于负载均衡和重启崩溃等重要任务。当客户程序启动时,它使用ORB与OsAgent进行通信,使客户机自动连接到服务器上去,换句话说,OsAgent有目录服务功能,它能够自动找出对象的位置。应该指出的是,在实现分布式应用程度过程中,客户、服务器双方必须都安装有OsAgent程序,同时必须在通信之前启动了OsAgent服务。
四、 Delphi中两个重要的CORBA存储库
1、 Interface Reposity
Interface Reposity是一个用来存储有关对象的具体内容的地方。该资源库有三种用途:
1)、它为用户提供了一个场所,用户可以通过它来查看有关对象的详细信息。
2)、它提供了允许CORBA对方法调用进行类型检查的机制。
3)、它允许在运行期间对一个对象进行动态调用。
2、 Implementation Reposity
Implementation Reposity用来存储有关服务器的信息,这样服务器才能自动被Smart Agent启动,尤其是Implementation Reposity含有有关服务器的名字及用来找到它的可执行程序的路径信息。
当一项叫做OAD(即Object Activation Daemon)的CORBA服务器需要启动一个服务器时,OAD可以通过查看Implementation Reposity,并执行其中的文件来给服务器定位。换句话说,Implementation Reposity中存储着服务器的路径、可执行文件名及其他一些相关的信息,如果该服务器并未运行但却已在Implementation Reposity中注册过了,那么Smart Agent可以请求OAD来启动它。
五、 在Delphi中使用CORBA
为在Delphi中使用Corba技术,首先要创建服务器和客户,然后在此基础上创建各类实用程序。服务器和客户程序创建如下:
1、 服务器的创建
创建CORBA服务器所需的步骤如下:
1)、创建一个标准的应用程序并保存到自己的目录中。在该目录下建立两个附加子目录,一个叫Client,另一个叫Server。
2)、选择New|File,转到multitier页面,选择CORBA Object。当提示为对象取个名字的时候,应叫它CorbaTestObject,而让其他所有设置都处在默认的状态。
3)、打开Type Library Edit建立一个叫GetName的方法,它是IcorbaTestObject的一部分,小心别把它加到根上(Project Name).在此处编辑器是不允许一个方法加入的。
4)、该方法的返回类型应该是一个WideString。在Parameters页面的靠近顶端处设置它,这个方法的COM IDL是:HRESULT_Stdcall GetName([out,retval])BSTR *Name).而Delphi的声明是:Function GetName:WideString[dispid$00000001];safecall;这个方法自动说明为Safecall,但这在Type Library Editor中可能不太明显。
5)、单击Refresh按钮来产生方法的代码。完成这个方法的实现代码,让它返回一个对象名字的字符串。
6)、存盘,执行一次该程序。到这一阶段,该应用程序必须提前运行,否则客户就无法访问它。
2、 客户程序的创建
建立一个客户应用程序的步骤:
1)、启动一个正规的应用程序
2)、将由服务器创建的XXX_TLB.pas文件加到主窗体的uses子句中,然后再把CornInit也加到uses子句中。
3)、创建一个按钮响应方法。
4)、从XXX_TLB.pas文件中获得CreateInstance的调用,并将它复制到按钮响应方法中,去掉无关的存储单元,保存其返回的类型。
5)、声明一个叫FcorbaTest的局部变量,它是属于对象返回的类型,在此处便是ICorbaTestObject,将从TLB中复制来的函数的返回值赋给它,将你所选择的任何字符串输送给CreateInstance.
FcorbaTest:=TcorbaTestObjectCorbaFactory.CreateInstance('CorbaTest');
6)、写一段代码从对象实例中调用方法,该对象实例是从TLB中复制的函数中返回的。
7)、确定Smart Agent已启动,然后启动服务器与客户应用程序,接着调用服务器所定义的方法(注:除非正在使用OAD,否则要明确启动服务器与客户应用程序,因为它是不会自动启动的)。
四、结束语
CORBA通过ORG机制为远程对象的激活提供了基本机制,而不管实现这些对象所使用的平台和技术,而且CORBA还为对象管理提供了一组对象服务,如名字服务、事件服务、事物处理服务及永久对象服务等。因此该技术为分布式应用的开发提供了强有力的支持,具有广泛的应用基础。
本栏文章均来自于互联网,版权归原作者和各发布网站所有,本站收集这些文章仅供学习参考之用。任何人都不能将这些文章用于商业或者其他目的。( Pfan.cn )
【编程爱好者论坛】