﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-huahit-文章分类-CORBA &amp; TAO</title><link>http://www.cppblog.com/huahit/category/2158.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 21 May 2008 00:36:47 GMT</lastBuildDate><pubDate>Wed, 21 May 2008 00:36:47 GMT</pubDate><ttl>60</ttl><item><title>CORBA Programming with TAO-3 zz</title><link>http://www.cppblog.com/huahit/articles/9572.html</link><dc:creator>无为斋</dc:creator><author>无为斋</author><pubDate>Sat, 08 Jul 2006 03:02:00 GMT</pubDate><guid>http://www.cppblog.com/huahit/articles/9572.html</guid><wfw:comment>http://www.cppblog.com/huahit/comments/9572.html</wfw:comment><comments>http://www.cppblog.com/huahit/articles/9572.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/huahit/comments/commentRss/9572.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/huahit/services/trackbacks/9572.html</trackback:ping><description><![CDATA[
		<table width="100%" align="center">
				<tbody>
						<tr>
								<td class="title" align="middle">CORBA Programming with TAO-3 </td>
						</tr>
						<tr>
								<td align="middle">
										<a href="http://www.itisedu.com/">http://www.itisedu.com</a>   2006-5-12 18:10:24   <a href="http://www.itisedu.com/">中科永联</a></td>
						</tr>
						<tr>
								<td align="left">[关键字]CORBA POA TAO </td>
						</tr>
						<tr>
								<td>
										<p>
												<font face="Verdana">
														<font face="Verdana">
																<font face="Verdana">
																		<a href="http://www.itisedu.com/phrase/200604031336425.html" target="_new">CORBA</a>
																		<a href="http://www.itisedu.com/phrase/200604232129205.html" target="_new">Programming</a> with TAO - 3.IDL Data <a href="http://www.itisedu.com/phrase/200604231258125.html" target="_new">type</a>（数据<a href="http://www.itisedu.com/phrase/200603051002565.html" target="_new">类型</a>与Mapping）</font>
														</font>
												</font>
										</p>
										<p>
												<font face="Verdana">
														<font face="Verdana">摘要：<br />简要介绍TAO支持的IDL数据<a href="http://www.itisedu.com/phrase/200603090857555.html" target="_new">类</a>型及其C++ Mapping关系。</font>
												</font>
										</p>
										<p>
												<font face="Verdana">
														<strong>一、简单基本数据类型（Simple B<a href="http://www.itisedu.com/phrase/200604232104015.html" target="_new">AS</a>ic Typ<a href="http://www.itisedu.com/phrase/200604231411155.html" target="_new">ES</a>）</strong>
														<br />TAO支持以下简单基本数据类型（%TAO_R<a href="http://www.itisedu.com/phrase/200604231401365.html" target="_new">OO</a>T%/tao/Basic_Types.h）：<br /></font>
										</p>
										<p align="center">
										</p>
										<table cellspacing="0" cellpadding="0" border="1">
												<tbody>
														<tr>
																<td valign="bottom" nowrap="" width="169">
																		<div>IDL</div>
																</td>
																<td valign="bottom" nowrap="" width="168">
																		<div>C++</div>
																</td>
														</tr>
														<tr>
																<td valign="bottom" nowrap="" width="169">
																		<div>
																				<a href="http://www.itisedu.com/phrase/200604240816555.html" target="_new">BO</a>olean</div>
																</td>
																<td valign="bottom" nowrap="" width="168">
																		<div>CORBA::Boolean</div>
																</td>
														</tr>
														<tr>
																<td valign="bottom" nowrap="" width="169">
																		<div>char</div>
																</td>
																<td valign="bottom" nowrap="" width="168">
																		<div>CORBA::Char</div>
																</td>
														</tr>
														<tr>
																<td valign="bottom" nowrap="" width="169">
																		<div>octet</div>
																</td>
																<td valign="bottom" nowrap="" width="168">
																		<div>CORBA::Octet</div>
																</td>
														</tr>
														<tr>
																<td valign="bottom" nowrap="" width="169">
																		<div>short</div>
																</td>
																<td valign="bottom" nowrap="" width="168">
																		<div>CORBA::Short</div>
																</td>
														</tr>
														<tr>
																<td valign="bottom" nowrap="" width="169">
																		<div>unsigned short</div>
																</td>
																<td valign="bottom" nowrap="" width="168">
																		<div>CORBA::UShort</div>
																</td>
														</tr>
														<tr>
																<td valign="bottom" nowrap="" width="169">
																		<div>long</div>
																</td>
																<td valign="bottom" nowrap="" width="168">
																		<div>CORBA::Long</div>
																</td>
														</tr>
														<tr>
																<td valign="bottom" nowrap="" width="169">
																		<div>unsigned long</div>
																</td>
																<td valign="bottom" nowrap="" width="168">
																		<div>CORBA::ULong</div>
																</td>
														</tr>
														<tr>
																<td valign="bottom" nowrap="" width="169">
																		<div>long long</div>
																</td>
																<td valign="bottom" nowrap="" width="168">
																		<div>CORBA::LongLong</div>
																</td>
														</tr>
														<tr>
																<td valign="bottom" nowrap="" width="169">
																		<div>unsigned long long</div>
																</td>
																<td valign="bottom" nowrap="" width="168">
																		<div>CORBA::ULongLong</div>
																</td>
														</tr>
														<tr>
																<td valign="bottom" nowrap="" width="169">
																		<div>wchar</div>
																</td>
																<td valign="bottom" nowrap="" width="168">
																		<div>CORBA::WChar</div>
																</td>
														</tr>
														<tr>
																<td valign="bottom" nowrap="" width="169">
																		<div>float</div>
																</td>
																<td valign="bottom" nowrap="" width="168">
																		<div>CORBA::Float</div>
																</td>
														</tr>
														<tr>
																<td valign="bottom" nowrap="" width="169">
																		<div>double</div>
																</td>
																<td valign="bottom" nowrap="" width="168">
																		<div>CORBA::Double</div>
																</td>
														</tr>
														<tr>
																<td valign="bottom" nowrap="" width="169">
																		<div>long double</div>
																</td>
																<td valign="bottom" nowrap="" width="168">
																		<div>CORBA::LongDouble</div>
																</td>
														</tr>
												</tbody>
										</table>
										<p>
												<font face="Verdana">以上各简单基本类型对应的C++类型只是对应平台上基本类型的typedef（<a href="http://www.itisedu.com/phrase/200604261004365.html" target="_new">Java虚拟机</a>之所以能够在各平台上保证统一的数据长度，其实现原理也是如此），但在编写应用<a href="http://www.itisedu.com/phrase/200604232224305.html" target="_new">程序</a>时，为了保证程序的可移植性，应该总是使用CORBA命名空间中的类型标识。此外，需要注意：在上面的所有类型中，没有我们熟悉的C++基本类型byte（被Octet取代）、int（被Long取代）。</font>
										</p>
										<p>
												<font face="Verdana">
														<strong>二、复杂基本数据类型（Complex Basic Types）</strong>
														<br />除以上简单基本数据类型外，TAO还支持以下复杂基本数据类型：</font>
										</p>
										<p>
												<font face="Verdana">IDL<br /> C++<br /> <br /><a href="http://www.itisedu.com/phrase/200604231411575.html" target="_new">ST</a>ring<br /> CORBA::TAO_String_Manager(%TAO_ROOT%/tao/Managed_Types.h)<br /> <br />wstring<br /> CORBA::TAO_WString_Manager(%TAO_ROOT%/tao/Managed_Types.h)<br /> <br />any<br /> CORBA::Any(%TAO_ROOT%/tao/AnyTyp<a href="http://www.itisedu.com/phrase/200604222051415.html" target="_new">EC</a>ode/Any.h)<br /> </font>
										</p>
										<p>
												<font face="Verdana">其中两种String类型在使用时需要注意：</font>
										</p>
										<p>
												<font face="Verdana">1、应该总是使用TAO提供的（也是CORBA规范规定的）如下字符串操作函数：</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">char * string_alloc(ULong len);</font>
										</p>
										<p>
												<font face="Verdana">char * string_dup(const char *);</font>
										</p>
										<p>
												<font face="Verdana">void string_free(char *);</font>
										</p>
										<p>
												<font face="Verdana">WChar * wstring_alloc(ULong len);</font>
										</p>
										<p>
												<font face="Verdana">WChar * wstring_dup(const WChar *);</font>
										</p>
										<p>
												<font face="Verdana">void wstring_free(WChar *);</font>
										</p>
										<p>
												<font face="Verdana">来进行字符串操作，以提高系统的可移植性。</font>
										</p>
										<p>
												<font face="Verdana">2、(w)string_alloc/(w)string_dup后必须调用(w)string_free来释放分配的资源，为了避免忘记(w)string_free带来的麻烦，有些情况下，我们可以考虑使用String_var类型（String_var是String类对应的智能指针类，除了TAO本身支持的智能指针类型外，tao_idl在生成代码时会自动为每个<a href="http://www.itisedu.com/phrase/200604231338435.html" target="_new">object</a>添加一个对应的var类型）。</font>
										</p>
										<p>
												<font face="Verdana">3、(w)string_alloc(n)会分配n+1个字符（不是字节）空间。</font>
										</p>
										<p>
												<font face="Verdana">以下是一个简单的字符串操作的例子：</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">#include <tao corba.h=""></tao></font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">#include <iostream></iostream></font>
										</p>
										<p>
												<font face="Verdana">using n<a href="http://www.itisedu.com/phrase/200603091620485.html" target="_new">AM</a>espace std;</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">int m<a href="http://www.itisedu.com/phrase/200604230831275.html" target="_new">AI</a>n() {</font>
										</p>
										<p>
												<font face="Verdana">      char * p = CORBA::string_alloc(5); // Allocates 6 bytes</font>
										</p>
										<p>
												<font face="Verdana">      strcpy(p, "Hello"); // OK, "Hello" fits</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">      cout &lt;&lt; p &lt;&lt; endl;</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">      CORBA::string_free(p);</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">      CORBA::String_var s = CORBA::string_dup("World");</font>
										</p>
										<p>
												<font face="Verdana">      cout &lt;&lt; s.in() &lt;&lt; endl;</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">      return 0;</font>
										</p>
										<p>
												<font face="Verdana">}</font>
										</p>
										<p>
												<font face="Verdana">注：如果你在编译该程序时遇到困难，请在阅读完本系列的第五篇文章后再来测试该程序（下同）。</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">CORBA::Any与Windows开发中常用的VARIANT类型相当，可以在其中存入任意其他类型的数据，但Any更具有<a href="http://www.itisedu.com/phrase/200603101726185.html" target="_new">面向对象</a>的风格。在Windows应用中向VARIANT写入信息时需要先设置写入的数据类型，而从中读出数据时往往需要用switch进行判断，相比之下Any的使用就简单多了，我们可以通过&lt;=操作符来向Any类型变量写入信息，而通过&gt;=操作符从Any变量中读出信息。与从VARIANT中解析数据不同的是，由于重载的&gt;=操作符返回的是一个表示转换成功或者失败的标志，因此，我们总是使用if...else而不是switch来对解析结果进行判断。下面是一个使用Any的例子：</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">#include <tao any.h="" anytypecode=""></tao></font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">#include <iostream></iostream></font>
										</p>
										<p>
												<font face="Verdana">using namespace std;</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">int main() {</font>
										</p>
										<p>
												<font face="Verdana">      CORBA::Any a;</font>
										</p>
										<p>
												<font face="Verdana">      CORBA::Octet o;</font>
										</p>
										<p>
												<font face="Verdana">      CORBA::Long l;</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">      a &lt;&lt;= CORBA::Long(1); // a contains 1 with CORBA::Long type</font>
										</p>
										<p>
												<font face="Verdana">      if (a &gt;&gt;= l) {</font>
										</p>
										<p>
												<font face="Verdana">            cout &lt;&lt; "Long: " &lt;&lt; l &lt;&lt; endl;</font>
										</p>
										<p>
												<font face="Verdana">      } else {</font>
										</p>
										<p>
												<font face="Verdana">            cout &lt;&lt; "Unknown value." &lt;&lt; endl;</font>
										</p>
										<p>
												<font face="Verdana">      }</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">      a &lt;&lt;= CORBA::Any::from_octet(65); // a contains 64 with CORBA::Octet type</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">      if (a &gt;&gt;= CORBA::Any::to_octet(o)) {</font>
										</p>
										<p>
												<font face="Verdana">            cout &lt;&lt; "Octet: " &lt;&lt; o &lt;&lt; endl;</font>
										</p>
										<p>
												<font face="Verdana">      } else {</font>
										</p>
										<p>
												<font face="Verdana">            cout &lt;&lt; "Unknown value." &lt;&lt; endl;</font>
										</p>
										<p>
												<font face="Verdana">      }</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">      return 0;</font>
										</p>
										<p>
												<font face="Verdana">}</font>
										</p>
										<p>
												<font face="Verdana">注：过度使用Any类型将对程序的处理性能造成影响。</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">此外，CORBA规范还规定了一种不太常用的数据类型：CORBA::Fixed，它是一种特殊的浮点类型，在构造fixed类型变量时必须指定两个参数：总位数（不含小数点）与精度，而CORBA::Fixed则提供了多种从其它基本类型构造Fixed类型的方法，你甚至可以从字符串类型构造一个Fixed类型变量。但是，目前TAO尚不支持Fixed类型。</font>
										</p>
										<p>
												<font face="Verdana">
														<strong>三、构造类型（Constructed Types）</strong>
														<br />除了上面的基本类型外，我们还可以在idl中使用struct、sequence、union、array等几种构造类型：</font>
										</p>
										<p>
												<font face="Verdana">·        struct<br />struct与C语言中的struct基本上是等价的，其中只能包含变量定义，不能定义方法，对定义的变量进行初始化，或定义union型变量。</font>
										</p>
										<p>
												<font face="Verdana">·        sequence<br />sequence与STL中的vector比较类似，可以用它来存储相同类型的变量，并且可以“自由”扩充，因此，sequence往往可以在传递“变长”参数时发挥重要作用。经过idl处理，sequence会被映射成相应的类。下面举一个sequence的例子：</font>
										</p>
										<p>
												<font face="Verdana">1、首先，定义如下的idl<a href="http://www.itisedu.com/phrase/200602282323195.html" target="_new">文件</a>：</font>
										</p>
										<p>
												<font face="Verdana">typedef sequence<string> StrSeq;</string></font>
										</p>
										<p>
												<font face="Verdana">将其存为strseq.idl，并在控制台下对其进行编译，命令如下：</font>
										</p>
										<p>
												<font face="Verdana">tao_idl -Sc strseq.idl</font>
										</p>
										<p>
												<font face="Verdana">编译后，我们将得到一个名为strseq.h的头文件；</font>
										</p>
										<p>
												<font face="Verdana">2、新建一控制台工程，并在主文件中添加如下代码（注：此例全部代码取自<advanced c++="" with="" programming="" corba="">）：</advanced></font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">#include "strseqC.h"</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">#include <iostream></iostream></font>
										</p>
										<p>
												<font face="Verdana">using namespace std;</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">int main() {</font>
										</p>
										<p>
												<font face="Verdana">      const char * values[] = { "first", "second", "third", "fourth" };</font>
										</p>
										<p>
												<font face="Verdana">      StrSeq myseq; // <a href="http://www.itisedu.com/phrase/200604241354455.html" target="_new">CR</a>eate empty sequence</font>
										</p>
										<p>
												<font face="Verdana">      // Create four empty strings</font>
										</p>
										<p>
												<font face="Verdana">      myseq.length(4);</font>
										</p>
										<p>
												<font face="Verdana">      for (CORBA::ULong i = 0; i &lt; myseq.length(); i++)</font>
										</p>
										<p>
												<font face="Verdana">            myseq[i] = values[i]; // Deep copy</font>
										</p>
										<p>
												<font face="Verdana">      // Print current contents</font>
										</p>
										<p>
												<font face="Verdana">      for (CORBA::ULong j = 0; j &lt; myseq.length(); j++)</font>
										</p>
										<p>
												<font face="Verdana">            cout &lt;&lt; "myseq[" &lt;&lt; j &lt;&lt; "] = \"" &lt;&lt; myseq[j].in() &lt;&lt; "\"" &lt;&lt; endl;</font>
										</p>
										<p>
												<font face="Verdana">      cout &lt;&lt; endl;</font>
										</p>
										<p>
												<font face="Verdana">      // Change second element (deallocates "second")</font>
										</p>
										<p>
												<font face="Verdana">      myseq[1] = CORBA::string_dup("second element");</font>
										</p>
										<p>
												<font face="Verdana">      // Truncate to three elements</font>
										</p>
										<p>
												<font face="Verdana">      myseq.length(3); // Deallocates "fourth"</font>
										</p>
										<p>
												<font face="Verdana">      // Grow to five elements (add two empty strings)</font>
										</p>
										<p>
												<font face="Verdana">      myseq.length(5);</font>
										</p>
										<p>
												<font face="Verdana">      // Initialize appended elements</font>
										</p>
										<p>
												<font face="Verdana">      myseq[3] = CORBA::string_dup("4th");</font>
										</p>
										<p>
												<font face="Verdana">      myseq[4] = CORBA::string_dup("5th");</font>
										</p>
										<p>
												<font face="Verdana">      // Print contents once more</font>
										</p>
										<p>
												<font face="Verdana">      for (CORBA::ULong k = 0; k &lt; myseq.length(); k++)</font>
										</p>
										<p>
												<font face="Verdana">            cout &lt;&lt; "myseq[" &lt;&lt; k &lt;&lt; "] = \"" &lt;&lt; myseq[k].in() &lt;&lt; "\"" &lt;&lt; endl;</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">      return 0;</font>
										</p>
										<p>
												<font face="Verdana">}</font>
										</p>
										<p>
												<font face="Verdana">·        union<br />idl中的union类型与C++中的union不是等价的，它实际上被映射成了对应的<a href="http://www.itisedu.com/phrase/200604231359565.html" target="_new">Class</a>，同时在使用上与C++中的union也有极大区别。以下面的idl为例：</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">union U switch (char) {</font>
										</p>
										<p>
												<font face="Verdana">      case 'L':</font>
										</p>
										<p>
												<font face="Verdana">            long long_mem;</font>
										</p>
										<p>
												<font face="Verdana">      case 'c':</font>
										</p>
										<p>
												<font face="Verdana">      case 'C':</font>
										</p>
										<p>
												<font face="Verdana">            char char_mem;</font>
										</p>
										<p>
												<font face="Verdana">      default:</font>
										</p>
										<p>
												<font face="Verdana">            short short_mem;</font>
										</p>
										<p>
												<font face="Verdana">};</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">其意义可以解释为：</font>
										</p>
										<p>
												<font face="Verdana">类型U可以用于存放三种类型的值：Long型、Char型、Short型，你可以分别用long_mem、char_mem、short_mem取出这些值。当使用一个Long型变量初始化该union变量时，类型标志为L（或者反过来，当类型标志为L时，可以在其中存放一个Long型的值）；当用一个Char型变量初始化该union变量时，类型标志为c或者C；当用一个Short型初始化该union变量时，类型标志为其它值。</font>
										</p>
										<p>
												<font face="Verdana">但是，在使用union类型时需要特别注意：不要尝试将类型标志设置为一种类型（通过_d方法），而用另一种类型去初始化它；或者，反过来，用一种类型去初始化它，然后又尝试将类型标志修改为其它值。</font>
										</p>
										<p>
												<font face="Verdana">下面是一个使用上述idl定义的例子：</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">#include <iostream></iostream></font>
										</p>
										<p>
												<font face="Verdana">using namespace std;</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">#include <assert.h></assert.h></font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">int main() {</font>
										</p>
										<p>
												<font face="Verdana">      U my_u; // 'my_u' is not initialized</font>
										</p>
										<p>
												<font face="Verdana">      // my_u._d('c');</font>
										</p>
										<p>
												<font face="Verdana">      my_u.long_mem(99); // Activate long_mem</font>
										</p>
										<p>
												<font face="Verdana">      assert(my_u._d() == 'L'); // Verify <a href="http://www.itisedu.com/phrase/200604231343545.html" target="_new">DI</a>scriminator</font>
										</p>
										<p>
												<font face="Verdana">      assert(my_u.long_mem() == 99); // Verify value</font>
										</p>
										<p>
												<font face="Verdana">      // my_u._d('c');</font>
										</p>
										<p>
												<font face="Verdana">      cout &lt;&lt; my_u.char_mem() &lt;&lt; endl;</font>
										</p>
										<p>
												<font face="Verdana">}</font>
										</p>
										<p>
												<font face="Verdana">注：请自行添加相关头文件。</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">当union中还包括其他变长类型时，情况将变得很复杂，但使用上并没有太大差异，这里就不深入讨论了，感兴趣的朋友可以阅读参考1的相关章节。</font>
										</p>
										<p>
												<font face="Verdana">·        array<br />array并不是一个idl所使用的关键字，它表示的是普通定长数组，它被映射成C++代码时也是一个普通的定长数组，因此，其用法比较简单。下面是一个使用array的idl的例子：</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">typedef float FloatArray[4];</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">typedef string StrArray[15][10];</font>
										</p>
										<p>
												<font face="Verdana">struct S {</font>
										</p>
										<p>
												<font face="Verdana">      string s_mem;</font>
										</p>
										<p>
												<font face="Verdana">      long l_mem;</font>
										</p>
										<p>
												<font face="Verdana">};</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">typedef S StructArray[20];</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">相关测试代码如下：</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">#include <iostream></iostream></font>
										</p>
										<p>
												<font face="Verdana">using namespace std;</font>
										</p>
										<p>
												<font face="Verdana">
												</font> </p>
										<p>
												<font face="Verdana">int main() {</font>
										</p>
										<p>
												<font face="Verdana">      FloatArray my_f = { 1.0, 2.0, 3.0 };</font>
										</p>
										<p>
												<font face="Verdana">      my_f[3] = my_f[2];</font>
										</p>
										<p>
												<font face="Verdana">      StrArray my_str;</font>
										</p>
										<p>
												<font face="Verdana">      my_str[0][0] = CORBA::string_dup("Hello"); // Transfers ownership</font>
										</p>
										<p>
												<font face="Verdana">      my_str[0][1] = my_str[0][0]; // Deep copy</font>
										</p>
										<p>
												<font face="Verdana">      StructArray my_s;</font>
										</p>
										<p>
												<font face="Verdana">      my_s[0].s_mem = CORBA::string_dup("World"); // Transfers ownership</font>
										</p>
										<p>
												<font face="Verdana">      my_s[0].l_mem = 5;</font>
										</p>
										<p>
												<font face="Verdana">}</font>
										</p>
										<p>
												<font face="Verdana">注：请自行添加相关头文件。</font>
										</p>
										<p>
												<font face="Verdana">参考：<br />1.      Michi Henning, Steve Vin<a href="http://www.itisedu.com/phrase/200604232131175.html" target="_new">OS</a>ki. Advanced CORBA Programming with C++. Addison-Wesley, 1999.</font>
										</p>
										<p>
												<font face="Verdana">2.      OMG. C++ Language Mapping, v1.1. http://www.omg.org/cgi-<a href="http://www.itisedu.com/phrase/200604232056595.html" target="_new">BI</a>n/apps/doc?f<a href="http://www.itisedu.com/phrase/200604231312115.html" target="_new">ORM</a>al/03-06-03.pdf</font>
										</p>
										<p>
												<font face="Verdana">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=726332<br /></font>
										</p>
								</td>
						</tr>
						<tr>
								<td align="right">来源：blog.csdn.net</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/huahit/aggbug/9572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/huahit/" target="_blank">无为斋</a> 2006-07-08 11:02 <a href="http://www.cppblog.com/huahit/articles/9572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TAO使用指南[zt from smth ]</title><link>http://www.cppblog.com/huahit/articles/9568.html</link><dc:creator>无为斋</dc:creator><author>无为斋</author><pubDate>Sat, 08 Jul 2006 02:21:00 GMT</pubDate><guid>http://www.cppblog.com/huahit/articles/9568.html</guid><wfw:comment>http://www.cppblog.com/huahit/comments/9568.html</wfw:comment><comments>http://www.cppblog.com/huahit/articles/9568.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/huahit/comments/commentRss/9568.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/huahit/services/trackbacks/9568.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="3" width="100%" align="center" border="0">
				<tbody>
						<tr width="100%">
								<td width="98%">
										<center>
												<h4>TAO使用指南[zt from smth ]</h4>
										</center>
										<br />(<font color="#008000"><em>by </em>huihoo.org</font>) <br /><br />标 题: TAO使用指南<br />发信站: BBS 水木清华站 (Thu May 8 18:35:49 2003), 站内<br /><br />最近正在将一个工程由Orbix2000向TAO移植. 将一些心得和经验奉上, <br />算是给DOC版做点贡献... 说的不对, 请大家指正. 同时您有什么心得<br />也不仿写出来嘛 :) <br /><br />1. 什么是TAO?<br />TAO是美国华盛顿大学的CORBA界大牛Douglas C. Schmidt博士领导<br />开发的一个实时CORBA平台. 它是一个开放源码项目, 所以是完全免费的. <br />用C++语言开发. 符合CORBA2.6版本.<br />支持语言: C++<br />支持平台: Win32, 常见的各种Unix, Linux, 实时操作系统如VxWorks<br />等等. 在所有的CORBA平台中, TAO支持的平台应该是最多的.<br />支持的服务: Naming, Event, Notification, Security, Time,<br />Scheduling, Logging, Lifecycle, Trading, Concurrency, Lifecycle,<br />A/V Streaming, Load balancing等.<br /><br />2. 网上的TAO资源<br />TAO主页: http://www.cs.wustl.edu/~schmidt/TAO.html<br />OCI公司宣布对TAO进行技术支持: http://www.ociweb.com<br />它出了一本书叫: TAO Developer's Guide, 上下两卷, 1000页<br />左右, 要250美刀. 吐血买了一本...<br />此外, OCI有自己的TAO发布版本, 最新版本号为1.2a. Win32版本<br />开价50美刀.<br />OCI有一个TAO的FAQ, 很不错, 地址:<br />http://www.ociweb.com/faq/index.html<br />TAO的Mailing List: tao-users@cs.wustl.edu<br />Mailing List Archive: http://groups.yahoo.com/group/tao-users<br /><br />3. 下载TAO<br />地址: http://deuce.doc.wustl.edu/Download.html<br />目前最新的Release版本是1.3<br /><br />发信人: Mentoya (钻研Orbix2000中...), 信区: DOC <br />标 题: TAO使用指南 -- 编译ACE和TAO<br />发信站: BBS 水木清华站 (Thu May 8 19:11:37 2003), 转信<br /><br />我只用到Win32平台. 现在使用的环境是: WinXP Professional + MSVC SP5.<br />在Win32平台下, 还可以使用C++ Builder来编译和开发TAO. 我没有用过.:-(<br />参见: http://www.cs.wustl.edu/~schmidt/ACE_wrappers/TAO/TAO-INSTALL.html<br />------------------------------------------------------------------------<br />TAO完全支持Win32API，(包括Windows NT, Windows 2000, Windows 95/98/ME)<br />VC5.0和VC6.0均可编译。如果要在Borland C++ Builder中编译，请参见有关文档.<br />TAO可以被编译成两种版本：DLL版（动态链接）和LIB版(静态链接)<br /><br />一. Win32+VC6.0下编译和安装ACE和TAO<br />将网上下载的TAO软件包解压缩到某个目录，在该目录下会有ACE_wrappers目录。<br />请按照以下步骤来执行：<br />1. 新建两个环境变量：<br />ACE_ROOT＝ACE_wrappers所在目录；<br />TAO_ROOT=ACE_wrappers\tao<br />2. 在ACE_ROOT\ace目录下建立一个空文件config.h，里面包含一句：<br />#include "ace/config-win32.h"<br />以说明是要在win32平台下进行编译。<br />注: <br />(1) #include "config-win32.h"亦可<br />(2) 最好在#include之前加上<br />#define ACE_HAS_STANDARD_CPP_LIBRARY 1 以使用MSVC的STL库.<br />3. 如果是98/ME，则在ACE_ROOT\ace\config.h的最前面加上<br />#define ACE_HAS_WINNT4 0<br />来关掉一些NT/2000中特有的代码。<br />4. 如果你想用MSVC的STL库 (如iostream, cstdio等), 则在config.h文件<br />中的#include语句前添加下面的行: <br />#define ACE_HAS_STANDARD_CPP_LIBRARY 1<br />注: 推荐使用该编译开关. 否则对新手而言, 在自己的工程中使用MSVC的STL<br />库时会有一些小麻烦.<br />5. 如果在ACE中要使用MFC的库，则需要在config.h中添加：<br />#define ACE_HAS_MFC 1<br /><br />在默认情况下，所有的ACE工程使用的是MSVC的DLL文件作为运行时库。<br />你可以选择使用ACE的静态库文件（LIB）而不需考虑这些运行时库。<br />选择动态链接的原因是所有的NT都会包含这些dll文件（节省空间）. <br />如果你想使用MFC的静态库版本，则需要在config.h中加入以下的宏定义：<br />#define ACE_USES_STATIC_MFC 1<br />你也可以全部使用静态库，这需要你在ACE的工程文件中自己设置。<br /><br />6. 如果定义了ACE_AS_STATIC_LIBS 宏，则ACE 库将被编译成为静态库。<br />如果你的程序要静态链接ACE的静态库，则在你的工程中也要定义这个宏:<br />ACE_AS_STATIC_LIBS.<br /><br />作为可选项，为了减小静态库文件和你的可执行程序的大小，你可以在<br />ACE_ROOT\ace\config.h文件的#include语句前添加如下的宏定义 <br />#define ACE_NO_INLINE<br />来禁止内联函数。<br /><br />7. 用VC打开TAO和ACE的工程文件：ACE_ROOT\tao\taoace.dsw，开始编译ACE<br />和TAO. 注意ACE和TAO有Debug和Release两个版本. 你在开发自己的程序时,<br />如果是Debug版的程序, 必须链接Debug版的TAO库, 如果是Release版的程序,<br />必须链接Release版的TAO库.(这不废话! 不过你一定会回来和我一起唱这个<br />当当当的) <br /><br />taoace.dsw中包含了许多工程, 工程之间是有依赖关系的. 所以这个工程<br />编译的顺序比较重要. 关于编译的顺序, 下文叙述.<br /><br />每个工程都包含有一些不同的配置：Debug/Release、MFC/Non-MFC、<br />Static/Dynamic等版本。你必须确定你所需要的版本。如，要生成你程序的<br />debug版，则需要debug版的ACE。<br /><br />注意：如果你用动态(DLL)版本的TAO，在开发程序时，需要将ACE_ROOT\bin<br />目录添加到你的程序的PATH环境变量中，否则程序会报告找不到动态链接库.<br /><br />8. 编译顺序.<br />TAO中有好多服务可能是你用不到的. 所以编译时没有必要将所有的程序全部<br />编译一遍. 要知道编译TAO还是个艰巨的任务咧.<br />我目前只用到了Naming和Event服务, 并且没有用它的实时CORBA功能. 所以我<br />的编译顺序是:<br /><br />说明 需要编译的工程<br />---------------------------------------<br />核心库 ACE DLL Files<br />TAO DLL Files<br />IDL编译器 gperf Files<br />TAO_IDL_FE_DLL Files<br />TAO_IDL_BE_DLL Files<br />TAO_IDL Compiler Files<br />POA PortableServer Files<br />名字和事件服务 IORTable Files<br />Svc Utils Files<br />CosNaming Files<br />Naming_Service Files<br />Messaging Files<br />CosEvent Files<br />CosEvent_Service Files<br />NT_Naming_Service Files<br />----------------------------------------<br />TAO的主页上有一个可以自动编译所有TAO工程的脚本, 记不得在那里了.<br /><br />9. 编译后得到的文件分散于各目录中:<br /><br />可执行程序和动态链接库文件： $ACE_ROOT\bin<br /><br />lib文件： $(ACE_ROOT)\ace,<br />$(TAO_ROOT)\tao,<br />$(TAO_ROOT)\orbsvcs\orbsvcs<br /><br />头文件： $(ACE_ROOT),<br />$(TAO_ROOT),<br />$(TAO_ROOT)\orbsvcs<br />10. ACE的DLL和LIB的命名规则:<br />当使用MSVC编译时的命名规则如下：<br /><br />"静态库/DLL文件名" + (是静态库吗? "s" : "") + <br />(是Debug模式的库吗? "d" : "") + (.dll/.lib)<br />11. 测试TAO<br />TAO的测试代码位于TAO_ROOT\tests目录下。有一个vc的工程文件：<br />TAO_tests.dsw来编译所有的测试代码。<br /><br />发信人: Mentoya (钻研Orbix2000中...), 信区: DOC <br />标 题: TAO使用指南 -- 用VC++开发TAO程序<br />发信站: BBS 水木清华站 (Thu May 8 19:34:42 2003), 转信<br /><br />在Microsoft Visual C++中开发TAO程序时的设置:<br /><br />一. 路径设置<br />1. 首先确认环境变量ACE_ROOT和TAO_ROOT已被正确设置.<br /><br />2. 将(ACE_ROOT\bin)添加到PATH环境变量中. 否则会找不到DLL.<br /><br />3. 在Tools-&gt;Options-&gt;Directories中, 分别添加如下目录:<br />Include files:<br />$(ACE_ROOT),$(TAO_ROOT),$(TAO_ROOT)\orbsvcs<br />Library files:<br />$(ACE_ROOT)\ace,$(TAO_ROOT)\tao,$(TAO_ROOT)\orbsvcs\orbsvcs<br />4. 也可以在<br />Project-&gt;Settings-&gt;C/C++-&gt;Preprocessor-&gt;Additional include directories<br />中添加头文件的路径.<br />在<br />Project-&gt;Settings-&gt;Link-&gt;Input-&gt;Additional library directories<br />中添加静态库文件路径.<br /><br />二. 工程设置<br />1. Project-&gt;Settings-&gt;C/C++-&gt;Code generation:<br />如果工程是Debug版, 选择Debug Multithreaded DLL<br />如果工程是Release版, 选择Multithreaded DLL<br />2. Project-&gt;Settings-&gt;Link-&gt;Input-&gt;Object/library modules:<br />需要添加TAO的静态链接库文件:<br /><br />说明 Debug版 Release版<br />---------------------------------------------<br />普通客户端: Debug版: ACEd.lib <br />Release版: ACE.lib<br />普通服务器: 在ACE.lib/ACEd.lib的基础上, 还需要添加:<br />Debug版: PortableServerd.lib<br />Release版: PortableServer.lib<br />如果使用了名字服务, 则需要添加 TAO_CosNaming.lib 或<br />TAO_CosNamingd.lib<br />如果使用了事件服务, 则需要添加 TAO_CosEvent.lib 或<br />TAO_CosEventd.lib<br /><br />注意: TAO分Debug和Release版, 所以在开发时, Debug和Release版<br />的设置要严格区分. 即使是MS自己的库也是这样. 如对于<br />Debug版, 要包含MSVCRTd.lib而不是MSVCRT.lib. 我就是因为<br />这个原因而使程序出现异常, 导致差点放弃了TAO :-(<br /><br />发信人: Mentoya (钻研Orbix2000中...), 信区: DOC <br />标 题: TAO使用指南 -- 做一个TAO的SDK<br />发信站: BBS 水木清华站 (Thu May 8 19:56:03 2003), 站内<br /><br />TAO的文件众多, 目录结构复杂, 所以生成一个所谓的TAO SDK来方便开发.<br />这个TAO SDK的目录结构如下:<br /><br />TAOSDK_ROOT<br />|<br />|-- bin (所有的可执行文件和动态链接库)<br />|-- idl (ORB的IDL文件)<br />|-- include (所有的头文件)<br />| |-- ace<br />| | |-- ***<br />| | |-- ***<br />| | <br />| |-- orbsvcs<br />| | |-- CosEvent<br />| | |-- Naming<br />| | |-- ***<br />| | |-- ***<br />| | <br />| |-- tao<br />| | |-- IORTable<br />| | |-- PortableServer<br />| | |-- ***<br />|-- lib (所有的静态库文件)<br /><br /><br />使用时, 首先创建环境变量 TAOSDK_ROOT 为TAO SDK的根目录, 然后<br />在VC的工程中如下设置:<br />添加头文件的include路径: <br />$(TAOSDK_ROOT)\include,$(TAOSDK_ROOT)\include\orbsvcs,$(TAOSDK_ROOT)\tao<br />添加静态库文件路径:<br />$(TAOSDK_ROOT)\lib<br /><br />下面提供了一个自动生成TAO SDK的批处理文件, 将该文件置于ACE_ROOT目录下,<br />然后执行之...<br />注: 本程序来源于TAO的邮件列表.<br /><br />File name: TAOSDK.bat<br />-------------------------------------------------------------------------<br />@echo off<br />@echo Createing directories…<br /><br />mkdir ..\tao\bin<br />mkdir ..\tao\include<br />mkdir ..\tao\include\ace<br />mkdir ..\tao\include\ace\classix<br />mkdir ..\tao\include\ace\qos<br />mkdir ..\tao\include\ace\rmcast<br />mkdir ..\tao\include\ace\ssl<br />mkdir ..\tao\include\tao<br />mkdir ..\tao\include\tao\BiDir_GIOP<br />mkdir ..\tao\include\tao\Domain<br />mkdir ..\tao\include\tao\DynamicAny<br />mkdir ..\tao\include\tao\DynamicInterface<br />mkdir ..\tao\include\tao\IFR_Client<br />mkdir ..\tao\include\tao\IORManipulation<br />mkdir ..\tao\include\tao\IORTable<br />mkdir ..\tao\include\tao\PortableServer<br />mkdir ..\tao\include\tao\RTCORBA<br />mkdir ..\tao\include\tao\RTPortableServer<br />mkdir ..\tao\include\tao\SmartProxies<br />mkdir ..\tao\include\tao\Strategies<br />mkdir ..\tao\include\tao\TypeCodeFactory<br />mkdir ..\tao\include\orbsvcs<br />mkdir ..\tao\include\orbsvcs\AV<br />mkdir ..\tao\include\orbsvcs\Concurrency<br />mkdir ..\tao\include\orbsvcs\CosEvent<br />mkdir ..\tao\include\orbsvcs\ESF<br />mkdir ..\tao\include\orbsvcs\ETCL<br />mkdir ..\tao\include\orbsvcs\Event<br />mkdir ..\tao\include\orbsvcs\FaultTolerance<br />mkdir ..\tao\include\orbsvcs\LifeCycle<br />mkdir ..\tao\include\orbsvcs\LoadBalancing<br />mkdir ..\tao\include\orbsvcs\Log<br />mkdir ..\tao\include\orbsvcs\Naming<br />mkdir ..\tao\include\orbsvcs\Notify<br />mkdir ..\tao\include\orbsvcs\Property<br />mkdir ..\tao\include\orbsvcs\Sched<br />mkdir ..\tao\include\orbsvcs\Security<br />mkdir ..\tao\include\orbsvcs\SSLIOP<br />mkdir ..\tao\include\orbsvcs\Time<br />mkdir ..\tao\include\orbsvcs\Trader<br />mkdir ..\tao\lib<br /><br />@echo copying header files...<br />copy ace\*.i ..\tao\include\ace<br />copy ace\*.inl ..\tao\include\ace<br />copy ace\*.h ..\tao\include\ace<br /><br />copy ace\*.cpp ..\tao\include\ace<br />copy ace\classix\*.i ..\tao\include\ace\classix<br />copy ace\classix\*.h ..\tao\include\ace\classix<br />copy ace\classix\*.cpp ..\tao\include\ace\classix<br />copy ace\qos\*.i ..\tao\include\ace\qos<br />copy ace\qos\*.h ..\tao\include\ace\qos<br />copy ace\qos\*.cpp ..\tao\include\ace\qos<br />copy ace\rmcast\*.i ..\tao\include\ace\rmcast<br />copy ace\rmcast\*.h ..\tao\include\ace\rmcast<br />copy ace\rmcast\*.cpp ..\tao\include\ace\rmcast<br />copy ace\ssl\*.i ..\tao\include\ace\ssl<br />copy ace\ssl\*.h ..\tao\include\ace\ssl<br />copy ace\ssl\*.cpp ..\tao\include\ace\ssl<br /><br />copy tao\tao\*.i ..\tao\include\tao<br />copy tao\tao\*.inl ..\tao\include\tao<br />copy tao\tao\*.h ..\tao\include\tao<br />copy tao\tao\*.idl ..\tao\include\tao<br />copy tao\tao\*.cpp ..\tao\include\tao<br />copy tao\orbsvcs\Naming_Service\*.h ..\tao\include\tao<br />copy tao\orbsvcs\LoadBalancer\*.h ..\tao\include\tao<br />copy tao\orbsvcs\Logging_Service\*.h ..\tao\include\tao<br />copy tao\orbsvcs\TAO_Service\*.h ..\tao\include\tao<br />copy tao\orbsvcs\Time_Service\*.h ..\tao\include\tao<br />copy tao\orbsvcs\Naming_Service\*.h ..\tao\include\tao<br />copy tao\orbsvcs\Trading_Service\*.h ..\tao\include\tao<br />copy tao\orbsvcs\ImplRepo_Service\*.h ..\tao\include\tao<br />copy tao\orbsvcs\Concurrency_Service\*.h ..\tao\include\tao<br />copy tao\orbsvcs\CosEvent_Service\*.h ..\tao\include\tao<br />copy tao\orbsvcs\Dump_Schedule\*.h ..\tao\include\tao<br />copy tao\orbsvcs\Event_Service\*.h ..\tao\include\tao<br />copy tao\orbsvcs\IFR_Service\*.h ..\tao\include\tao<br />copy tao\orbsvcs\LifeCycle_Service\*.h ..\tao\include\tao<br />copy tao\orbsvcs\Notify_Service\*.h ..\tao\include\tao<br />copy tao\orbsvcs\Scheduling_Service\*.h ..\tao\include\tao<br /><br />copy tao\orbsvcs\orbsvcs\*.h ..\tao\include\orbsvcs<br />copy tao\orbsvcs\orbsvcs\*.i ..\tao\include\orbsvcs<br />copy tao\orbsvcs\orbsvcs\*.cpp ..\tao\include\orbsvcs<br />copy tao\orbsvcs\orbsvcs\AV\*.h ..\tao\include\orbsvcs\AV<br />copy tao\orbsvcs\orbsvcs\AV\*.i ..\tao\include\orbsvcs\AV<br />copy tao\orbsvcs\orbsvcs\AV\*.cpp ..\tao\include\orbsvcs\AV<br />copy tao\orbsvcs\orbsvcs\Concurrency\*.h ..\tao\include\orbsvcs\Concurrency<br />copy tao\orbsvcs\orbsvcs\Concurrency\*.i ..\tao\include\orbsvcs\Concurrency<br />copy tao\orbsvcs\orbsvcs\Concurrency\*.cpp ..\tao\include\orbsvcs\Concurrency<br />copy tao\orbsvcs\orbsvcs\CosEvent\*.h ..\tao\include\orbsvcs\CosEvent<br />copy tao\orbsvcs\orbsvcs\CosEvent\*.i ..\tao\include\orbsvcs\CosEvent<br />copy tao\orbsvcs\orbsvcs\CosEvent\*.cpp ..\tao\include\orbsvcs\CosEvent<br />copy tao\orbsvcs\orbsvcs\ESF\*.h ..\tao\include\orbsvcs\ESF<br />copy tao\orbsvcs\orbsvcs\ESF\*.i ..\tao\include\orbsvcs\ESF<br />copy tao\orbsvcs\orbsvcs\ESF\*.cpp ..\tao\include\orbsvcs\ESF<br />copy tao\orbsvcs\orbsvcs\ETCL\*.h ..\tao\include\orbsvcs\ETCL<br />copy tao\orbsvcs\orbsvcs\ETCL\*.i ..\tao\include\orbsvcs\ETCL<br />copy tao\orbsvcs\orbsvcs\ETCL\*.cpp ..\tao\include\orbsvcs\ETCL<br />copy tao\orbsvcs\orbsvcs\Event\*.h ..\tao\include\orbsvcs\Event<br />copy tao\orbsvcs\orbsvcs\Event\*.i ..\tao\include\orbsvcs\Event<br />copy tao\orbsvcs\orbsvcs\Event\*.cpp ..\tao\include\orbsvcs\Event<br />copy tao\orbsvcs\orbsvcs\FaultTolerance\*.h ..\tao\include\orbsvcs\FaultTolerance<br />copy tao\orbsvcs\orbsvcs\FaultTolerance\*.i ..\tao\include\orbsvcs\FaultTolerance<br />copy tao\orbsvcs\orbsvcs\FaultTolerance\*.cpp ..\tao\include\orbsvcs\FaultTolerance<br />copy tao\orbsvcs\orbsvcs\LifeCycle\*.h ..\tao\include\orbsvcs\LifeCycle<br />copy tao\orbsvcs\orbsvcs\LifeCycle\*.i ..\tao\include\orbsvcs\LifeCycle<br />copy tao\orbsvcs\orbsvcs\LifeCycle\*.cpp ..\tao\include\orbsvcs\LifeCycle<br />copy tao\orbsvcs\orbsvcs\LoadBalancing\*.h ..\tao\include\orbsvcs\LoadBalancing<br />copy tao\orbsvcs\orbsvcs\LoadBalancing\*.i ..\tao\include\orbsvcs\LoadBalancing<br />copy tao\orbsvcs\orbsvcs\LoadBalancing\*.cpp ..\tao\include\orbsvcs\LoadBalancing<br />copy tao\orbsvcs\orbsvcs\Log\*.h ..\tao\include\orbsvcs\Log<br />copy tao\orbsvcs\orbsvcs\Log\*.i ..\tao\include\orbsvcs\Log<br />copy tao\orbsvcs\orbsvcs\Log\*.cpp ..\tao\include\orbsvcs\Log<br />copy tao\orbsvcs\orbsvcs\Naming\*.h ..\tao\include\orbsvcs\Naming<br />copy tao\orbsvcs\orbsvcs\Naming\*.i ..\tao\include\orbsvcs\Naming<br />copy tao\orbsvcs\orbsvcs\Naming\*.cpp ..\tao\include\orbsvcs\Naming<br />copy tao\orbsvcs\orbsvcs\Notify\*.h ..\tao\include\orbsvcs\Notify<br />copy tao\orbsvcs\orbsvcs\Notify\*.i ..\tao\include\orbsvcs\Notify<br />copy tao\orbsvcs\orbsvcs\Notify\*.cpp ..\tao\include\orbsvcs\Notify<br />copy tao\orbsvcs\orbsvcs\Property\*.h ..\tao\include\orbsvcs\Property<br />copy tao\orbsvcs\orbsvcs\Property\*.i ..\tao\include\orbsvcs\Property<br />copy tao\orbsvcs\orbsvcs\Property\*.cpp ..\tao\include\orbsvcs\Property<br />copy tao\orbsvcs\orbsvcs\Sched\*.h ..\tao\include\orbsvcs\Sched<br />copy tao\orbsvcs\orbsvcs\Sched\*.i ..\tao\include\orbsvcs\Sched<br />copy tao\orbsvcs\orbsvcs\Sched\*.cpp ..\tao\include\orbsvcs\Sched<br />copy tao\orbsvcs\orbsvcs\Security\*.h ..\tao\include\orbsvcs\Security<br />copy tao\orbsvcs\orbsvcs\Security\*.i ..\tao\include\orbsvcs\Security<br />copy tao\orbsvcs\orbsvcs\Security\*.cpp ..\tao\include\orbsvcs\Security<br />copy tao\orbsvcs\orbsvcs\SSLIOP\*.h ..\tao\include\orbsvcs\SSLIOP<br />copy tao\orbsvcs\orbsvcs\SSLIOP\*.i ..\tao\include\orbsvcs\SSLIOP<br />copy tao\orbsvcs\orbsvcs\SSLIOP\*.cpp ..\tao\include\orbsvcs\SSLIOP<br />copy tao\orbsvcs\orbsvcs\Time\*.h ..\tao\include\orbsvcs\Time<br />copy tao\orbsvcs\orbsvcs\Time\*.i ..\tao\include\orbsvcs\Time<br />copy tao\orbsvcs\orbsvcs\Time\*.cpp ..\tao\include\orbsvcs\Time<br />copy tao\orbsvcs\orbsvcs\Trader\*.h ..\tao\include\orbsvcs\Trader<br />copy tao\orbsvcs\orbsvcs\Trader\*.i ..\tao\include\orbsvcs\Trader<br />copy tao\orbsvcs\orbsvcs\Trader\*.cpp ..\tao\include\orbsvcs\Trader<br /><br />copy tao\tao\BiDir_GIOP\*.h ..\tao\include\tao\BiDir_GIOP<br />copy tao\tao\BiDir_GIOP\*.inl ..\tao\include\tao\BiDir_GIOP<br />copy tao\tao\BiDir_GIOP\*.i ..\tao\include\tao\BiDir_GIOP<br />copy tao\tao\Domain\*.h ..\tao\include\tao\Domain<br />copy tao\tao\Domain\*.inl ..\tao\include\tao\Domain<br />copy tao\tao\Domain\*.i ..\tao\include\tao\Domain<br />copy tao\tao\DynamicAny\*.h ..\tao\include\tao\DynamicAny<br />copy tao\tao\DynamicAny\*.inl ..\tao\include\tao\DynamicAny<br />copy tao\tao\DynamicAny\*.i ..\tao\include\tao\DynamicAny<br />copy tao\tao\DynamicInterface\*.h ..\tao\include\tao\DynamicInterface<br />copy tao\tao\DynamicInterface\*.inl ..\tao\include\tao\DynamicInterface<br />copy tao\tao\DynamicInterface\*.i ..\tao\include\tao\DynamicInterface<br />copy tao\tao\IFR_Client\*.h ..\tao\include\tao\IFR_Client<br />copy tao\tao\IFR_Client\*.inl ..\tao\include\tao\IFR_Client<br />copy tao\tao\IFR_Client\*.i ..\tao\include\tao\IFR_Client<br />copy tao\tao\IORManipulation\*.h ..\tao\include\tao\IORManipulation<br />copy tao\tao\IORManipulation\*.inl ..\tao\include\tao\IORManipulation<br />copy tao\tao\IORManipulation\*.i ..\tao\include\tao\IORManipulation<br />copy tao\tao\IORTable\*.h ..\tao\include\tao\IORTable<br />copy tao\tao\IORTable\*.inl ..\tao\include\tao\IORTable<br />copy tao\tao\IORTable\*.i ..\tao\include\tao\IORTable<br />copy tao\tao\PortableServer\*.h ..\tao\include\tao\PortableServer<br />copy tao\tao\PortableServer\*.inl ..\tao\include\tao\PortableServer<br />copy tao\tao\PortableServer\*.i ..\tao\include\tao\PortableServer<br />copy tao\tao\RTCORBA\*.h ..\tao\include\tao\RTCorba<br />copy tao\tao\RTCORBA\*.inl ..\tao\include\tao\RTCorba<br />copy tao\tao\RTCORBA\*.i ..\tao\include\tao\RTCorba<br />copy tao\tao\RTPortableServer\*.h ..\tao\include\tao\RTPortableServer<br />copy tao\tao\RTPortableServer\*.inl ..\tao\include\tao\RTPortableServer<br />copy tao\tao\RTPortableServer\*.i ..\tao\include\tao\RTPortableServer<br />copy tao\tao\SmartProxies\*.h ..\tao\include\tao\SmartProxies<br />copy tao\tao\SmartProxies\*.inl ..\tao\include\tao\SmartProxies<br />copy tao\tao\SmartProxies\*.i ..\tao\include\tao\SmartProxies<br />copy tao\tao\Strategies\*.h ..\tao\include\tao\Strategies<br />copy tao\tao\Strategies\*.inl ..\tao\include\tao\Strategies<br />copy tao\tao\Strategies\*.i ..\tao\include\tao\Strategies<br />copy tao\tao\TypeCodeFactory\*.h ..\tao\include\tao\TypeCodeFactory<br />copy tao\tao\TypeCodeFactory\*.inl ..\tao\include\tao\TypeCodeFactory<br />copy tao\tao\TypeCodeFactory\*.i ..\tao\include\tao\TypeCodeFactory<br /><br />@echo copying libraries...<br />copy ace\*.lib ..\tao\lib<br />copy ace\SSL\*.lib ..\tao\lib<br />copy tao\tao\*.lib ..\tao\lib<br />copy tao\tao\BiDir_GIOP\*.lib ..\tao\lib<br />copy tao\tao\Domain\*.lib ..\tao\lib<br />copy tao\tao\DynamicAny\*.lib ..\tao\lib<br />copy tao\tao\DynamicInterface\*.lib ..\tao\lib<br />copy tao\tao\IFR_Client\*.lib ..\tao\lib<br />copy tao\tao\IORManipulation\*.lib ..\tao\lib<br />copy tao\tao\IORTable\*.lib ..\tao\lib<br />copy tao\tao\PortableServer\*.lib ..\tao\lib<br />copy tao\tao\RTCORBA\*.lib ..\tao\lib<br />copy tao\tao\RTPortableServer\*.lib ..\tao\lib<br />copy tao\tao\SmartProxies\*.lib ..\tao\lib<br />copy tao\tao\Strategies\*.lib ..\tao\lib<br />copy tao\tao\TypeCodeFactory\*.lib ..\tao\lib<br />copy tao\TAO_IDL\*.lib ..\tao\lib<br />copy tao\orbsvcs\IFR_Service\*.lib ..\tao\lib<br />copy tao\orbsvcs\orbsvcs\*.lib ..\tao\lib<br /><br />@echo copying binary files...<br />copy bin\*.dll ..\tao\bin<br />copy bin\*.exe ..\tao\bin<br />copy tao\orbsvcs\Concurrency_Service\Concurrency_Service.exe ..\tao\bin\Concurrency_Serviced.exe<br />copy tao\orbsvcs\Concurrency_Service\Release\Concurrency_Service.exe ..\tao\bin<br />copy tao\orbsvcs\CosEvent_Service\CosEvent_Service.exe ..\tao\bin\CosEvent_Serviced.exe<br />copy tao\orbsvcs\CosEvent_Service\Release\CosEvent_Service.exe ..\tao\bin<br />copy tao\orbsvcs\Dump_Schedule\Dump_Schedule.exe ..\tao\bin\Dump_Scheduled.exe<br />copy tao\orbsvcs\Dump_Schedule\Release\Dump_Schedule.exe ..\tao\bin<br />copy tao\orbsvcs\Event_Service\Event_Service.exe ..\tao\bin\Event_Serviced.exe<br />copy tao\orbsvcs\Event_Service\Release\Event_Service.exe ..\tao\bin<br />copy tao\orbsvcs\IFR_Service\IFR_Service.exe ..\tao\bin\IFR_Serviced.exe<br />copy tao\orbsvcs\IFR_Service\Release\IFR_Service.exe ..\tao\bin<br />copy tao\orbsvcs\ImplRepo_Service\ImplRepo_Service.exe ..\tao\bin\ImplRepo_Serviced.exe<br />copy tao\orbsvcs\ImplRepo_Service\Release\ImplRepo_Service.exe ..\tao\bin<br />copy tao\orbsvcs\LifeCycle_Service\LifeCycle_Service.exe ..\tao\bin\LifeCycle_Serviced.exe<br />copy tao\orbsvcs\LifeCycle_Service\Release\LifeCycle_Service.exe ..\tao\bin<br />copy tao\orbsvcs\Naming_Service\Naming_Service.exe ..\tao\bin\Naming_Serviced.exe<br />copy tao\orbsvcs\Naming_Service\NT_Naming_Service.exe ..\tao\bin\NT_Naming_Serviced.exe<br />copy tao\orbsvcs\Naming_Service\Release\Naming_Service.exe ..\tao\bin<br />copy tao\orbsvcs\Naming_Service\Release\NT_Naming_Service.exe ..\tao\bin<br /><br />copy tao\orbsvcs\Notify_Service\Notify_Service.exe ..\tao\bin<br />copy tao\orbsvcs\Scheduling_Service\Scheduling_Service.exe ..\tao\bin\Scheduling_Serviced.exe<br />copy tao\orbsvcs\Scheduling_Service\Release\Scheduling_Service.exe ..\tao\bin<br />copy tao\orbsvcs\Trading_Service\Trading_Service.exe ..\tao\bin\Trading_Serviced.exe<br />copy tao\orbsvcs\Trading_Service\Release\Trading_Service.exe ..\tao\bin<br /><br />@Create TAO SDK Finished!<br />------------------------------------------------------------------------- <br />发信人: Mentoya (钻研Orbix2000中...), 信区: DOC <br />标 题: TAO使用指南 -- IDL编译器<br />发信站: BBS 水木清华站 (Thu May 8 20:56:43 2003), 站内<br /><br />TAO的IDL编译器名字是: tao_idl.exe. Debug版位于Ace_Wrappers\bin目录下,<br />Release版位于Ace_Wrappers\bin\release目录下，文件名仍为tao_idl.exe。<br /><br />1. 产生的文件:<br />*.idl文件被编译后产生的文件由文件名和后缀组成. 类型有:<br /><br />说明 产生的文件格式(默认) 备注<br />---------------------------------------------------------------<br />客户stubs *C.h、*C.cpp、*C.i <br />服务器 skeletons *S.h、*S.cpp、*S.i <br />服务器 skeleton (tie) *S_T.h、*S_T.cpp、*S_T.i 可以用-Sc开关来去掉这些文件<br />实现类文件 *I.h、*I.cpp 默认不生成这些文件，需要用<br />-GI开关<br />---------------------------------------------------------------<br />注: 产生的文件格式(后缀、扩展名等)可以由命令行开关来控制。<br /><br />2. TAO_IDL的编译选项:<br />输入命令<br />tao_idl -u<br />就会出现对idl的编译选项的详细说明.<br /><br />TAO IDL编译器的编译选项虽然很多, 但是常用的就那么几个.<br /><br />-Sc: 不生成tie类的实现<br />-Wb,pch_include=stdafx.h 生成的每个cpp文件都会包含#include "stdafx.h"<br />-GI: 生成空的Implementation类.<br />-Idir: 指定idl编译器的搜索路径<br /><br />这里要注意, 编译选项是大小写敏感的.<br /><br />注:<br />发现在编译idl文件时, IDL文件中的#define, #ifdef, #endif等行必须从<br />第一列开始, 否则编译器会报错.<br />发信人: Mentoya (学习TAO中~), 信区: DOC <br />标 题: TAO使用指南 -- 名字服务<br />发信站: BBS 水木清华站 (Sat May 10 22:11:17 2003), 转信<br /><br />名字服务（Naming Service，不过大家叫的更多的是命名服务）是CORBA的<br />最基本的服务之一。名字服务很简单，没有什么可说的。不过TAO对标准的名字<br />服务做了一个有趣的扩展，即可以利用multicast来得到名字服务。不过个人认<br />为除了方便了那么一点点之外，用处不大。而如果当局域网内有多个主机同时<br />运行名字服务时，会造成混乱。<br />此外，TAO还提供了NT_Naming_Service，可以将名字服务注册为NT的服务。<br /><br />一. 启动名字服务<br />名字服务的文件名为：Naming_Service.exe，它的启动参数有：<br />% Naming_Service [-ORBNameServicePort nsport]<br />[-o ior_output_file]<br />[-p pid_file_name]<br />[-s context_size]<br />[-t time]<br />[-f persitence_file_name]<br />[-b base_address]<br />[-m (1=enable multicast responses,0=disable(default)]<br /><br />-ORBNameServicePort nsport：指定名字服务监听multicast包的端口号。<br />只有在使用了'-m 1'时才有效.<br />-o ior_output_file: 指定文件名, 用来保存名字服务的根上下文的IOR.<br />-p pid_file_name: 指定文件名,用来保存名字服务程序的进程id<br />-s context_size: 当创建上下文时, 指定新上下文使用的哈希表的大小, 默认1024<br />-t time: 名字服务监听的时间, 单位:秒. 默认: 无限<br />-f persistence_file_name: 指定文件名, 用来存放名字服务中被绑定的对象引用.<br />-m (1=enable multicast responses,0=disable(default): 是否使用多播功能.<br /><br />运行名字服务时, 可以使用-ORBEndpoint参数来指定其运行的端点(有关<br />-ORBEndpoint的详细内容参见文档: $TAO_ROOT\docs\ORBEndpoint.html):<br /><br />Naming_Service -ORBEndpoint iiop://localhost:2809 -m 0<br />(名字服务在本机的2809端口监听请求, 不使用多播方式)<br /><br />二. 访问名字访问<br />这里均假定使用Naming_Service -ORBEndpoint iiop://localhost:2809 -m 0<br />来启动名字访问. 客户端有多种方法来访问名字服务:<br />第一种方法:<br />启动客户程序时用corbaloc指定初始引用:<br />MessengerServer -ORBInitRef NameService=corbaloc::localhost:2809/NameService<br />在MessengerServer源程序中, 直接使用:<br />orb-&gt;resolve_initial_references("NameService");<br />来得到名字服务.<br /><br />第二种方法:<br />客户程序启动时不带参数:<br />MessengerServer<br />而在MessengerServer源程序中, 使用:<br />orb-&gt;string_to_object("corbaloc::localhost:2809/NameService");<br />来得到名字服务.<br /><br />三. TAO_Naming_Client和TAO_Naming_Server类:<br />1. TAO_Naming_Client类: 将访问名字服务部分的代码进行了封装. 使用方法:<br />//---------------------------------------------<br />#include &lt;Naming/Naming_Utils.h&gt;<br /><br />TAO_Naming_Client naming_client;<br />if (naming_client.init(orb.in()) != 0)<br />{<br />cerr &lt;&lt; "Could not initialize naming client." &lt;&lt; endl;<br />return 1;<br />}<br />// 解析<br />CORBA::Object_var obj = naming_client-&gt;resolve(name);<br />// 绑定<br />naming_client-&gt;rebind(name, obj_ref.in());<br /><br />2. TAO_Naming_Server类: 使用该类, 可以将名字服务功能集成到自己的应用<br />程序中.<br />有关TAO_Naming_Server类的使用方法, 见: 咦, 这个例程不在TAO的标准包<br />中, 是OCI公司的examples. 我硬盘上的这个忘了是从那里下载的了, 如果有人需<br />要的话给我写信好了.<br /><br />四. 名字服务工具<br />在$TAO_ROOT\utils目录下, 有NamingViewer和nslist两个名字服务的工具.<br />有兴趣的话编译出来玩玩.:-)<br /></td>
								<!--结束正文-->
								<td width="1%">
								</td>
						</tr>
				</tbody>
		</table>
		<!--结束中部-->
		<!--开始底部-->
		<script language="javascript" src="../public/bottom.js">
		</script>
		<table cellspacing="0" cellpadding="0" width="760" align="center" border="0">
				<tbody>
						<tr>
								<td align="middle">
										<font size="2">© 2006 Huihoo</font>
										<br />
								</td>
						</tr>
				</tbody>
		</table>
		<!--结束底部-->
<img src ="http://www.cppblog.com/huahit/aggbug/9568.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/huahit/" target="_blank">无为斋</a> 2006-07-08 10:21 <a href="http://www.cppblog.com/huahit/articles/9568.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>