CORBA之TAO的第一个hello_world C++

时间:2020-12-14 06:24:10

编译以后就让我们来编译一个hello_world吧
一、IDL文件定义
    新建一个后缀为hello.idl文件类型的空文件,在文件中定义接口:


/// 20150726 for tao
module Test
{
interface Hello
{

    string get_hello ();
};
};
二、IDL文件生成
    用vc2008的cmd进入到在保存idl文件的目录下,如E:/hello
使用如下命令tao_idl -GIh _Impl.h -GIs _Impl.cpp hello.mpc
你会看到生成如下文件:
CORBA之TAO的第一个hello_world C++

三、建立工程
    使用vc2008创建工程,(这个过程就省略了~_~)
一个服务器,一个客户端
服务器工程包含helloS.h,helloS.cpp,hello_Impl.h,hello_Impl.cpp,helloC.h,helloC.cpp
再建立一个server.cpp
客户端工程包含helloC.h,helloC.cpp,helloC.inl

再建立一个client.cpp


连接的输入的库(库的目录在$(ACE_ROOT)\lib)有:
ACEd.lib
TAOd.lib
TAO_AnyTypeCoded.lib
TAO_PortableServerd.lib
iphlpapi.lib

git地址

https://github.com/Lxxing/TAO_HelloWorld
源代码如下

//  server.cpp 


#include "Hello_Impl.h"
#include "ace/Get_Opt.h"
#include "ace/OS_NS_stdio.h"


const ACE_TCHAR *ior_output_file = ACE_TEXT ("test.ior");


int
parse_args (int argc, ACE_TCHAR *argv[])
{
  ACE_Get_Opt get_opts (argc, argv, ACE_TEXT("o:"));
  int c;


  while ((c = get_opts ()) != -1)
    switch (c)
      {
      case 'o':
        ior_output_file = get_opts.opt_arg ();
        break;


      case '?':
      default:
        ACE_ERROR_RETURN ((LM_ERROR,
                           "usage:  %s "
                           "-o <iorfile>"
                           "\n",
                           argv [0]),
                          -1);
      }
  // Indicates successful parsing of the command line
  return 0;
}


int
ACE_TMAIN(int argc, ACE_TCHAR *argv[])
{
  try
    {
      CORBA::ORB_var orb =
        CORBA::ORB_init (argc, argv);


      CORBA::Object_var poa_object =
        orb->resolve_initial_references("RootPOA");


      PortableServer::POA_var root_poa =
        PortableServer::POA::_narrow (poa_object.in ());


      if (CORBA::is_nil (root_poa.in ()))
        ACE_ERROR_RETURN ((LM_ERROR,
                           " (%P|%t) Panic: nil RootPOA\n"),
                          1);


      PortableServer::POAManager_var poa_manager = root_poa->the_POAManager ();


      if (parse_args (argc, argv) != 0)
        return 1;


      Test_Hello_Impl *hello_impl = 0;
      ACE_NEW_RETURN (hello_impl,
                      Test_Hello_Impl (),
                      1);
      PortableServer::ServantBase_var owner_transfer(hello_impl);


      PortableServer::ObjectId_var id =
        root_poa->activate_object (hello_impl);


      CORBA::Object_var object = root_poa->id_to_reference (id.in ());


 Test::Hello_var hello = Test::Hello::_narrow (object.in ());


      CORBA::String_var ior = orb->object_to_string (hello.in ());


      // Output the IOR to the <ior_output_file>
      FILE *output_file= ACE_OS::fopen (ior_output_file, "w");
      if (output_file == 0)
        ACE_ERROR_RETURN ((LM_ERROR,
                           "Cannot open output file for writing IOR: %s\n",
                           ior_output_file),
                           1);
      ACE_OS::fprintf (output_file, "%s", ior.in ());
      ACE_OS::fclose (output_file);


      poa_manager->activate ();


      orb->run ();


      ACE_DEBUG ((LM_DEBUG, "(%P|%t) server - event loop finished\n"));


      root_poa->destroy (1, 1);


      orb->destroy ();
    }
  catch (const CORBA::Exception& ex)
    {
      ex._tao_print_exception ("Exception caught:");
      return 1;
    }


  return 0;
}

/////////////////////////**********************华丽分割*************************//////////////////////////////////////////////////////

//  client.cpp 


#include "helloC.h"
#include "ace/Get_Opt.h"


const ACE_TCHAR *ior = ACE_TEXT ("file://test.ior");


int
parse_args (int argc, ACE_TCHAR *argv[])
{
  ACE_Get_Opt get_opts (argc, argv, ACE_TEXT("k:"));
  int c;


  while ((c = get_opts ()) != -1)
    switch (c)
      {
      case 'k':
        ior = get_opts.opt_arg ();
        break;


      case '?':
      default:
        ACE_ERROR_RETURN ((LM_ERROR,
                           "usage:  %s "
                           "-k <ior> "
                           "\n",
                           argv [0]),
                          -1);
      }
  // Indicates successful parsing of the command line
  return 0;
}


int
ACE_TMAIN(int argc, ACE_TCHAR *argv[])
{
  try
    {
      CORBA::ORB_var orb = CORBA::ORB_init (argc, argv);


      if (parse_args (argc, argv) != 0)
        return 1;


      CORBA::Object_var tmp = orb->string_to_object(ior);


      Test::Hello_var hello = Test::Hello::_narrow(tmp.in ());


      if (CORBA::is_nil (hello.in ()))
        {
          ACE_ERROR_RETURN ((LM_DEBUG,
                             "Nil Test::Hello reference <%s>\n",
                             ior),
                            1);
        }


      CORBA::String_var the_string = hello->get_hello  ();


      ACE_DEBUG ((LM_DEBUG, "(%P|%t) - string returned <%C>\n",
                  the_string.in ()));


      orb->destroy ();
    }
  catch (const CORBA::Exception& ex)
    {
      ex._tao_print_exception ("Exception caught:");
      return 1;
    }


  return 0;
}


在hello_Impl.cpp中的实现函数中加入输出函数

char * Test_Hello_Impl::get_hello (
  void)
{
  // Add your implementation here
return CORBA::string_dup ("Hello there!");
}

编译运行。


CORBA之TAO的第一个hello_world C++