一、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
你会看到生成如下文件:
三、建立工程
使用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!");
}
编译运行。