跟我从头学TAO编程.docx

上传人:b****8 文档编号:10882514 上传时间:2023-02-23 格式:DOCX 页数:25 大小:1.05MB
下载 相关 举报
跟我从头学TAO编程.docx_第1页
第1页 / 共25页
跟我从头学TAO编程.docx_第2页
第2页 / 共25页
跟我从头学TAO编程.docx_第3页
第3页 / 共25页
跟我从头学TAO编程.docx_第4页
第4页 / 共25页
跟我从头学TAO编程.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

跟我从头学TAO编程.docx

《跟我从头学TAO编程.docx》由会员分享,可在线阅读,更多相关《跟我从头学TAO编程.docx(25页珍藏版)》请在冰豆网上搜索。

跟我从头学TAO编程.docx

跟我从头学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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 少儿英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1