首先需要到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。