BCB中Corba Name Service利用要领
副标题#e#
由于在实验用BCB 4会见NameService时,碰着了一些奇奇怪怪的问题,而Visibroker所带的例子却可以用bcc32正常编译运行,俺抉择从新做一个措施看看问题出在那边。折腾了一夜,结论是做处事器照旧不消Corba Server wizard好。(我照旧不大白为什么?)
1、File| New, Multitier,Corba IDL File:
interface Order{
string Name();
};
存为order.idl
2、File|New, Consol Wizard,生成一个无vcl支持的consol应用。
3、Project|Add to project,选上刚写的order.idl,Project | Compile之。
4、File|New, Miltitier, Corba Object Implementation,IDL选刚写的order.idl,Interface选Order,为简明起见,其它的名字就不改了。确定,自动生成OrderServer.cpp。
5、在OrderServer.cpp中找到char* OrderImpl::Name(),在其函数体中写:
return "Hi, I am Test CorbaServer";
6、File | Save All,Unit1.cpp存为tcnServer.cpp,Project存为tcnServer.bpr。然后Make之。一个简朴的Corba Server就做好了。
7、测试运行一下,然后在MS-Dos方法下运行osfind.exe(应该在path里,不然到$(VBroker)\bin里找),这时会显示一系列的corba信息:
C:\>osfind
osfind: Found one agent at port 14000
HOST: YANGWU
osfind: Found 1 OADs in your domain
HOST: YANGWU
osfind: Following are the list of Implementations registered with OADs.
HOST: YANGWU
REPOSITORY ID: IDL:CorbaTester/DBServer2Factory:1.0
OBJECT NAME: DBServer2
osfind: Following are the list of Implementations started manually.
HOST: YANGWU
REPOSITORY ID: IDL:Order:1.0
OBJECT NAME: OrderObject
REPOSITORY ID: IDL:visigenic.com/Activation/OAD:1.0
OBJECT NAME: 61.132.58.166
#p#副标题#e#
8、确定无误后,回到IDE中,打开tcnServer.CPP,在#include的最后部门加上:
#include "CosNaming_c.hh"
然后,Project | Add To Project,将$(VBroker)\lib\name_br.lib加到工程中,这时tcnServer.CPP的顶部门呈现USELIB("..\..\..\vbroker\lib\name_br.lib"); 一行代码。个中的path与你的Visibroker安装目次及工程的生存位置都有关,以你的BCB生成的代码为准。
9、boa->obj_is_ready(&order_OrderObject);一句(如无意外应为26行),在这一行和下边的注释// Wait for incoming requests之间加上以下代码段,完成NamingContext成立、Name成立、Name绑定的事情:
//获取由呼吁行参数传入的NameComponent
const char* id = argv[1];
const char* kind = argv[2];
//取得默认的NamingContext工具
CosNaming::NamingContext_var context = CosNaming::NamingContext::_bind();
//生成一个Name工具
CosNaming::Name name;
//设定Name中只包括1个{id,kind}的NameComponet
name.length(1); name[0].id = id; name[0].kind = kind;
//将该名字绑定给措施中成立的工具实例order_OrderObject
context->bind(name, &order_OrderObject);
//在consol上输出已经绑定的名字。
cout << "The object is bound: \"" << name[0].id << "\" \"" << name[0].kind << "\"" << endl;
10、File | Save All,Project | Make之。
11、测试运行:进入MS-DOS方法,
start nameextf MyTester test.log //启动NamingContext Factory
start tcnServer MyName MyKind //启动处事器,指定其名字为{MyName, MyKind}
再用osfind查察就会发明最后的REPOSITORY里OBJECT NAME里呈现了一个OrderObject。
D:\Program Files\Borland\CBuilder4\Projects\tcn>osfind
osfind: Found one agent at port 14000
HOST: YANGWU
osfind: Found 1 OADs in your domain
HOST: YANGWU
osfind: Following are the list of Implementations registered with OADs.
HOST: YANGWU
REPOSITORY ID: IDL:CorbaTester/DBServer2Factory:1.0
OBJECT NAME: DBServer2
osfind: Following are the list of Implementations started manually.
HOST: YANGWU
REPOSITORY ID: IDL:omg.org/CosNaming/NamingContext:1.0
OBJECT NAME: Tester/1
REPOSITORY ID: IDL:omg.org/CosNaming/ExtendedNamingContextFactory:1.0
OBJECT NAME: Tester
REPOSITORY ID: IDL:visigenic.com/Activation/OAD:1.0
OBJECT NAME: 61.132.58.166
REPOSITORY ID: IDL:Order:1.0
OBJECT NAME: OrderObject
——————————————————————————–
下边就做个Client来试试会见。
1、File | New,Consol Wizard,做一个不支持VCL的consol应用。
2、Project| Add To Project,将选前边做server时写的order.idl加进来。
3、File | Save All,取名为tcnClientConsol.bpr(.cpp),存到server同一目次里。(在其下成立一个client子目次好像也不错)。
4、Edit | Use Corba Object,IDL File已经填好,假如差池手动改为order.idl,Interface选Order,Object Name写OrderObject(做处事器时指定的)。其余不改,确定。
5、留意此时主措施中已经完成了orb和boa的初始化事情。留意,注释掉boa->impl_ready();!
6、在主措施头部加上#include "CosNaming.hh",并将$(VBroker)\lib\name_br.lib加进Project。
7、在main()的谁人try的最后,加上如下代码:
#p#分页标题#e#
const char* id=argv[1];
const char* kind=argv[2];
CosNaming::NamingContext_var context=CosNaming::NamingContext::_bind();
CosNaming::Name name;
name.length(1); name[0].id=id;name[0].kind=kind;
CORBA::Object_var obj=context->resolve(name);
Order_var order=Order::_narrow(obj);
cout<< "test result: "<<order->Name()<< endl;
8、启动处事器并绑命名字给它,然后运行客户措施。要说明的是如下几点:首先我们在处事器中没有注销名字的行动,所以用绑定过的名字再来启动处事器就会提示已经绑定过的提示并自动退出,所以每次要用差异的名字来启动处事器,或每次都将test.log删掉后从新做。其次假如test.log不排除,那只要有一个处事器的实例在运行,就可以利用界说过的任何一个名字来取得处事器工具引用。第三测试进程可以不退出nameextf这个factory,省掉操纵,而假如不删除test.log的话,重启nameextf后,它会自动规复到上次退出时的状态,即所有的名字仍可利用。最后,假如举办名字绑定的谁人工具实例在内存中,那么利用该名字会见该工具速度最快,用其它名字则要慢许多(3~5秒)。
——————————————————————————–
做一个大度的Windows客户
1、File | New,Multitier,Corba Client,GUI型,IDL选order.idl。
2、Edit | Use Corba Object,Interface选Order,ObjectName填OrderObject。
3、File | Save All,Project存为tcnClient.bpr,unit1.cpp存为OrderClient.cpp
4、Form1上放一个Edit1,一个Button1,Button1的OnClick代码为:
Edit1->Text=AnsiString(order->Name());
5、这时一个简朴的CORBA CLIENT做好了,试一下Project | Make,Run。
6、在Form1上再放两个Edit(2,3),其Text别离为"MyName","MyKind",放两个Lable,注明这两个Edit别离代表"name[0].id","name[0].kind"。
7、在Form1上放个Button,Button2的OnClick代码为:
try {
Edit1->Text="正在查找名为:{"+Edit2->Text+","+Edit3->Text+"}的工具";
CosNaming::NamingContext_var context = CosNaming::NamingContext::_bind(); //取根名字空间
CosNaming::Name name;
char id[32],kind[32];
strcpy(id ,Edit2->Text.c_str());
strcpy(kind ,Edit3->Text.c_str());
name.length(1);
name[0].id = id;
name[0].kind = kind; //以大将Edit2,Edit3的内容构成一个名字,存在name中。
CORBA::Object_var object = context->resolve(name); //求解这个名字,获得对CORBA工具的引用
Order_var test = Order::_narrow(object);
if(!CORBA::is_nil(test)) {Edit1->Text=AnsiString(test->Name()); }
else Edit1->Text="会见失败!";
}
catch(const CORBA::Exception& e)
{
ShowMessage(e._description.name());
exit(1);
}
——————————————————————————–
样本工程源码(内含consol Server、WinGUI Server、consol Client、WinGUI Client)