corba 的c++实现(vs2005)

    技术2022-05-20  68

    配置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

     

     

     


    最新回复(0)