corba 的c++实现(vs2005)

来源:互联网 发布:个人发卡网源码 编辑:程序博客网 时间:2024/05/17 03:35

配置corbavs2005结合的环境

一、下载OmniORB

http://sourceforge.net/projects/omniorb/files/

VS2005下载omniORB-4.1.4-x86_win32-vs8.zipVS2008下载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.hhtimeSK.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.htimeSK.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路径下的debugrelease文件夹中找到两个编译完成的exe文件。运行cmd并到两个文件所在路径下,先运行FirstOmniORB_Server.exe,会产生IOR,再开一个cmd,将"IOR:....."作为参数运行FirstOmniORB_Client.exe

运行成功应该显示Time is1

 

 

 

原创粉丝点击