您的位置:首页 > 大数据 > 人工智能

在Windows下使用OmniORB+VC6开发CORBA http://hi.baidu.com/billyboy/item/4bf406dfd792d8e4785daa7b

2012-11-04 21:02 281 查看
首先需要到http://omniorb.sourceforge.net/下载一个win32的OmniORB。我下载的是的文件名是"omniORB-4.1.0-x86_win32_vc6.zip"。然后解压缩,我吧整个包解压缩的"C:\"。

第二步,设置环境变量。想要在cmd中使用omniidl编译器需要先设置path。path的值设置如下:将“C:\omniORB-4.1.0\bin\x86_win32”加入到path中。

第三步,使用记事本写一个time.idl文件。文件内容如下:

interface Time{

short get_gmt();

};

idl文件定义了的Time接口,其中包含一个get_gmt()方法。

第四步,在cmd中对idl进行编译:进入time.idl文件所在目录,使用omniidl -bcxx time.idl 对time.idl进行编译。其中-bcxx告诉编译器将idl映射为C++,如果编译没有错误,则会在同一个目录下生成两个文件:分别是time.hh,和timeSK.cc。time.hh是所有的接口,类型的定义所在的文件,服务器和客户端的实现都需要这两个文件。

第五步,修改time.hh和timeSK.cc。将两个文件的后缀名分别改成.h和.cpp并在timeSK.cpp中将#include 的文件由time.hh改成time.h。这样改的目的在于,在VC6中开发的时候,编译器是根据后缀名来进行编译的,如果是.cc那么将VC6将无法为其编译。

第六步,新建一个VC6 win32 Console的空项目。将time.h和timeSK.cpp拷贝到项目所在目录,并将文件插入到项目中,新建一个myserver.cpp的文件。

#include <iostream.h>

#include "time.h"

class Time_impl:public virtual POA_Time{

public :

virtual short get_gmt();

};

short Time_impl::get_gmt(){

return 1;

}

int main(int argc, char* argv[]){

try{

CORBA::ORB_var orb = CORBA::ORB_init(argc,argv);

CORBA::Object_var obj

=orb->resolve_initial_references("RootPOA");

PortableServer::POA_var poa

=PortableServer::POA::_narrow(obj);

PortableServer::POAManager_var mgr

=poa->the_POAManager();

mgr->activate();

Time_impl time_servant;

Time_var tm = time_servant._this();

CORBA::String_var str = orb->object_to_string(tm);

cout<<str<<endl;

orb->run();

}catch(const CORBA::Exception&){

cerr<<"exception"<<endl;

return 1;

}

return 0;

} 最后的如图所示。





第七步,设置VC6开发环境。因为开编译过程中需要使用到omniORB的一些库和宏定义,需要对VC进行设置。

Tools->Options选择Directory标签,加入OmniORB的lib和include路径。

在Include files下加入OmniORB4的头文件,见最后一行。





在Libraryfile中添加OmniORB的lib路径。





Project->Setting,选择C++,分别对C++ Language, Code Generation,和Preprocessor进行设置。

C++ Language 下选择“Enable Exception Handling”





Code Generation下选择“Run-time Library ”选择MultiThreaded DLL





Preprocessor中添加宏定义:“__WIN32__,__x86__,_WIN32_WINNT=0x0400,__NT__,__OSVERSION__=4”。





选择Link选项卡,Category选择Input,添加库模块 ws2_32.lib mswsock.lib advapi32.lib omniORB410_rt.lib omniDynamic410_rt.lib omnithread32_rt.lib(需要将C:\omniORB-4.1.0\lib\x86_win32\omnithread33_rt.lib中33改成32)





至此,关于VC6的设置完毕。

第八步,编译timeSK.cpp,myserver.cpp,最后生成myserver.exe文件。

第九步,现在开始写Client程序,方式和Server一样,timeSK.cpp,time.h,和myserver.cpp中关于实现Time_impl类的代码都需要(后证实,可以省略),除此之外,还应该增加一个myclient.cpp文件。内容如下:

#include <iostream.h>

#include "time.h"

int main(int argc,char* argv[]){

try{

cout<<"OK0";

if(argc!=2){

throw 0;

}

cout<<"OK0.1";

CORBA::ORB_var orb = CORBA::ORB_init(argc,argv);

cout<<"OK0.2";

CORBA::Object_var obj = orb->string_to_object(argv[1]);

cout<<"OK0.3";

cout<<"OK1";

if(CORBA::is_nil(obj)){

cerr<<"Nil Time Reference"<<endl;

throw 0;

}

cout<<"OK2";

Time_var tm = Time::_narrow(obj);

if(CORBA::is_nil(tm)){

cerr<<"Nil Time Reference"<<endl;

throw 0;

}

cout<<"OK3";

cout<<"Time is"<<tm->get_gmt()<<endl;

}catch(const CORBA::Exception&){

cerr<<"Exception"<<endl;

return 1;

}

return 0;

}

注意,此myclient项目也需要对其进行VC6的project->setting的设置,方法和myserver的一样。

第十步,运行server,获得IOR,将IOR作为参数运行mycliet.exe。注意,参数需要“IOR:××××××××”。程序运行结果如下图,调用CORBA对象的get_gmt之后,CORBA的伺服程序servant返回了数值1。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: