配置corba和vs2005结合的环境
一、下载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(和工程名FirstOmniORB_Client)上分别右击-> 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
转自CSDN博客:http://blog.csdn.net/qqyanchong/archive/2011/02/25/6207503.aspx