BCB情况下CORBA实做之客户端
副标题#e#
成立一个CORBA客户端
当你写一个CORBA客户时,第一步是确定客户措施可以与客户机上的ORB软件攀谈。要做到这一点,利用CORBA Client wizard。选择File|New并从New Item对话框的Multitier页选择标签为CORBA Client的图标。这个领导让你说明是想成立一个节制台应用措施或是一个窗口应用措施。
正如CORBA处事器措施,你可以指定CORBA客户是否利用VCL类。假如不选VCL复选框,所有生成的代码均可被移植到其它平台上。
在CORBA Client wizard中插手任何所有界说了你想用的处事器工具界面的IDL文件。但也可以不利用任何IDL文件而成立CORBA客户应用措施(确切的说是插手一个生成客户单位到工种中)。这不是首选的要领。当工程包括处事器界面的IDL文件时,你可以用该领导来绑定随处事器上的工具上。
留意:假如你开始CORBA客户工程时没有插手IDL文件,还可以在任何时候用Project|Add to Project插手它。
CORBA Cleint wizard老是成立指定范例的客户端工程,将CORBA库加进工程文件并插手以下起动代码以初始化ORB(Object Request Broker工具请求署理)。
CORBA::ORB_var orb= CORBA::ORB_init(argc,argv);
假如你想通过CORBA处事器的CALLBACK界面的话,要在客户措施中初始化BOA(根基工具配适器)。只要在领导中选上适当的框就可以做到了。 下步,用和写其它CBuider应用措施沟通的要领举办应用措施编写。不外,当你利用界说在处事器应用中的工具的时候,不是直接和工具实例打交道,而是取得一个对CORBA工具的引用并利用它来事情。有两种要领可以取得对处事器工具的引用,这和你用哪种绑定相关:
假如利用静态绑定,你可以挪用CORBA Object wizard(Edit|Use CORBA Object)。静态绑定比动态快,而且提供编译时范例查抄、代码完整(code_completion)等长处。
然而,总有你要到运行时才知道想用的界面或工具的时候,这时就要用动态绑定了。动态绑定利用一个通用的CORBA工具,它用一种名为ANY的非凡CORBA范例将请求传给处事器。
利用存根
存根类是在编译IDL文件时自动生成的。他们界说在生成的客户端文件里,这些文件名字为xxx_c.cpp和xxx_c.hh。
留意:可以让C++BUILDER只成立客户文件(存根)而不要处事器文件,这要通过Project Options对话框的CORBA页来设定。
当写一个CORBA客户端时,不必编辑生成的客户端文件里的代码,相反,在用到时实例化存根类。这要通过选择Edit|Use CORBA Object调出Use CORBA Object wizard。
在这个工具利用领导中,指明包括所需界面的IDL文件,并选择要用的界面。假如只想绑定到特命名字的CORBA工具实例,可以可选的提供一个名字给CORBA工具。
Use CORBA Object wizard让你从以下绑定机制中选择:
假如客户端措施是VCL可用型的窗口应用措施,可以在措施窗体(form)中建设一个属性生存你的CORBA工具存根类的一个实例。你可以把这个属性看成CORBA处事器工具的实例来用。
假如成立的是节制台应用措施,领导会在你的main()函数里作为变量来示例存根类。相似的,它可以把存根类示例为WinMain()中的变量,假如是窗口应用措施的话。
不管是Windows照旧Console应用,领导可以把一个属性(property)插手到任何指定单位中的某个类中或起草一个含有一个代表存根实例属性的新类。
#p#副标题#e#
不管用哪种机制,领导插手须要的头文件并生成代码,这些代码绑定一个CORBA处事器工具的存根变量或属性。譬喻,下边的代码在节制台措施的main()中示例了名为MyServerObj的处事器界面的存根。
#include <corba.h>
#include <condefs.h>
#include MyServerObj_c.hh?
#pragma argsused
int main(int argc, char* argv[])
{
try
{
// Initialize the ORB
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
MyServerObj_var TheObject = MyServerObj::_bind("InstanceName");
}
catch(const CORBA::Exception& e)
{
cerr << e << endl;
return(1);
}
return 0;
}
留意:假如拷贝绑定代码到措施的其它部门,要确生存根变量是局域变量或类的数据成员。不要利用全局存根变量,因为它们在orb变量释放前不释放他们的CORBA引用计数。假如非要用全局存根变量,务必在orb释放之前将变量设为NULL以清除绑定。
假如你的客户应用措施只包罗生成的客户单位(xxx_c),就不能用CORBA Object wizard绑定随处事器工具。相反要本身动手写这些代码。你也许想写本身的绑定代码以操作VisiBroker的绑定选项。(譬喻:可以指定特定的处事器,克制CORBA毗连丢失时的自动重绑定处事器特性,等等)。详情见VisiBroker文档。
利用动态请求界面(DII)
#p#分页标题#e#
dynamic invocation itnerface(DII)答允客户端应用挪用处事器工具,并且不利用明晰套接(marshal)界面挪用的存根类。因为DII必需在客户发送请求之前编码所有范例信息及解码处事器的信息,所以要比用存根类慢。
要在客户端应用中利用DII,必需:
1、成立一个公用CORBA工具,它的浸染雷同于存根工具,除了其实现中不包括套接请求。须要提供工具的响应ID以说明哪个工具将收到DII请求:
CORBA::Object_var diiObj;
try
{
diiObj = orb->bind("IDL:ServerObj:1.0");
} catch (const CORBA::Exception& E)
{
// handle the bind exception.
}
2、接着,用这个公用CORBA工具为其代表工具的特定要领成立一个请求工具:
CORBA::Request_var req= diiObj->_request("methodName");
3、下面,加上该要领的所有参数。参数被加到范例为CORBA::NVList_ptr的请求(request)上。每个参数都是CORBA::Any范例的,Any类就似于BCB Variant。要求CORBA::Any范例是因为一个有名字值清单(CORBA::nvlIST)必需打点任何参数清单,个中大概包罗任何范例的值。
CORBA::Any arg;
arg <<=(const char *)"argvalue";
CORBA::NVList_ptr arguments=req->arguments();
argmenets_>ad_value("arg1",arg,CORBA::ARG_IN);
4、此刻挪用请求:
req_>invok();
5、最后,查抄是否有错并提取功效:
if(req->env()->exception())
//handle exeption
else
{
CORBA::Any_ptr pRetVal=req->result()->value();
CORBA::float val;
Any_ptr >>=val;
}
动态挪用界面详见VisiBroker Developer’s Guide