跟我从头学TAO编程_第1页
跟我从头学TAO编程_第2页
跟我从头学TAO编程_第3页
跟我从头学TAO编程_第4页
跟我从头学TAO编程_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

跟我从头学TAO编程〔1〕--获取并编译TAO跟我从头学TAO编程系列获取并编译TAOStoneJiang

如果您对TAO有一定了解,却不知如何驾驭它,那请跟我来从头学学TAO编译。如果您对TAO还不是非常了解的话,请跟我来,一起对TAO有一个初步的认识。

TAO简介

\o""TAO(The\o""ACEOrb)是DouglasC.Schmidt教授领导下DOC(DistributedObjectComputing(DOC)Group)发布和维护的开源工程,它是基于ACE实现的、符合CORBA标准的对象请求代理。ACE被设计成为跨平台的开发包及框架,因此TAO也继承了这一特征。TAO能应用于多种操作系统以及多种编译环境。TAO已被广泛地应用于以下领域:指挥与控制、电信、数据通讯、医药工程、分布式交互仿真以及金融效劳等。TAO在实时应用领域有着广泛地应用和举足轻重的地位。TAO为开发人员带来的好处

开发人员利用TAO,可以只专注于业务领域本身的实现。TAO为开发人员提供了大量的“开箱即用〔OutofBox)〞的功能,复杂的与业务领域无关的问题TAO已经完成。

获得TAO

编译TAO的步骤

准备工作

下载源代码

设置环境变量

配置编译选项

生成工程文件(*.sln,*.vcproj/makefile)

编译生成

1.准备工作

编译TAO需要perl,请下载安装perl语言运行环境。Windows用户可以使用activeperl.2.下载源代码

从TAO官方网站\o"/~schmidt/TAO.html"/~schmidt/TAO.html进入,您可以看到ObtainningTAO(获得TAO)链接。进入后,可以看到下载页面。

当前版本是x.6.6

DOC提供了不同的版本以及每个版本的不同压缩方式。

这里我们选择x.6.6版的zip文件的发布包,只含源代码的版本。下载链接如下:\o"HTTP"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或其它文本编辑器查看,可以确认下载的源代码的版本Thisis\o""ACEversion5.6.6,releasedMonSep1506:08:04CDT2023\o""ACE-INSTALL.html文件这个文档详细描述了如何安装ACE及TAO,它比本节更详细。4.配置编译选项

本节以XP,VisualStudio2023为例

进入%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中输入以下指令,即可生成VisualStudio2023(vc9)所需要的vcproj和sln文件>mwc.pl-typevc9ACE_TAO.mwc如果以下指定未正常运行,请检查

1)是否正确安装ActivePerl

2)%ACE_ROOT%/bin是否在PATH环境变量中这个过程一般要好几分钟,请耐心等待。6分半钟后,我得到了TAO_ACE.sln文件如以下图6.编译生成

最后用VisualStudio2023翻开TAO_ACE.sln,即可编译ACE,TAO。

以下图是我的编译结果从%ACE_ROOT%/lib中可以看到至此,ACE,TAO已生成完毕。后续我们将一起学习和演练如何使用TAO编写应用程序。有任何问题可以给我来邮件或在BBS上留言。email:2023119@bbs:/bbs跟我从头学TAO编程系列(2)--编写最简单的TAO应用程序StoneJiang2023119@

\o"/home/link.php?url=d3d3LmFjZS10YW8ub3JnL2Jicw%3D%3D"/home/link.php?url=d3d3LmFjZS10YW8ub3JnL2Jicw%3D%3D

如果您对TAO有一定了解,却不知如何驾驭它,那请跟我来从头学学TAO编译。如果您对TAO还不是非常了解的话,请跟我来,一起对TAO有一个初步的认识。

上一篇我们学会了如何下载、编译和安装TAO,这一节我们来编写最简单的TAO应用程序--Hello\o""TAO!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<2023119@>

//@ref:

///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<2023119@>

//@ref:

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.cpp827982023-09-2110:07:12Zjohnnyw$//@file:

server.cpp

//@author:StoneJiang<2023119@>

//@ref:

#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<2023119@>

//@ref:

#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("Hello\o""TAO!");

}void

Hello::shutdown(void)

{

ACE_DEBUG((LM_DEBUG,"(%P|%t)server-shutdown()./n"));

this->orb_->shutdown(0);

}

//@file:

Hello.h

//@author:StoneJiang<2023119@>

//@ref:

#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<2023119@>

//@ref:

#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_args(argc,argv)!=0)

return1;

CORBA::Object_vartmp=orb->string_to_object(ior);

Test::Hello_varhello=Test::Hello::_narrow(tmp.in());

if(CORBA::is_nil(hello.in()))

{

ACE_ERROR_RETURN((LM_DEBUG,

"NilTest::Helloreference<%s>/n",

ior),

1);

}

CORBA::String_varthe_string=hello->get_string();

ACE_DEBUG((LM_DEBUG,"(%P|%t)-stringreturned<%C>/n",

the_string.in()));

if(end)

{

hello->shutdown();

}

orb->destroy();

}

catch(constCORBA::Exception&ex)

{

ex._tao_print_exception("Exceptioncaught:");

return1;

}

return0;

}

6.编译、调试和运行6.1生成工程文件

在DosShell中输入

mwc.pl-typevc9如以下图:6.2翻开工程文件

用VisualStudio2023翻开工程文档编译后得到server.exe和client.exe6.3运行效劳端6.4运行客户端6.5运行客户端,并让效劳端退出

7.结束到此,我们最简单的已经运行成功。完整的源代码将上传到\o"/home/link.php?url=d3d3LmFjZS10YW8ub3JnL2Jicw%3D%3D"/home/link.php?url=d3d3LmFjZS10YW8ub3JnL2Jicw%3D%3D源代码中已为你生成了vc9,vc8,vc71以及linuxGNUmakefile文件。我们将接下来对本例在的代码作解释,敬请关注。有任何问题,请来邮件2023119@或在bbs(/bbs)上留言。\o"/home/link.php?url=d3d3LmFjZS10YW8ub3JnL2Jicw%3D%3D"/home/link.php?url=d3d3LmFjZS10YW8ub3JnL2Jicw%3D%3D跟我从头学TAO编程系列(3)--通过实例学习CORBA核心概念本系列的第一篇我们学会了怎么下载和编译ACE,TAO,第二篇我们编写了最简单的TAO应用程序。这了节,我们通过第二篇的实例来学习CORBA的核心概念。

1.CORBA架构CORBA的架构如以下图:2.CORBA核心概念

2.1CORBAObjectCORBA对象是一个“虚拟〞的实体。它可以被ORB定位和被客户端调用。在上一篇的例如中,interfaceHello即为corba对象,定义在Hello.idl中//@file:

Test.idl

//@author:StoneJiang<2023119@>

//@ref:

///Puttheinterfacesinamodule,toavoidglobalnamespacepollution

moduleTest

{

///Averysimpleinterface

interfaceHello

{

///Returnasimplestring

stringget_string();

///AmethodtoshutdowntheORB

/**

*Thismethodisusedtosimplifythetestshutdownprocess

*/

onewayvoidshutdown();

};

};CORBA对象并不真实存在,它只存在于概念中。因此,CORBA对象需要程序员用编程语言把它实现。

2.2client,objectreference,request,stub在本例在,client指client.exe。它是发起请求的程序。它的代码片如下#include"TestC.h"int

ACE_TMAIN(intargc,ACE_TCHAR*argv[])

{

CORBA::ORB_varorb=CORBA::ORB_init(argc,argv);

CORBA::Object_vartmp=orb->string_to_object("file://test.ior");

Test::Hello_varhello=Test::Hello::_narrow(tmp.in());

CORBA::String_varthe_string=hello->get_string();

ACE_DEBUG((LM_DEBUG,"(%P|%t)-stringreturned<%C>/n",

the_string.in()));

return0;

}其中,对象引用(objectreference,)此处是与字符串file://test.ior表示的;发起的请求(request)为CORBA::String_varthe_string=hello->get_string();本例中的调用,采用的是staticstub方式,与staticstub相对的还有另一种调用方式DII,这里我们暂不讲述。我们可以把TestC.h,TestC.cpp文件视为stub,它是由tao_idl.exe编译hello.idl时生成的文件。

2.2targetobject,server,servant,,orb,poa

下面是HelloS.h的片断classHello;

typedefHello*Hello_ptr;class

Hello

:publicvirtualPortableServer::ServantBase

{

protected:

Hello(void);public:

//Usefulfortemplateprogramming.

typedef::Test::Hello_stub_type;

typedef::Test::Hello_ptr_stub_ptr_type;

typedef::Test::Hello_var_stub_var_type;

Hello(constHello&rhs);

virtual~Hello(void);

::Test::Hello*_this(void);

virtualchar*get_string(

void)=0;

virtualvoidshutdown(

void)=0;

};其中,get_string()和shutdown()两个成员函数,被定义为纯虚函数(如果对纯虚函数的概念缺少了解,请参考C++相关知识),这也表示,类Hello是一个抽象类,必须由派生类重载这两个函数。这个派生类称为servant。在本例在,servant由Hello.h来定义,由Hello.cpp来实现。下面是效劳端的代码片断#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_;

};

这里的文件TestS.h及TestS.cpp,也是由tao_idl.exe编译Hello.idl时生成的文件,这两个文件用于效劳端,它就是skeleton。请参考CORBA构架图查看skeleton所在的位置。

#include"Hello.h"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->activa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论