一、下载OmniORB
http://sourceforge.net/projects/omniorb/files/
VS2005下载omniORB-4.1.4-x86_win32-vs8.zip,VS2008下载omniORB-4.1.4-x86_win32-vs9.zip
下载后解压到任意目录即可,本人解压后为D:/DevAssist/omniORB-4.1.4
二、配置环境变量
计算机右键单击属性->高级环境系统设置->系统环境变量Path后面加上
omniORB路径/bin/x86_win32
三、配置VS目录
打开VS,选择Tools工具->Options选项,在弹出窗口中选择 Project and Solutions -> VC++ Directories,要设定三个文件夹目录
1.在右上角下拉菜单中选择Executable files,在下面新加一个目录 OmniORB路径/bin/x86_win32(注意不要光写到bin把后面的x86_win32掉了)
2.在右上角下拉菜单中选择Include files,在下面新加一个目录OmniORB路径/include
3.在下拉菜单中选择Library files,添加目录OmniORB路径/lib/x86_win32
一、编写time.idl
新建一个txt文本文件,编辑内容如下
interface Time{ short get_gmt(); }; |
保存并修改扩展名为time.idl
二、编译time.idl
打开命令行并到time.idl所在目录下,运行
omniidl -bcxx time.idl
如果运行找不到omniidl命令,则是配置时未将安装路径/bin/x86_win32添加到Path环境变量中。
运行编译成功后将生成time.hh和timeSK.cc两个文件, time.hh是所有的接口,类型的定义所在的文件,服务器和客户端的实现都需要这两个文件。
三、新建服务器端项目并添加文件
新建一个Win32 Console Application的空工程,名为FirstOmniORB_Server,作为服务器端程序,在头文件中新建time.h,并将上一步编译的出time.hh中的内容复制到time.h中,源文件中新建timeSK.cpp,并将上一步编译出的timeSK.cc中的内容复制到timeSK.cpp中,修改内容的#include "time.hh"为time.h
源文件中再新建一个myserver.cpp,添加以下内容
#include <iostream> #include "time.h" using namespace std; 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; } |
再新建一个Win32 Console Application空工程,名为FirstOmniORB_Client,作为客户端应用程序,同样添加time.h和timeSK.cpp,并在头文件中添加myclient.cpp,内容如下
#include <iostream> #include "time.h" using namespace std; int main(int argc,char* argv[]){ try{ if(argc!=2){ throw 0; } CORBA::ORB_var orb = CORBA::ORB_init(argc,argv); CORBA::Object_var obj = orb->string_to_object(argv[1]); if(CORBA::is_nil(obj)){ cerr<<"Nil Time Reference"<<endl; throw 0; } Time_var tm = Time::_narrow(obj); if(CORBA::is_nil(tm)){ cerr<<"Nil Time Reference"<<endl; throw 0; } cout<<"Time is"<<tm->get_gmt()<<endl; }catch(const CORBA::Exception&){ cerr<<"Exception"<<endl; return 1; } return 0; } |
最后的目录结构应该像这样:
四、修改工程参数
需要修改三个工程参数
在工程名FirstOmniORB_Server上右击-> Properties打开属性页
1.选择Configuration Properties -> C/C++ -> Preprocessor,修改右边的PreprocessorDefinitions,添加如下项:
__WIN32__ __x86__ _WIN32_WINNT=0x0400 __NT__ __OSVERSION__=6 |
__OSVERSION__的值貌似并不重要,本人环境为Win7,所以写了6
OmniORB官方文档说XP要写4,虽然实际上XP的内核版本号为5,不知道为何
2. C/C++ -> Code Generation 右边的Runtime Library 选择Multi-threaded Dll(/MD)
3.
Linker-> Input -> Additional Dependencies中添加如下链接库
ws2_32.lib mswsock.lib advapi32.lib omniORB414_rt.lib omniDynamic414_rt.lib omnithread34_rt.lib |
后三个lib文件的文件名有可能因为omniORB的版本号不同而不同,可以在OmniORB安装路径/lib/x86_Win32中查看对应得文件
另一个工程也是相同的配置,注意如果将debug模式修改为release时所有的参数仍要重新配置。
五、编译运行
编译两个工程将产生两个exe文件
在VS里显示的命令行其中的内容貌似不好复制,可以在两工程所在的Solution路径下的debug或release文件夹中找到两个编译完成的exe文件。运行cmd并到两个文件所在路径下,先运行FirstOmniORB_Server.exe,会产生IOR,再开一个cmd,将"IOR:....."作为参数运行FirstOmniORB_Client.exe
运行成功应该显示Time is1