跟我从头学TAO编程.docx
- 文档编号:10882514
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:25
- 大小:1.05MB
跟我从头学TAO编程.docx
《跟我从头学TAO编程.docx》由会员分享,可在线阅读,更多相关《跟我从头学TAO编程.docx(25页珍藏版)》请在冰豆网上搜索。
跟我从头学TAO编程
跟我从头学TAO编程
跟我从头学TAO编程
(1)--获取并编译TAO
跟我从头学TAO编程系列
获取并编译TAO
StoneJiang
如果您对TAO有一定了解,却不知如何驾驭它,那请跟我来从头学学TAO编译。
如果您对TAO还不是非常了解的话,请跟我来,一起对TAO有一个初步的认识。
TAO简介
TAO(TheACEOrb)是DouglasC.Schmidt教授领导下DOC(DistributedObjectComputing(DOC)Group)发布和维护的开源项目,它是基于ACE实现的、符合CORBA规范的对象请求代理。
ACE被设计成为跨平台的开发包及框架,因此TAO也继承了这一特征。
TAO能应用于多种操作系统以及多种编译环境。
TAO已被广泛地应用于以下领域:
指挥与控制、电信、数据通讯、医药工程、分布式交互仿真以及金融服务等。
TAO在实时应用领域有着广泛地应用和举足轻重的地位。
TAO为开发人员带来的好处
开发人员利用TAO,可以只专注于业务领域本身的实现。
TAO为开发人员提供了大量的“开箱即用(OutofBox)”的功能,复杂的与业务领域无关的问题TAO已经完成。
获得TAO
编译TAO的步骤
1. 准备工作
2. 下载源代码
3. 设置环境变量
4. 配置编译选项
5. 生成工程文件(*.sln,*.vcproj/makefile)
6. 编译生成
1.准备工作
编译TAO需要perl,请下载安装perl语言运行环境。
Windows用户可以使用activeperl.
2.下载源代码
从TAO官方网站http:
//www.cs.wustl.edu/~schmidt/TAO.html进入,您可以看到ObtainningTAO(获得TAO)链接。
进入后,可以看到下载页面。
当前版本是x.6.6
DOC提供了不同的版本以及每个版本的不同压缩方式。
这里我们选择x.6.6版的zip文件的发布包,只含源代码的版本。
下载链接如下:
HTTP
下载后,我们获得了
我们把它解压至硬盘,我这里以E:
/ACE_wrappers为例.
3.设置环境变量(以WindowsXP为例)
本节内容以XP为例,Linux请在~/.bashrc中设置环境变量,并修改LD_LIBRARY_PATH的值。
编译TAO需要设置以下环境变量
新增
ACE_ROOT=E:
/ACE_wrappers
TAO_ROOT=%ACE_ROOT%/TAO
修改PATH
PATH=%ACE_ROOT%/bin;%ACE_ROOT%/lib;.....其他原来的保持不变
设置环境变量的方法如下:
我的电脑=>属性=>高级=>环境变量=>系统变量=>新建
环境变量设置不当将直接影响以后的编译和开发。
用以下方法检查是否正确
进入DosShell(开始==>运行==>cmd)
>echo%ACE_ROOT%
如果提示为
E:
/ACE_wrappers即设置正确,如下图
在Dosshell中输入
>PATH
确保E:
/ACE_wrappers/lib以及E:
/ACE_wrappers/bin出现在在PATH环境变量中。
环境变量设置后,我们先查看以下几个重要的文件
进入%ACE_ROOT%
我们可以看到
VERSION文件,
用UltraEdit或其它文本编辑器查看,可以确认下载的源代码的版本
ThisisACEversion5.6.6,releasedMonSep1506:
08:
04CDT2008
ACE-INSTALL.html文件
这个文档详细描述了如何安装ACE及TAO,它比本节更详细。
4.配置编译选项
本节以XP,VisualStudio2008为例
进入%ACE_ROOT%/ace目录,创建一个名为config.h的文件,文件内容如下
#include"ace/config-win32.h"
我的config.h内容如下
//-*-C++-*-
#ifndefACE_CONFIG_H
#defineACE_CONFIG_H
#defineACE_DISABLE_WIN32_ERROR_WINDOWS
#defineACE_DISABLE_WIN32_INCREASE_PRIORITY
#defineACE_HAS_MFC1
#include"ace/config-win32.h"
#endif/*ACE_CONFIG_H*/
5.生成工程文件
由于我们只下载了ACE,TAO,CIAO的源代码,因此下载包在没有编译需要的工程文件。
这里给大家初步介绍一个学习和应用ACE,TAO不可不掌握的工具MPC,我们可以用MPC生成适我们的工程文件。
MPC全称为MultiProjectCreator,即多平台项目工程文件生成工具。
这是ACE开发组织为了方便代码在多个平台下移植提供的工具。
我们先不深入其中,直接用它即可。
进入%TAO_ROOT%
查看TAO_ACE.mwc
在DosShell中输入以下指令,即可生成VisualStudio2008(vc9)所需要的vcproj和sln文件
>mwc.pl-typevc9ACE_TAO.mwc
如果以下指定未正常运行,请检查
1)是否正确安装ActivePerl
2)%ACE_ROOT%/bin是否在PATH环境变量中
这个过程一般要好几分钟,请耐心等待。
6分半钟后,我得到了TAO_ACE.sln文件
如下图
6.编译生成
最后用VisualStudio2008打开TAO_ACE.sln,即可编译ACE,TAO。
下图是我的编译结果
从%ACE_ROOT%/lib中可以看到
至此,ACE,TAO已生成完毕。
后续我们将一起学习和演练如何使用TAO编写应用程序。
有任何问题可以给我来邮件或在BBS上留言。
email:
2005119@
bbs:
http:
//www.ace-tao.org/bbs
跟我从头学TAO编程系列
(2)--编写最简单的TAO应用程序
StoneJiang2005119@
http:
//www.ace-tao.org
http:
//www.ace-tao.org/home/link.php?
url=d3d3LmFjZS10YW8ub3JnL2Jicw%3D%3D
如果您对TAO有一定了解,却不知如何驾驭它,那请跟我来从头学学TAO编译。
如果您对TAO还不是非常了解的话,请跟我来,一起对TAO有一个初步的认识。
上一篇我们学会了如何下载、编译和安装TAO,这一节我们来编写最简单的TAO应用程序--HelloTAO!
1.编写TAO应用程序的一般步骤
1)
定义接口,编写idl文件
2)
编写mpc文件,生成工程文件
3)
编写server端代码
4)
编写client端代码
5)
编译,调试运行,查看结果
2.定义接口
接口(interface)在TAO(corba)编程在非重要,它定义了客户端(主动发起请求一方)向服务端(被动等待请求)之间通讯消息格式。
在本例在,我们定义了一个名为"Hello"的接口。
Hello接口中具有两个方法:
get_string()和
shutdown()
TAO用接口定义语言(idl)来表示具体的接口定义。
见Hello.idl文件
//@file:
Test.idl
//@author:
StoneJiang<2005119@>
//@ref:
http:
//www.ace-tao.org
///Puttheinterfacesinamodule,toavoidglobalnamespacepollution
moduleTest
{
///Averysimpleinterface
interfaceHello
{
///Returnasimplestring
stringget_string();
///AmethodtoshutdowntheORB
/**
*Thismethodisusedtosimplifythetestshutdownprocess
*/
onewayvoidshutdown();
};
};
我们将接口Hello放在moduleTest中,避免全局名字污染。
3.编写mpc文件
在上一篇我们简单的讲解了mpc在编译和ACE,TAO中的应用,在本节我们进一步使用mpc工具,为我们生成项目工程文件。
见Hello.mpc
//@file:
Hello.mpc
//@author:
StoneJiang<2005119@>
//@ref:
http:
//www.ace-tao.org
project(*idl):
taoidldefaults{
idlflags+=-Sp
IDL_Files{
Test.idl
}
custom_only=1
}
project(*Server):
taoserver{
after+=*idl
Source_Files{
Hello.cpp
server.cpp
}
Source_Files{
TestC.cpp
TestS.cpp
}
IDL_Files{
}
}
project(*Client):
taoclient{
after+=*idl
Source_Files{
client.cpp
}
Source_Files{
TestC.cpp
}
IDL_Files{
}
}
Hello.mpc定义了三个项目(project),其中*作为占位符,替换文件名Hello,所以这三个项目分别为
1)Hello_idl
2)Hello_Server
3)Hello_Client
4.服务端代码的编写
服务端由Server.cpp,Hello.cpp,Hello.h组成
//$Id:
server.cpp827982008-09-2110:
07:
12Zjohnnyw$
//@file:
server.cpp
//@author:
StoneJiang<2005119@>
//@ref:
http:
//www.ace-tao.org
#include"Hello.h"
#include"ace/Get_Opt.h"
#include"ace/OS_NS_stdio.h"
constACE_TCHAR*ior_output_file=ACE_TEXT("test.ior");
int
parse_args(intargc,ACE_TCHAR*argv[])
{
ACE_Get_Optget_opts(argc,argv,ACE_TEXT("o:
"));
intc;
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"
"-eshutdownserver"
"/n",
argv[0]),
-1);
}
//Indicatessucessfulparsingofthecommandline
return0;
}
int
ACE_TMAIN(intargc,ACE_TCHAR*argv[])
{
try
{
CORBA:
:
ORB_varorb=
CORBA:
:
ORB_init(argc,argv);
CORBA:
:
Object_varpoa_object=
orb->resolve_initial_references("RootPOA");
PortableServer:
:
POA_varroot_poa=
PortableServer:
:
POA:
:
_narrow(poa_object.in());
if(CORBA:
:
is_nil(root_poa.in()))
ACE_ERROR_RETURN((LM_ERROR,
"(%P|%t)Panic:
nilRootPOA/n"),
1);
PortableServer:
:
POAManager_varpoa_manager=root_poa->the_POAManager();
if(parse_args(argc,argv)!
=0)
return1;
poa_manager->activate();
Hello*hello_impl=0;
ACE_NEW_RETURN(hello_impl,
Hello(orb.in()),
1);
PortableServer:
:
ServantBase_varowner_transfer(hello_impl);
PortableServer:
:
ObjectId_varid=
root_poa->activate_object(hello_impl);
CORBA:
:
Object_varobject=root_poa->id_to_reference(id.in());
Test:
:
Hello_varhello=Test:
:
Hello:
:
_narrow(object.in());
CORBA:
:
String_varior=orb->object_to_string(hello.in());
//OutputtheIORtothe
FILE*output_file=ACE_OS:
:
fopen(ior_output_file,"w");
if(output_file==0)
ACE_ERROR_RETURN((LM_ERROR,
"CannotopenoutputfileforwritingIOR:
%s/n",
ior_output_file),
1);
ACE_OS:
:
fprintf(output_file,"%s",ior.in());
ACE_OS:
:
fclose(output_file);
ACE_DEBUG((LM_DEBUG,"(%P|%t)server-waitforrequstingfromclient./n"));
orb->run();
ACE_DEBUG((LM_DEBUG,"(%P|%t)server-eventloopfinished/n"));
root_poa->destroy(1,1);
orb->destroy();
}
catch(constCORBA:
:
Exception&ex)
{
ex._tao_print_exception("Exceptioncaught:
");
return1;
}
return0;
}
//@file:
Hello.cpp
//@author:
StoneJiang<2005119@>
//@ref:
http:
//www.ace-tao.org
#include"Hello.h"
#include"ace/Log_Msg.h"
Hello:
:
Hello(CORBA:
:
ORB_ptrorb)
:
orb_(CORBA:
:
ORB:
:
_duplicate(orb))
{
}
char*
Hello:
:
get_string(void)
{
ACE_DEBUG((LM_DEBUG,"(%P|%t)server-get_string()./n"));
returnCORBA:
:
string_dup("HelloTAO!
");
}
void
Hello:
:
shutdown(void)
{
ACE_DEBUG((LM_DEBUG,"(%P|%t)server-shutdown()./n"));
this->orb_->shutdown(0);
}
//@file:
Hello.h
//@author:
StoneJiang<2005119@>
//@ref:
http:
//www.ace-tao.org
#ifndefHELLO_H
#defineHELLO_H
#include/**/"ace/pre.h"
#include"TestS.h"
///ImplementtheTest:
:
Hellointerface
classHello
:
publicvirtualPOA_Test:
:
Hello
{
public:
///Constructor
Hello(CORBA:
:
ORB_ptrorb);
//=Theskeletonmethods
virtualchar*get_string(void);
virtualvoidshutdown(void);
private:
///UseanORBreferencetoconvertstringstoobjectsandshutdown
///theapplication.
CORBA:
:
ORB_varorb_;
};
#include/**/"ace/post.h"
#endif/*HELLO_H*/
5.客户端代码的编写
服务端由client.cpp组件
//@file:
client.cpp StoneJiang<2005119@>
//@ref:
http:
//www.ace-tao.org
#include"TestC.h"
#include"ace/Get_Opt.h"
constACE_TCHAR*ior=ACE_TEXT("file:
//test.ior");
int end=0;
int
parse_args(intargc,ACE_TCHAR*argv[])
{
ACE_Get_Optget_opts(argc,argv,ACE_TEXT("k:
e"));
intc;
while((c=get_opts())!
=-1)
switch(c)
{
case'k':
ior=get_opts.opt_arg();
break;
case'e':
end=1;
break;
case'?
':
default:
ACE_ERROR_RETURN((LM_ERROR,
"usage:
%s"
"-k"
"/n",
argv[0]),
-1);
}
//Indicatessucessfulparsingofthecommandline
return0;
}
int
ACE_TMAIN(intargc,ACE_TCHAR*argv[])
{
try
{
CORBA:
:
ORB_varorb=CORBA:
:
ORB_init(argc,argv);
if(parse
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 从头 TAO 编程