<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_haoxiaobo</title><subtitle type="text">从C到C++又到.net, 有一些心得, 和大家交流下...</subtitle><id>http://feed.cnblogs.com/blog/u/8940/rss</id><updated>2012-02-06T07:08:50Z</updated><author><name>HAL9000</name><uri>http://www.cnblogs.com/haoxiaobo/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haoxiaobo/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/8940/rss"/><entry><id>http://www.cnblogs.com/haoxiaobo/archive/2012/02/06/2340175.html</id><title type="text">关于中文编程的段子的一个实现</title><summary type="text">网上这几天正在疯传一段用C#进行中文编程的段子，说一个程序员就职后，发现公司的大哥里把C#用中文进行了包装，不光是类，还有关键字也进行了中文化，正在苦恼是不是要继续在这个公司干下去。这位大哥这种精神是否可嘉还真不好评价。对于没有意义的事情执着追求，是可嘉呢还是不可嘉，估计还是要看评论的人是谁。不过，人家自己的执着，别人也确实无资格评价。 还有所谓“意义”，恐怕也是因人而定义的。一个东西，对于为之付出了精力的人来说是有意义的，而对于其他人来说，即然与之没有交集，也就无资格置评。对于文中的小哥来说，喜欢的就留下搞搞明白，不喜欢的就走人吧。 只是这段中文化的代码，很有意思，上午试着用C#的lam..</summary><published>2012-02-06T07:03:00Z</published><updated>2012-02-06T07:03:00Z</updated><author><name>HAL9000</name><uri>http://www.cnblogs.com/haoxiaobo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haoxiaobo/archive/2012/02/06/2340175.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haoxiaobo/archive/2012/02/06/2340175.html"/><content type="html">&lt;p&gt;网上这几天正在疯传一段用C#进行中文编程的段子，说一个程序员就职后，发现公司的大哥里把C#用中文进行了包装，不光是类，还有关键字也进行了中文化，正在苦恼是不是要继续在这个公司干下去。&lt;/p&gt;&#xD;
&lt;p&gt;这位大哥这种精神是否可嘉还真不好评价。对于没有意义的事情执着追求，是可嘉呢还是不可嘉，估计还是要看评论的人是谁。不过，人家自己的执着，别人也确实无资格评价。&lt;/p&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&amp;nbsp; &amp;nbsp;还有所谓&amp;#8220;意义&amp;#8221;，恐怕也是因人而定义的。一个东西，对于为之付出了精力的人来说是有意义的，而对于其他人来说，即然与之没有交集，也就无资格置评。对于文中的小哥来说，喜欢的就留下搞搞明白，不喜欢的就走人吧。&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;只是这段中文化的代码，很有意思，上午试着用C#的lamda实现了一下，就所看到的代码而言，基本算是都实现了，现在我也可以用中文编程了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面是中文编程的示例，基本与网上那个段子差不多。&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Linq;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Text;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;namespace&lt;/span&gt;&amp;nbsp;中文编程&lt;br /&gt;&#xD;
{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;Program&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;Main(&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;[]&amp;nbsp;args)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;逻辑判断演示....&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;判断.如果是(判断.真).则(()&amp;nbsp;=&amp;gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;是&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}).否则(()&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;否&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;遍历器演示.....&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;登陆信息[]&amp;nbsp;所有登录信息&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;登陆信息[&lt;span style="color: #800080;"&gt;100&lt;/span&gt;];&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;....&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;遍历器.计数遍历().从(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;).到(&lt;span style="color: #800080;"&gt;99&lt;/span&gt;).每隔(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;).执行((当前索引行)&amp;nbsp;=&amp;gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;所有登录信息[当前索引行]&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;登陆信息()&amp;nbsp;{&amp;nbsp;姓名&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;姓名&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;当前索引行.ToString()&amp;nbsp;};&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;遍历器.枚举遍历&amp;lt;登陆信息&amp;gt;(所有登录信息).从(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;).到(&lt;span style="color: #800080;"&gt;99&lt;/span&gt;).每隔(&lt;span style="color: #800080;"&gt;3&lt;/span&gt;).执行((当前索引行,&amp;nbsp;登录信息项)&amp;nbsp;=&amp;gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(登录信息项);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;数据库连接类&amp;nbsp;数据连接对象&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;异常处理........&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;异常.对下列语句进行异常检测(()&amp;nbsp;=&amp;gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;数据连接对象&amp;nbsp;=&amp;nbsp;数据库连接类.连接到(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;10.1.138.35&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).用户名为(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;xxx&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;).密码为(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;xxx&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;数据连接对象.打开连接();&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;...&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;throw&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;Exception(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;测试异常&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.发现异常则((异常对象)&amp;nbsp;=&amp;gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;...&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(异常对象);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;})&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.最终执行(()&amp;nbsp;=&amp;gt;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;...&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;数据连接对象.关闭连接();&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;登陆信息&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;姓名;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;ToString()&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;姓名&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;姓名;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&#xD;
}&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;关键字的包装：-----------------------------------------------------&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Linq;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Text;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;namespace&lt;/span&gt;&amp;nbsp;中文编程&lt;br /&gt;&#xD;
{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;判断&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&amp;nbsp;真&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&amp;nbsp;假&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&amp;nbsp;_b;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;判断&amp;nbsp;如果是(&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&amp;nbsp;条件)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;判断(){_b&amp;nbsp;=&amp;nbsp;条件};&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;判断&amp;nbsp;则(Action&amp;nbsp;act)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(_b)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;act();&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;判断&amp;nbsp;否则(Action&amp;nbsp;act)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(!_b)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;act();&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;遍历器&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;枚举遍历器&amp;lt;T&amp;gt;&amp;nbsp;枚举遍历&amp;lt;T&amp;gt;(IEnumerable&amp;lt;T&amp;gt;&amp;nbsp;枚举集合)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;枚举遍历器&amp;lt;T&amp;gt;(枚举集合);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;计数遍历器&amp;nbsp;计数遍历()&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;计数遍历器()&amp;nbsp;{&amp;nbsp;};&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;枚举遍历器&amp;lt;T&amp;gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;protected&lt;/span&gt;&amp;nbsp;IEnumerable&amp;lt;T&amp;gt;&amp;nbsp;_set;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;_iStartIndex;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;_iEndIndex;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;_Step;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;枚举遍历器(IEnumerable&amp;lt;T&amp;gt;&amp;nbsp;枚举集合)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._set&amp;nbsp;=&amp;nbsp;枚举集合;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;枚举遍历器&amp;lt;T&amp;gt;&amp;nbsp;从(&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;开始元素序号)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._iStartIndex&amp;nbsp;=&amp;nbsp;开始元素序号;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;枚举遍历器&amp;lt;T&amp;gt;&amp;nbsp;到(&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;结束元素序号)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._iEndIndex&amp;nbsp;=&amp;nbsp;结束元素序号;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;枚举遍历器&amp;lt;T&amp;gt;&amp;nbsp;每隔(&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;每隔步长)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._Step&amp;nbsp;=&amp;nbsp;每隔步长;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;执行(Action&amp;lt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;,&amp;nbsp;T&amp;gt;&amp;nbsp;循环体方法)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;e&amp;nbsp;&lt;span style="color: #0000FF;"&gt;in&lt;/span&gt;&amp;nbsp;_set)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(i&amp;nbsp;&amp;gt;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._iStartIndex&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;i&amp;nbsp;&amp;lt;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._iEndIndex)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;((i&amp;nbsp;-&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._iStartIndex)&amp;nbsp;%&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._Step&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;循环体方法(i,&amp;nbsp;e);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i++;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;计数遍历器&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;_iStartIndex;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;_iEndIndex;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;_Step;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;计数遍历器&amp;nbsp;从(&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;开始元素序号)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._iStartIndex&amp;nbsp;=&amp;nbsp;开始元素序号;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;计数遍历器&amp;nbsp;到(&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;结束元素序号)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._iEndIndex&amp;nbsp;=&amp;nbsp;结束元素序号;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;计数遍历器&amp;nbsp;每隔(&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;每隔步长)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._Step&amp;nbsp;=&amp;nbsp;每隔步长;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;执行(Action&amp;lt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;gt;&amp;nbsp;循环体方法)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._iStartIndex;&amp;nbsp;i&amp;nbsp;&amp;lt;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._iEndIndex;&amp;nbsp;i&amp;nbsp;+=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._Step)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;循环体方法(i);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;异常&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Exception&amp;nbsp;_ex&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;异常&amp;nbsp;对下列语句进行异常检测(Action&amp;nbsp;正常执行程序)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;try&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;正常执行程序();&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;异常()&amp;nbsp;{&amp;nbsp;_ex&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;};&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;ex)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;异常()&amp;nbsp;{&amp;nbsp;_ex&amp;nbsp;=&amp;nbsp;ex};&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;异常&amp;nbsp;发现异常则(Action&amp;lt;Exception&amp;gt;&amp;nbsp;异常处理程序)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._ex&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;异常处理程序(&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._ex);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;异常&amp;nbsp;最终执行(Action&amp;nbsp;最终处理程序)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;最终处理程序();&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&#xD;
}&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;数据库连接的包装：&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #0000ff; "&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;using&amp;nbsp;System;&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Linq;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Text;&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&amp;nbsp;System.Data.SqlClient;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;span style="color: #0000FF;"&gt;namespace&lt;/span&gt;&amp;nbsp;中文编程&lt;br /&gt;&#xD;
{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;数据库连接类&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;_sServer;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;_sUID;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;_sPassword;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;_sDBName;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SqlConnection&amp;nbsp;_sqlconn&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;数据库连接类&amp;nbsp;连接到(&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;服务器名)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;数据库连接类()&amp;nbsp;{&amp;nbsp;_sServer&amp;nbsp;=&amp;nbsp;服务器名&amp;nbsp;};&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;数据库连接类&amp;nbsp;用户名为(&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;用户名)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_sUID&amp;nbsp;=&amp;nbsp;用户名;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;数据库连接类&amp;nbsp;密码为(&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;密码)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_sPassword&amp;nbsp;=&amp;nbsp;密码;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;数据库连接类&amp;nbsp;数据库为(&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;数据库名)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_sDBName&amp;nbsp;=&amp;nbsp;数据库名;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;打开连接()&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._sqlconn&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;SqlConnection(&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Data&amp;nbsp;Source={0};Initial&amp;nbsp;Catalog={1};User&amp;nbsp;ID={2};Password={3}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._sServer,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._sDBName,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._sUID,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._sPassword));&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._sqlconn.Open();&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;关闭连接()&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;._sqlconn.Close();&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
}&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;说实话，感觉很奇怪。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/haoxiaobo/aggbug/2340175.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haoxiaobo/archive/2012/02/06/2340175.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haoxiaobo/archive/2012/01/09/2317589.html</id><title type="text">VC非托管代码调用webservice，并支持代理服务器设置</title><summary type="text">这是这几天里我同时解决的另一个问题。我用的是VC2003，在非托菅的本机代码中调用webservice时，很有一些令人糊涂的地方，在这里记下来，以后也方便自己回忆。方法：1.增加webservice引用。2.自动生成代理类。上面简单。但当看着所生成的代理类时，多年没碰过VC代码的我哭了……VC的代理类是下面这样的：template &amp;lt;typename TClient = CSoapSocketClientT&amp;lt;&amp;gt; &amp;gt;class CWebService1T :	public TClient,	public CSoapRootHandler{。。。}模板套模板。。。嘛意思？意</summary><published>2012-01-09T14:49:00Z</published><updated>2012-01-09T14:49:00Z</updated><author><name>HAL9000</name><uri>http://www.cnblogs.com/haoxiaobo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haoxiaobo/archive/2012/01/09/2317589.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haoxiaobo/archive/2012/01/09/2317589.html"/><content type="html">&lt;p&gt;这是这几天里我同时解决的另一个问题。&lt;/p&gt;&lt;p&gt;我用的是VC2003，在非托菅的本机代码中调用webservice时，很有一些令人糊涂的地方，在这里记下来，以后也方便自己回忆。&lt;/p&gt;&lt;p&gt;方法：&lt;/p&gt;&lt;p&gt;1.增加webservice引用。&lt;/p&gt;&lt;p&gt;2.自动生成代理类。&lt;/p&gt;&lt;p&gt;上面简单。但当看着所生成的代理类时，多年没碰过VC代码的我哭了&amp;#8230;&amp;#8230;VC的代理类是下面这样的：&lt;/p&gt;&lt;p&gt;template &amp;lt;typename TClient = CSoapSocketClientT&amp;lt;&amp;gt; &amp;gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;class CWebService1T :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;	&lt;/span&gt;public TClient,&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;	&lt;/span&gt;public CSoapRootHandler&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;。。。&lt;/div&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;模板套模板。。。&lt;/p&gt;&lt;p&gt;嘛意思？&lt;/p&gt;&lt;p&gt;意思是：代理类在实例化时，要指定一个网络客户端工具类。默认这个类是CSoapSocketClientT&amp;lt;&amp;gt;, 这也是一个模板类。&lt;/p&gt;&lt;div&gt;&lt;div&gt;template &amp;lt;typename TSocketClass = ZEvtSyncSocket&amp;gt;&lt;/div&gt;&lt;div&gt;class CSoapSocketClientT&lt;/div&gt;&lt;/div&gt;&lt;p&gt;{&amp;nbsp;。。。}&lt;/p&gt;&lt;p&gt;看，默认的默认类是ZEvtSyncSocket，这是个啥类我实在没有心情去研究，看名字是一个Sock通讯类。不要不要！&lt;/p&gt;&lt;p&gt;那么调用webservice方法仲么办? 要这样：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp;CWebService1T&amp;lt;CSoapWininetClient&amp;gt; proxy = new&amp;nbsp;CWebService1T&amp;lt;CSoapWininetClient&amp;gt;;&lt;/div&gt;&lt;p&gt;&lt;span&gt;proxy-&amp;gt;SetUrl("&lt;a  href="http://xxx.com/Webservice1.asmx"&gt;http://xxx.com/Webservice1.asmx&lt;/a&gt;"); &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;proxy-&amp;gt;HelloWork();&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;这里我没有用VC神经乎乎地推荐的那个&amp;nbsp;CSoapSocketClientT&amp;lt;ZEvtSyncSocket&amp;gt;, 而是用了CSoapWininetClient类做为工具类（atlsoap.h)。&lt;/p&gt;&lt;p&gt;注意上面的代码，有一个SetUrl的方法调用，这个方法你一定在代理类中找不到，但是编译运行又都正常。奇怪不？&amp;nbsp;&lt;/p&gt;&lt;p&gt;请您这时候再回去注意一下CWebService1T的定义，CSoapWininetClient被置换为TClient泛型参数，而TClient又被放在了类定义的冒号后面，啥意思？&lt;/p&gt;&lt;p&gt;就是说你代入的这个模板参数类型将是代理类的父类呀！简直把人绕晕了！&lt;/p&gt;&lt;p&gt;也就是说，我写CWebService1T&amp;lt;CSoapWininetClient&amp;gt; proxy 时，CSoapWininetClient将是CWebService1T&amp;lt;&amp;gt;的基类！CSoapWininetClient有SetUrl, SetProxy等方法，所以proxy 也就可以调用这些方法了。&lt;/p&gt;&lt;p&gt;因为&amp;nbsp;CSoapWininetClient是用了Wininet.dll库的api进行通信的，这个库的特点就是支持http，而且和ie的设置是相通的，因此，用了这个工具类，你的proxy对象就可以透过代理服务器调用webserivce了。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;一切问题都解决了？没有。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;我这两天遇上了几个做难死人的问题&amp;#8212;&amp;#8212;一个客户的网络需要用代理服务器上网，而且是需要输入口令的。&lt;/p&gt;&lt;p&gt;本来这个问题也不是问题，只要ie能上网，在代理服务器要口令时，输入口令并选一下保存密码的复选框，这个用户凭据就会记录在系统中，&amp;nbsp;CSoapWininetClient就可以自动取用, &amp;nbsp;很多客户的网络环境都是这样的，我们的客户端程序运行得很好。&lt;/p&gt;&lt;p&gt;但是不幸的是，这个客户的机器被设置了策略，就算是在ie里选了保存密码的复选框，密码也不能保存下来，每次打开ie时，都需要重新输入口令。&lt;/p&gt;&lt;p&gt;既然系统里没有用户凭据，CSoapWininetClient也就没有办法从ie得到用户名与口令。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;我研究了CSoapWininetClient这个类，可恨的是这个类没有任何事件、callback、委托等扩展渠道让我在合适地地方切进去，设置那些代理啦、用户名啦口令啦什么的。在代理类调用hellowork时，就调用CSoapWininetClient的第一个方法就是SendRequest方法，在这个方法里，它打开对话，建立连接，Post数据、得到回应的流，一气呵成了！中间没有用户的机会加入代码。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;我发愁了老半天，决定从&amp;nbsp;CSoapWininetClient派生一个子类来用，想试试能不能通过重载一下某些方法来介入自己的代码。这叫什么模式来着？装饰类?&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;结果发现这个类里很多粉重要的方法、成员都是private的，没法引用。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;真没有办法了？我暴怒了！我和他拼了！我把&amp;nbsp;CSoapWininetClient类的源代码全拷贝出来，在项目里建了一个新类，叫CFuckedSoapWininetClient, 然后把CSoapWininetClient类的所有内容都复制了进去，现在，你是我的啦！哇哈哈！&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;再把调用Webservice的代码改一下，把参数类名改为Fuck过的新类。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp;CWebService1T&amp;lt;CFuckedSoapWininetClient&amp;gt; proxy = new&amp;nbsp;CWebService1T&amp;lt;CFuckedSoapWininetClient&amp;gt;;&lt;/div&gt;&lt;p&gt;&lt;span&gt;proxy-&amp;gt;SetUrl("&lt;a  href="http://xxx.com/Webservice1.asmx"&gt;http://xxx.com/Webservice1.asmx&lt;/a&gt;"); &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;proxy-&amp;gt;HelloWork();&amp;nbsp;&lt;/p&gt;&lt;p&gt;编译，通过。运行，通过！&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;现在，通信类是我的了，任我哪啥了！想加代理服务器支持，那是易如翻掌了。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;有关&amp;nbsp;代理服务器支持 功能的实现，请参考另一篇文章&amp;nbsp;&lt;a href="http://www.cnblogs.com/haoxiaobo/archive/2012/01/09/2317559.html"&gt;http://www.cnblogs.com/haoxiaobo/archive/2012/01/09/2317559.html&lt;/a&gt;。&lt;/p&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/haoxiaobo/aggbug/2317589.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haoxiaobo/archive/2012/01/09/2317589.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haoxiaobo/archive/2012/01/09/2317559.html</id><title type="text">天哪，我遇上了一个windows api BUG!  并贡献一个完全支持代理服务器的http文件下载VC代码</title><summary type="text">好吧，我遇上了windows api的bug...  并贡献一个完全支持代理服务器的http文件下载VC代码</summary><published>2012-01-09T14:04:00Z</published><updated>2012-01-09T14:04:00Z</updated><author><name>HAL9000</name><uri>http://www.cnblogs.com/haoxiaobo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haoxiaobo/archive/2012/01/09/2317559.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haoxiaobo/archive/2012/01/09/2317559.html"/><content type="html">&lt;p&gt;好吧，我遇上了windows api的bug...&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;一开始程序是采用了CInternetSession来打开一个Session，然后再用OpenUrl来打开一个CHttpFile文件. 这个程序一直工作得很好，只要ie能上网，它就能下载。如果用代理服务器，只需要在ie中设置好即可。如果代理服务器需要口令，只需要先在ie中访问页面，输入口令，并选择保存口令，这个程序就也能正常透过代理连接了。&lt;/p&gt;&#xD;
&lt;p&gt;直到有一天，它被安装在了一台ie6的windows xp机器上，它不能工作了。&lt;/p&gt;&#xD;
&lt;p&gt;因为&amp;nbsp;CInternetSession::OpenUrl方法调用了InternetOperUrl api函数，而InternetOperUrl函数，有个BUG.&lt;/p&gt;&#xD;
&lt;p&gt;InternetOperUrl在IE6的环境下，除非代理服务器的用户名与口令与当前用户的用户名与口令一致，否则他不能透过代理服务器连接http文件。&lt;/p&gt;&#xD;
&lt;p&gt;为什么我知道这是个BUG? 因为安装了ie8之后，&amp;nbsp;InternetOperUrl就能正常工作了&amp;#8212;&amp;#8212;只要在ie通过代理上网时，输入代理服务器口令时选择一下&amp;#8220;保存我的口令&amp;#8221;，InternetOperUrl就也能正常连接了。&lt;/p&gt;&#xD;
&lt;p&gt;在ie6下，&amp;nbsp;InternetOperUrl的似乎是总是用当前登录电脑的用户名与口令向代理服务器验证。这明显是一个错误。后来他们修好了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个问题让我折腾了三天，安装了n台不同版本的windows和ie环境，测试了各种各样的程序，我都几乎准备要动用我的msdn技术支持时,&amp;nbsp;终于确认了问题原因。&lt;/p&gt;&#xD;
&lt;p&gt;知道了原因就好办了。只需要绕开mfc的这个问题，直接用几个底层api就可以正常工作了。下面是可以正常工作的代码，一共支持三种不同的代理服务器设置：0 用ie的设置（包括ie保存了的密码），1，坚决不用代理，一定要直连。2，用本程序指定的代理。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="background-color: #f5f5f5; font-family: 'Courier New'; font-size: 14px; line-height: 16px; "&gt;iProxyMode 、&lt;/span&gt;&lt;span style="font-size: 14px; "&gt;bProxyNeedPassword、&lt;/span&gt;&lt;span style="background-color: #f5f5f5; font-family: 'Courier New'; font-size: 14px; line-height: 16px; "&gt;proxyinfo、&lt;/span&gt;&lt;span style="font-size: 14px; "&gt;sProxyUserName、&lt;/span&gt;&lt;span style="background-color: #f5f5f5; font-family: 'Courier New'; font-size: 14px; line-height: 16px; "&gt;sProxyPassword&lt;/span&gt;&lt;span style="font-size: 14px; "&gt;等&lt;/span&gt;&lt;span style="background-color: #f5f5f5; font-family: 'Courier New'; font-size: 14px; line-height: 16px; "&gt;是全局变量，你可以在调用这个函数之前准备好这些变量。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;BOOL&amp;nbsp;GetHttpFile(LPCTSTR&amp;nbsp;psUrl,&amp;nbsp;LPCTSTR&amp;nbsp;psLocalFile,&amp;nbsp;CString&amp;nbsp;&amp;amp;sErrMg)&lt;/div&gt;&#xD;
&lt;p&gt;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BOOL&amp;nbsp;b;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BOOL&amp;nbsp;bOK&amp;nbsp;=&amp;nbsp;TRUE;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;dwServiceType;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CString&amp;nbsp;strServer;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CString&amp;nbsp;strObject;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INTERNET_PORT&amp;nbsp;nPort;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BOOL&amp;nbsp;bParsed&amp;nbsp;=&amp;nbsp;AfxParseURL(psUrl,&amp;nbsp;dwServiceType,&amp;nbsp;strServer,&amp;nbsp;strObject,&amp;nbsp;nPort);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(!bParsed)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sErrMg&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;远程文件地址格式不对！&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;FALSE;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HINTERNET&amp;nbsp;m_hInternet&amp;nbsp;=&amp;nbsp;InternetOpen(&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Mozilla/4.0&amp;nbsp;(compatible;&amp;nbsp;MSIE&amp;nbsp;6.0;&amp;nbsp;Windows&amp;nbsp;NT&amp;nbsp;5.1;&amp;nbsp;SV1;&amp;nbsp;InfoPath.1)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INTERNET_OPEN_TYPE_PRECONFIG,&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL,&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(FALSE&amp;nbsp;==&amp;nbsp;m_hInternet)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hInternet);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sErrMg.Format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;建立网络会话&amp;nbsp;%s&amp;nbsp;失败&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;psUrl);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;FALSE;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(iProxyMode&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b&amp;nbsp;=&amp;nbsp;InternetSetOption&amp;nbsp;(NULL,&amp;nbsp;INTERNET_OPTION_PROXY,&amp;nbsp;(LPVOID)&amp;nbsp;&amp;amp;proxyinfo,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;sizeof&lt;/span&gt;&amp;nbsp;(proxyinfo));&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HINTERNET&amp;nbsp;m_hConnection&amp;nbsp;=&amp;nbsp;InternetConnect(&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_hInternet,&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strServer,&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nPort,&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL,&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL,&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INTERNET_SERVICE_HTTP,&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INTERNET_FLAG_NO_UI,&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL);&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(FALSE&amp;nbsp;==&amp;nbsp;m_hConnection)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hConnection);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hInternet);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sErrMg.Format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;建立网络连接&amp;nbsp;%s&amp;nbsp;失败&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;psUrl);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;FALSE;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(iProxyMode&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;bProxyNeedPassword)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;dwUserNameLen&amp;nbsp;=&amp;nbsp;sProxyUserName.GetLength()&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;dwUserPassLen&amp;nbsp;=&amp;nbsp;sProxyPassword.GetLength()&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b&amp;nbsp;=&amp;nbsp;InternetSetOption&amp;nbsp;(m_hConnection,&amp;nbsp;INTERNET_OPTION_PROXY_USERNAME,&amp;nbsp;(LPVOID)(LPCTSTR)sProxyUserName,&amp;nbsp;dwUserNameLen);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b&amp;nbsp;=&amp;nbsp;InternetSetOption&amp;nbsp;(m_hConnection,&amp;nbsp;INTERNET_OPTION_PROXY_PASSWORD,&amp;nbsp;(LPVOID)(LPCTSTR)sProxyPassword,&amp;nbsp;dwUserPassLen);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;LPCTSTR&amp;nbsp;s_szAcceptTypes[]&amp;nbsp;=&amp;nbsp;{&amp;nbsp;_T(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;*/*&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;),&amp;nbsp;NULL&amp;nbsp;};&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HINTERNET&amp;nbsp;m_hRequest&amp;nbsp;=&amp;nbsp;HttpOpenRequest(&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_hConnection,&amp;nbsp;_T(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;GET&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;),&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strObject,&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_T(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;HTTP/1.0&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;),&amp;nbsp;NULL,&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s_szAcceptTypes,&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INTERNET_FLAG_NO_UI&amp;nbsp;|&amp;nbsp;INTERNET_FLAG_KEEP_CONNECTION,&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;|&amp;nbsp;((m_url.GetScheme()&amp;nbsp;==&amp;nbsp;ATL_URL_SCHEME_HTTPS)&amp;nbsp;?&amp;nbsp;INTERNET_FLAG_SECURE&amp;nbsp;:&amp;nbsp;0)&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(FALSE&amp;nbsp;==&amp;nbsp;m_hRequest)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hRequest);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hConnection);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hInternet);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sErrMg.Format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;打开网络连接&amp;nbsp;%s&amp;nbsp;失败&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;psUrl);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;FALSE;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CString&amp;nbsp;strHeaders;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;strHeaders.Append(_T("Content-Type:&amp;nbsp;text/xml;&amp;nbsp;charset=utf-8\r\n"));&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b&amp;nbsp;=&amp;nbsp;HttpSendRequest(m_hRequest,&amp;nbsp;strHeaders,&amp;nbsp;(DWORD)&amp;nbsp;strHeaders.GetLength(),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NULL,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(FALSE&amp;nbsp;==&amp;nbsp;b)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hRequest);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hConnection);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hInternet);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sErrMg.Format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;向服务器发送请求&amp;nbsp;%s&amp;nbsp;失败&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;psUrl);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;FALSE;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;iStatus&amp;nbsp;=&amp;nbsp;GetInternetRequestStatusCode(m_hRequest);&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;(!(iStatus&amp;gt;=&amp;nbsp;&lt;span style="color: #800080;"&gt;200&lt;/span&gt;&amp;amp;&amp;amp;&amp;nbsp;iStatus&amp;lt;&lt;span style="color: #800080;"&gt;300&lt;/span&gt;&amp;nbsp;))&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hRequest);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hConnection);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hInternet);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sErrMg.Format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;打开远程文件出错，错误码：%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;iStatus);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;FALSE;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;byte&lt;/span&gt;&amp;nbsp;pData[&lt;span style="color: #800080;"&gt;65535&lt;/span&gt;];&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;dwReadedLen;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;dwWrittenLen;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HANDLE&amp;nbsp;hfile&amp;nbsp;=&amp;nbsp;CreateFile(psLocalFile,GENERIC_WRITE,&lt;span style="color: #800080;"&gt;0&lt;/span&gt;,&lt;span style="color: #800080;"&gt;0&lt;/span&gt;,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,&lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(hfile&amp;nbsp;==&amp;nbsp;INVALID_HANDLE_VALUE)&amp;nbsp;&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hRequest);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hConnection);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hInternet);&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sErrMg.Format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;创建本地文件&amp;nbsp;%s&amp;nbsp;失败&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;psLocalFile);&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;FALSE;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b&amp;nbsp;=&amp;nbsp;&amp;nbsp;InternetReadFile(m_hRequest,&amp;nbsp;(LPVOID)pData,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;sizeof&lt;/span&gt;(pData),&amp;nbsp;&amp;amp;dwReadedLen);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(b&amp;nbsp;==&amp;nbsp;FALSE)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CloseHandle(hfile);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hRequest);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hConnection);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hInternet);&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sErrMg.Format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;读取文件&amp;nbsp;%s&amp;nbsp;失败&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;psUrl);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;FALSE;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;(dwReadedLen&amp;nbsp;==&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;break&lt;/span&gt;;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b&amp;nbsp;=&amp;nbsp;WriteFile(hfile,&amp;nbsp;pData,&amp;nbsp;dwReadedLen,&amp;nbsp;&amp;amp;dwWrittenLen,NULL);&amp;nbsp;&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(b&amp;nbsp;==&amp;nbsp;FALSE)&amp;nbsp;&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CloseHandle(hfile);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hRequest);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hConnection);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hInternet);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sErrMg.Format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;写入本地文件&amp;nbsp;%s&amp;nbsp;失败&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;psLocalFile);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;FALSE;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CloseHandle(hfile);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hRequest);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hConnection);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InternetCloseHandle(m_hInternet);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sErrMg.Format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;下载成功&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;TRUE;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
}&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/haoxiaobo/aggbug/2317559.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haoxiaobo/archive/2012/01/09/2317559.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haoxiaobo/archive/2012/01/07/2315743.html</id><title type="text">找到锁域账号的元凶</title><summary type="text">域账号多次被锁，看起来是有人在狂试我的账号似的，解决办法记录一下。在ad控制器里，安全日志里做如下查找：事件id：644 意思是Lockout事件。内容：输入要搜索的账户名。不必输入域名。查到到日志之后，看看内容里的来源工作站名。去那个工作站上，查查有没有用此账户运行的定时任务、服务啥的。如果从前有，后来你改了口令，这些任务就不能运行了，可能会一遍遍用旧口令启动，最后达到次数上限锁定你的账号。如果没有明显的此类任务，查查是不是有一种叫Downadup的病毒。这个病毒会利用rdp的一个安全漏洞感染机器，如果你改了用户口令，这个病毒会重试你的账号直到lockout.从symantec网站上可以找到</summary><published>2012-01-07T07:06:00Z</published><updated>2012-01-07T07:06:00Z</updated><author><name>HAL9000</name><uri>http://www.cnblogs.com/haoxiaobo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haoxiaobo/archive/2012/01/07/2315743.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haoxiaobo/archive/2012/01/07/2315743.html"/><content type="html">&lt;p&gt;域账号多次被锁，看起来是有人在狂试我的账号似的，解决办法记录一下。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在ad控制器里，安全日志里做如下查找：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;事件id：644 &lt;/p&gt;&#xD;
&lt;p&gt;意思是Lockout事件。&lt;/p&gt;&#xD;
&lt;p&gt;内容：输入要搜索的账户名。不必输入域名。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;查到到日志之后，看看内容里的来源工作站名。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;去那个工作站上，查查有没有用此账户运行的定时任务、服务啥的。如果从前有，后来你改了口令，这些任务就不能运行了，可能会一遍遍用旧口令启动，最后达到次数上限锁定你的账号。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果没有明显的此类任务，查查是不是有一种叫Downadup的病毒。这个病毒会利用rdp的一个安全漏洞感染机器，如果你改了用户口令，这个病毒会重试你的账号直到lockout.&lt;/p&gt;&#xD;
&lt;p&gt;从symantec网站上可以找到专杀工具。&lt;/p&gt;&#xD;
&lt;p&gt;http://www.symantec.com/content/en/us/global/removal_tool/threat_writeups/D.exe&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;杀完病毒之后，可以按工具的提示去查看ms08-67安全公告，并下载补丁KB958644修复漏洞。&lt;/p&gt;&lt;p&gt;这个漏洞到从windows 2000 到 windows7 beta版和windows 2008 server为止都存在。在windows7 和windows 2008 Server r2开始不存在了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://technet.microsoft.com/zh-CN/security/bulletin/ms08-067"&gt;http://technet.microsoft.com/zh-CN/security/bulletin/ms08-067&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;要检查系统中有没有已经安装对应的补丁，可以检查KB958644是否安装。&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/haoxiaobo/aggbug/2315743.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haoxiaobo/archive/2012/01/07/2315743.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haoxiaobo/archive/2012/01/07/2315722.html</id><title type="text">求高手指点：VC中wininet的代理服务器问题，耗了两天了，没有一点办法</title><summary type="text">如何在CInternetSession下传文件时，设置要求用户名口令的代理服务器？如果安装了ie8，CInternetSession会自动采用ie的设置和用户保存的凭据，程序是完全透明的，但ie6下，相同的程序行为不同了，如何显式地设置代理服务器与用户名口令呢？请高手赐教！！！</summary><published>2012-01-07T06:45:00Z</published><updated>2012-01-07T06:45:00Z</updated><author><name>HAL9000</name><uri>http://www.cnblogs.com/haoxiaobo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haoxiaobo/archive/2012/01/07/2315722.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haoxiaobo/archive/2012/01/07/2315722.html"/><content type="html">&lt;div&gt;&lt;span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-family: simsun; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; text-align: left; background-color: #ffffff; line-height: 23px; "&gt;windows xp sp3 + ie6环境&lt;/span&gt;&lt;br style="color: #333333; text-align: left; background-color: #ffffff; font-family: simsun; line-height: 23px; " /&gt;&lt;br style="color: #333333; text-align: left; background-color: #ffffff; font-family: simsun; line-height: 23px; " /&gt;&lt;span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-family: simsun; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; text-align: left; background-color: #ffffff; line-height: 23px; "&gt;如何在CInternetSession下传文件时，设置要求用户名口令的代理服务器？&lt;/span&gt;&lt;br style="color: #333333; text-align: left; background-color: #ffffff; font-family: simsun; line-height: 23px; " /&gt;&lt;span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-family: simsun; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; text-align: left; background-color: #ffffff; line-height: 23px; "&gt;如果安装了ie8，CInternetSession会自动采用ie的设置和用户保存的凭据，程序是完全透明的，但ie6下，相同的程序行为不同了，如何显式地设置代理服务器与用户名口令呢？&lt;/span&gt;&lt;br style="color: #333333; text-align: left; background-color: #ffffff; font-family: simsun; line-height: 23px; " /&gt;&lt;br style="color: #333333; text-align: left; background-color: #ffffff; font-family: simsun; line-height: 23px; " /&gt;&lt;span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-family: simsun; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; text-align: left; background-color: #ffffff; line-height: 23px; "&gt;下面是我目前不能工作的代码，这个代码在ie8的环境里完全不必有SetOption()的动作都能自动正常。&lt;/span&gt;&lt;br style="color: #333333; text-align: left; background-color: #ffffff; font-family: simsun; line-height: 23px; " /&gt;&lt;br style="color: #333333; text-align: left; background-color: #ffffff; font-family: simsun; line-height: 23px; " /&gt;&lt;span style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-image: initial; font-family: simsun; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; text-align: left; background-color: #ffffff; line-height: 23px; "&gt;如何实现代理服务器的设置？&lt;/span&gt;&lt;/div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;BOOL&amp;nbsp;GetHttpFile(LPCTSTR&amp;nbsp;psUrl,&amp;nbsp;LPCTSTR&amp;nbsp;psLocalFile,&amp;nbsp;CString&amp;nbsp;&amp;amp;sErrMg)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;通过http获得远程的update文件。&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&amp;nbsp;buf[&lt;span style="color: #800080;"&gt;65536&lt;/span&gt;];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CString&amp;nbsp;sTemp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CInternetSession&amp;nbsp;sess;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;*&amp;nbsp;sProxyServer&amp;nbsp;=&amp;nbsp;_T(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;http://192.168.1.9:8080&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;*&amp;nbsp;sProxyUserName&amp;nbsp;=&amp;nbsp;_T(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;bejlife\\username&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;*&amp;nbsp;sProxyPassword&amp;nbsp;=&amp;nbsp;_T(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Password&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INTERNET_PROXY_INFO&amp;nbsp;proxyinfo;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxyinfo.dwAccessType&amp;nbsp;=&amp;nbsp;INTERNET_OPEN_TYPE_PROXY;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxyinfo.lpszProxy&amp;nbsp;=&amp;nbsp;sProxyServer;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxyinfo.lpszProxyBypass&amp;nbsp;=&amp;nbsp;NULL;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;bool&lt;/span&gt;&amp;nbsp;b&amp;nbsp;=&amp;nbsp;sess.SetOption(INTERNET_OPTION_PROXY,&amp;nbsp;(LPVOID)&amp;amp;proxyinfo,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;sizeof&lt;/span&gt;(INTERNET_PROXY_INFO),&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CHttpFile*&amp;nbsp;fileGet;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;try&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileGet=(CHttpFile*)sess.OpenURL(psUrl);&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;,&amp;nbsp;1,&amp;nbsp;INTERNET_FLAG_TRANSFER_BINARY);&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;(!fileGet)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sess.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sErrMg&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;不能打开远程文件！&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;FALSE;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileGet-&amp;gt;SetOption(INTERNET_OPTION_PROXY_USERNAME,&amp;nbsp;(LPVOID)sProxyUserName,&amp;nbsp;lstrlen(sProxyUserName)&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileGet-&amp;gt;SetOption(INTERNET_OPTION_PROXY_PASSWORD,&amp;nbsp;(LPVOID)sProxyPassword,&amp;nbsp;lstrlen(sProxyPassword)&amp;nbsp;+&amp;nbsp;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;catch&lt;/span&gt;(CException*&amp;nbsp;e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileGet&amp;nbsp;=&amp;nbsp;NULL;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;(!fileGet)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sess.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sErrMg&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;不能找到远程文件！&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;FALSE;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;iBuffLen;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;dwStatus;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;dwBuffLen&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;sizeof&lt;/span&gt;(dwStatus);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BOOL&amp;nbsp;bSuccess&amp;nbsp;=&amp;nbsp;fileGet-&amp;gt;QueryInfo(HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER,&amp;nbsp;&amp;amp;dwStatus,&amp;nbsp;&amp;amp;dwBuffLen);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;(!(&amp;nbsp;bSuccess&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;dwStatus&amp;gt;=&amp;nbsp;&lt;span style="color: #800080;"&gt;200&lt;/span&gt;&amp;amp;&amp;amp;&amp;nbsp;dwStatus&amp;lt;&lt;span style="color: #800080;"&gt;300&lt;/span&gt;&amp;nbsp;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileGet-&amp;gt;Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sess.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delete&amp;nbsp;fileGet;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sErrMg.Format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;打开远程文件出错，错误码：%d&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&amp;nbsp;dwStatus);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;FALSE;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CFile&amp;nbsp;fileWrite;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;(&amp;nbsp;!&amp;nbsp;fileWrite.Open(psLocalFile,&amp;nbsp;CFile::modeWrite|CFile::modeCreate))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileGet-&amp;gt;Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sess.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delete&amp;nbsp;fileGet;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sErrMg.Format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;本地文件打开出错.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;FALSE;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iBuffLen&amp;nbsp;=&amp;nbsp;fileGet-&amp;gt;Read((&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;*)buf,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;sizeof&lt;/span&gt;(buf));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;while&lt;/span&gt;(iBuffLen&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileWrite.Write(buf,&amp;nbsp;iBuffLen);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iBuffLen&amp;nbsp;=&amp;nbsp;fileGet-&amp;gt;Read((&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;*)buf,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;sizeof&lt;/span&gt;(buf));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileWrite.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileGet-&amp;gt;Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sess.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delete&amp;nbsp;fileGet;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sErrMg.Format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;下载成功&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;TRUE;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;}&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/haoxiaobo/aggbug/2315722.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haoxiaobo/archive/2012/01/07/2315722.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haoxiaobo/archive/2011/08/31/2161341.html</id><title type="text">业务系统设计要考虑的问题（三）地域化支持</title><summary type="text">既然已经上线了这样的“标准流程”的核心业务系统，就必然会立即遇上各种地域化问题。前面说过，中国各地发展极不同步，在经济、文化、政治、民间风俗、人文道德水平方面全国各地千差万别，相同的业务要求不同的服务方式是不可避免的。 比如说我们上线不久遇上的一个事情：这些年政府管控的力度越来越大，不仅管产品，管财务，还要管到各个公司的内部操作流程上，搞得大家都很难受，不知道国家是不是想要回到计划经济的路子上去。就是在这种背景下，我们分公司所在的当地政府的一些监管机关经常搞出个通知，要求在某个业务办理时，所出具的业务材料必须按官方规定的文字向客户进行书面表述什么的。 新业务系统上线之后，这种小小的需...</summary><published>2011-08-31T13:34:00Z</published><updated>2011-08-31T13:34:00Z</updated><author><name>HAL9000</name><uri>http://www.cnblogs.com/haoxiaobo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haoxiaobo/archive/2011/08/31/2161341.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haoxiaobo/archive/2011/08/31/2161341.html"/><content type="html">&lt;div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 既然已经上线了这样的&amp;#8220;标准流程&amp;#8221;的核心业务系统，就必然会立即遇上各种地域化问题。前面说过，中国各地发展极不同步，在经济、文化、政治、民间风俗、人文道德水平方面全国各地千差万别，相同的业务要求不同的服务方式是不可避免的。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 比如说我们上线不久遇上的一个事情：这些年政府管控的力度越来越大，不仅管产品，管财务，还要管到各个公司的内部操作流程上，搞得大家都很难受，不知道国家是不是想要回到计划经济的路子上去。就是在这种背景下，我们分公司所在的当地政府的一些监管机关经常搞出个通知，要求在某个业务办理时，所出具的业务材料必须按官方规定的文字向客户进行书面表述什么的。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 新业务系统上线之后，这种小小的需求也必须要向总公司提申请要求修改了。业务系统本来对于操作中的打印件采用了模板技术，如果需要修改内容，只需要修改模板中就可以了，但是问题是这个修改是只对我们一个分公司的，其他分公司没有这样的要求(或是其他的什么要求，都不一样)，一但这个模板修改了，全公司都会跟着我们的样式生成打印件。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 这个需求提到总部IT之后，负责的家伙着实地发了一阵子愁，最后还是没有好办法，只好在崭新的系统代码里加上了那个肮脏的&amp;#8220;if(strncmp(deptno, &amp;#8220;BEJ&amp;#8221;, 3) == 0)&amp;#8230;&amp;#8221;，在我们公司的操作员在操作这种业务时，特别地调用一个专门的模板文件。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 在目前的社会环境下，这种需求一定会很多，不仅有这样特别打印件的问题，还可以设想其他可能存在的同样地域性需要：&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; l 在UI上某处为某个地域的操作增加某些特别提醒信息&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; l 必要时还要跳出个MessageBox\alter来。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; l 打印外文版文档。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; l 某地区在标准流程中特别插入的步骤。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; l 某地区对某个业务的前置\后置检查逻辑。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; l 某种特别需要的警戒线提示。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; l 特别的数据展示格式。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; l &amp;#8230; &amp;#8230;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 对于这些域化的需求的解决方案，我在操作系统的设计中得到了启发。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; a) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;地域化静态资源扩展&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 操作系统常常需要开发不同的语言版本，为了简化开发，一般会将UI中所用到的字符串、图片、多媒体文件等做为一种&amp;#8220;资源&amp;#8221;来单独处理。操作系统中总是有一套Default的资源文件，然后为不同的文化和语言分别准备不同的特定资源。如果当前的文化设定所对应的特殊资源没有提供，那么系统就采用默认的资源，比如英文，如果存在当前文化设定对应的特殊资源，那么就采用特殊的资源。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 这个思想完全可以借签到业务系统的设计中，把分支机构如同操作系统中的一个文化-语言来处理，对于系统中所需要的资源类内容，按分支机构整理。在默认的情况下，系统会加载default资源来处理，而当一个分公司有特别需要时，为其特别定义一个资源，这样系统优先使用这个特殊定义的资源，使得系统可以方便地按地域提供个性的服务。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 应该说我们的系统还是考虑到了一个层面，就是可变的模板让标准内容可以方便地修改，可惜没有进一步认识到各地区差异需求必然性，现在，该为业务系统的设计者提个醒了&amp;#8212;&amp;#8212;当你设计一个要用到全国各地的系统时，地域化支持就成了必然要考虑的问题。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; b) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;应该考虑客户化插件标准&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 还有很多地方对于功能类的扩展要求，也可以参考操作系统的&amp;#8220;事件&amp;#8221;思想。就是说核心业务系统可以按标准的操作过程执行，但是同时设计一种机制，可以在某些时机来callback触发预定的&amp;#8220;额外功能插件&amp;#8221;。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 所述的&amp;#8220;时机&amp;#8221;可能如下的情况：&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; l 一个订单生成之前、之后。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; l 操作员登录后、注销前。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; l 某些信息安全事件。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; l &amp;#8230;&amp;#8230;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 对于这些事件，系统应该有一种标准化的&amp;#8220;定阅&amp;#8221;协议，使得程序员可以方便地注册定阅程序，这样在事件发生之后，系统根据定阅记录触发注册程序。这些程序可能不只一个，而且可能只是对与某个分支机构有关的事件才会触发。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 这里需要注意的系统的健壮性如何不受callback程序的影响，比如从技术上限定callback程序可以做的事情或不能做的事情，甚至要求callback程序只能是异步执行等。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 进一步地，可以将一些常见的插入任务制式化，比如特别的消息提示，电子邮件通知，存档，简单的表达式计算与数据检查，这些常见任务可以固定为可选用的任务模板，通过预定参数来达到不同的目的。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 应该承认，在整个系统中的所有的可能的地方实现这些可定制、可插入，其成本必然是很高的，但是，应该在系统中为这些特性做好技术的准备，你应该把加载资源的函数增加个分支机构代码参数，以备在需要时可供使用。也应该规定好事件触发的技术协议，那怕是通过某个规定的数据表中的记录来传递消息，只要有标准就行。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 如果你在系统设计中没有增加这些特性，那么你在发现自己在第二次在同一个地方写入&amp;#8220;if(strncmp())&amp;#8230;&amp;#8221;时，总应该开始认识考虑这个问题了吧？一个if可能是个偶然的个性问题，两个if出现在同一个地方时，你应该能认识到这是一个值得重构的弹性需求点，及时在这个地方引入地域资源化、事件订阅等设计模式，以免在上线第二个月时，就把你崭新的系统代码挂上一串串的大便。&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/haoxiaobo/aggbug/2161341.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haoxiaobo/archive/2011/08/31/2161341.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haoxiaobo/archive/2011/08/31/2161289.html</id><title type="text">业务系统设计要考虑的问题（二）分离业务逻辑服务层</title><summary type="text">商业公司的业务同质化很高，市场如战场，谁能快一步应变，谁能给客户提供个性化，谁就得到了业务，谁就能生存。特别是象中国这样各地的经济、文化、政治极其不平均的国家，中央与地方的差异鸿沟巨大，地方特色必然需要。但是站在总公司的管理角度上来考虑，当然是希望业务流程越规范越好，新花样总是意味着管理上的潜在危险。而对于总部信息技术部门的角度来看，个性化的新花样则是开发工作量的剧增、无止无尽的新需求。管理与市场、领导与客户、全局与局部、总公司与分公司之间，这个思路方向性的矛盾是现实存在，而且不可避免的。当然，最后项目还是要按上级的管理意图来实施，于是我们得到了一个全国一致的系统，一个唯一可用的UI，一本统一</summary><published>2011-08-31T12:21:00Z</published><updated>2011-08-31T12:21:00Z</updated><author><name>HAL9000</name><uri>http://www.cnblogs.com/haoxiaobo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haoxiaobo/archive/2011/08/31/2161289.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haoxiaobo/archive/2011/08/31/2161289.html"/><content type="html">&lt;div&gt;&#xD;
&lt;p style="margin-left:42.0pt;text-indent:-21.0pt;"&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;商业公司的业务同质化很高，市场如战场，谁能快一步应变，谁能给客户提供个性化，谁就得到了业务，谁就能生存。特别是象中国这样各地的经济、文化、政治极其不平均的国家，中央与地方的差异鸿沟巨大，地方特色必然需要。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;但是站在总公司的管理角度上来考虑，当然是希望业务流程越规范越好，新花样总是意味着管理上的潜在危险。而对于总部信息技术部门的角度来看，个性化的新花样则是开发工作量的剧增、无止无尽的新需求。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;管理与市场、领导与客户、全局与局部、总公司与分公司之间，这个思路方向性的矛盾是现实存在，而且不可避免的。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;当然，最后项目还是要按上级的管理意图来实施，于是我们得到了一个全国一致的系统，一个唯一可用的&lt;/span&gt;UI&lt;span style="font-family:宋体;"&gt;，一本统一印发的操作手册。对于常规的业务，按着系统的要求操作就可以满足需要了。但是这个系统不再给机会进行业务、技术的创新，一切新的想法只能做为新需求向上级提出，然后由情绪恶劣的&lt;/span&gt;IT&lt;span style="font-family:宋体;"&gt;人员在程序里加入一个个&lt;/span&gt; &amp;#8220;if(strncmp(deptno, &amp;#8220;BEJ&amp;#8221;, 3) == 0)&amp;#8230;&amp;#8221; &lt;span style="font-family:宋体;"&gt;这样丑陋到暴的代码来完成流程定制化。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent:21.0pt;"&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;其实要在同一个系统里同时满足总分公司双方的诉求，并不是不可能，就是把应用系统分为两层：业务逻辑与&lt;/span&gt;UI&lt;span style="font-family:宋体;"&gt;层，业务逻辑层是对业务逻辑的原子化，以实时服务的形式提供。在此业务逻辑服务的基础上，构建界面展现。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;这里的关键点在于业务逻辑服务的提供，不仅可以是标准&lt;/span&gt;UI&lt;span style="font-family:宋体;"&gt;对其的进程内调用，也同时需要能够通过&lt;/span&gt;webserivce&lt;span style="font-family:宋体;"&gt;等协议提供进程外服务。对于标准流程，可以由总部来做&amp;#8220;典型实现&amp;#8221;，而对于有特别需要的分部，则可以方便在业务服务的基础构建业务系统的其他前端外延。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;这样，从管理的角度上来讲，业务数据的进出都是通过标准服务来进行的，业务数据质量、业务一致性、合规性都可以通过统一的业务逻辑来得到保证，而分支机构则有机会为不同的业务开发不同的前端接口，以根据市场要求灵活创新。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;这种模式特别适合于有外部合作机构的公司采用，如金融企业、电子商务企业等。如果业务系统只有一个&lt;/span&gt;UI&lt;span style="font-family:宋体;"&gt;的&lt;/span&gt;IO&lt;span style="font-family:宋体;"&gt;方式，一切数据进出都要通过操作员来进行，那么与其他合作方进行自动化的数据对接就很难实现，一但有这样的需求，只能由交由掌握了底层逻辑的总公司&lt;/span&gt;IT&lt;span style="font-family:宋体;"&gt;从头开发。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;现在我们的系统已经上线，可惜的是，系统采用了最简单最直觉的思路开发，几乎要把业务逻辑写在界面里了。事已至此，也不可能有什么改变了，这里只是我有过的想法分享出来，作为讨论。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/haoxiaobo/aggbug/2161289.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haoxiaobo/archive/2011/08/31/2161289.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haoxiaobo/archive/2011/08/31/2160687.html</id><title type="text">业务系统设计要考虑的问题(一)分散式数据存储设计</title><summary type="text">近一段时间，公司上线了一个全国性的业务系统，这个系统功能覆盖了全部业务流程，用户包括全国32个分公司，可谓是一个把所有鸡蛋放在同一个蓝子里的巨大系统，上线过程多么辛苦不说了，只说上线后的一些问题所带给我的一些关于业务系统设计启发。</summary><published>2011-08-31T06:15:00Z</published><updated>2011-08-31T06:15:00Z</updated><author><name>HAL9000</name><uri>http://www.cnblogs.com/haoxiaobo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haoxiaobo/archive/2011/08/31/2160687.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haoxiaobo/archive/2011/08/31/2160687.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-family:宋体;"&gt;近一段时间，公司上线了一个全国性的业务系统，这个系统功能覆盖了全部业务流程，用户包括全国&lt;/span&gt;32&lt;span style="font-family:宋体;"&gt;个分公司，可谓是一个把所有鸡蛋放在同一个蓝子里的巨大系统，上线过程多么辛苦不说了，只说上线后的一些问题所带给我的一些关于业务系统设计启发。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;/p&gt;  &lt;p style="margin-left:42.0pt;text-indent:-21.0pt;"&gt;&lt;span&gt;一、&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;应该考虑分散式数据存储设计&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family: 宋体; "&gt;企业内的生产线类系统，一开始都对性能考虑不足，在设计中基本上都采用单一数据库来支持业务，随着业务规模的扩大，对数据库性能要求提升时，企业会采购更昂贵的软硬件产品来支持更大的访问压力，当实在无法缓解时，会考虑在数据库端采用分区等方法来分散硬件压力，但是数据库本身从逻辑上还是单一的实例。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;由于所有数据服务都在集中在少数的关键硬件上，就会造成几方面的问题，一是极高性能的硬件成本太高，二是所有的鸡蛋放在了同一个篮子里，服务故障造成的灾难影响面太大，三是硬件的升级总是跟不上数据量、访问量的提升速度，整个系统总是慢吞吞的。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;要解决这个问题，可以采用的第一个设计思路，是按业务领域划分为若干个系统，每个系统之间再做服务、数据、流程的集成。这种思路已经广为采用，优劣各人自知，不再多说，本文想讨论的是另一个更为大胆激进的想法：分散式客户数据。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;Facebook&lt;span style="font-family:宋体;"&gt;、&lt;/span&gt;twitter&lt;span style="font-family:宋体;"&gt;、微博这种社交网站面对的访问量远远大于企业应用，与企业应用相比而言，社交网站还要考虑如&amp;#8220;突然大批的用户涌来怎么办？&amp;#8221;、&amp;#8220;某个普通用户突然火了怎么办？&amp;#8221;这种突发性能要求的处理。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;他们解决方案是在软件逻辑上就支持分散存储，即建立数量不限的数据库，数据被按一定的策略分散保存在不同的数据库硬件里，这样在访问不同的数据时，可以按策略来判断应该去哪个数据库里去寻找数据。由于数据库是独立的，只需要增加一些低端的硬件，就可以达到平滑升级性能的目的。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;为了与逻辑上集中物理上分布的表分区等技术相区别，我以&amp;#8220;分散&amp;#8221;一词来表示这种在逻辑上的多数存储方案。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;数据分散的策略有哪些？主要是三种：&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;一是按业务（产品）领域划分。这种方式其实与分为多个子系统没有区别，但主要业务一般也是数据量最大、访问量最大的，按这种划分的话，可能还是无法解决最主要的问题。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;二是按业务时间划分。这种方法对于一些偏重近期的业务会有作用，如股票交易，但是对于依靠长期信息的业务则不实用，比如长期保险业务中，保单生效越长，反而越有可能发生理赔、给付等，而且在这些业务处理过程中，要依据业务对象的所有信息进行处理，如果数据是按时间分散保存的，软件系统逻辑上则有较大幅度的复杂度增加。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;三是按主业务对象的&amp;#8220;群落&amp;#8221;来划分。比如把客户分群，某一个客户的所有相关业务信息（比如他的博文、有关评论等）不可分散，按群放在不同的物理数据源中。这样，当系统存取某个客户的信息时，可以按群落找到客户所在的物理数据库，之后的逻辑则与集中式数据库的处理大体类似。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;如何得知客户所在群落呢？对于不存在个别突发的访问增长的系统，可以暂时采用平均式的分群方案，用某种约定算法求得客户群号，比如说按客户证件号的前几位。但是这种分类一但固定了就不容易更改，例如，一开始用证件号第一位平均分为&lt;/span&gt;10&lt;span style="font-family:宋体;"&gt;个数据库，但如果业务增加到&lt;/span&gt;10&lt;span style="font-family:宋体;"&gt;个数据库也顶不住时，要修改这个分群就很困难了。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;另一个办法就是采用一个中心数据库来记录用户所在群落，这个中心数据库里只需要一张表、最少三个字段就够了&amp;#8212;&amp;#8212;用户标识、群落号或物理数据源地址、可访问状态。当系统要开始处理一个用户的业务时，需要向这个数据库进行询问，得到群号后就可以转向所在数据源进行业务处理。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;这种办法的好处很大，比如微博这种社会网络上，常常会有人突然火了，前一天还是无名小卒，一百多个粉丝，每天两篇微博，被与其他五十万同样的屁民放在某个刀片机上的&lt;/span&gt;mysql&lt;span style="font-family:宋体;"&gt;里默默无闻着，谁知道第二天他可能运气太好（或是运气太坏）赶上了个什么热点时件，突然有几十万人来关注他，那个机器立即就顶不住了。在这种情况下，就用数据迁移程序把这个人的有关信息全部移到另一台小型机上去跑，迁移完成之后修改中心数据库，压力立即就调整了。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;这种迁移甚至可以做成自动的，发现哪个用户火了就自动启动，按策略移到预备的空闲计算资源上去。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;这样的系统架构下，压力最大的地方就成了中心数据库，但是第一，这个数据库中里没有业务数据，数据结构很简单，极容易优化索引与性能，就是买好硬件，所需的投资也有限。其次，用户分群策略可以结合固定规则与特殊指定分群，中心数据库可以只保存特殊指定分群的记录，如果没有记录则是按固定规则（证件号第一位？）来分。再次，应用服务器也可以按缓存访问过的用户分群信息，只在按固定规则断言数据源后访问失败、而且没有缓存过或按缓存访问失败的情况下才访问中心数据库，得到用户的最新群落位置。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;不可否认，这种模式会对全局性数据访问需求造成技术困难，例如需要统计全系统的一些数据时，就需要协调所有的数据库进行分别运算，最后再把结果汇总，这肯定需要一些全新的开发与运维架构来支持，但对于巨量数据的系统来说，统计结果的绝对精确性已经让位于系统可以正常运行的要求。&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/haoxiaobo/aggbug/2160687.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haoxiaobo/archive/2011/08/31/2160687.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haoxiaobo/archive/2011/02/14/1954384.html</id><title type="text">xml, oop, 云计算、web service，敏捷开发</title><summary type="text">有位老兄写了一篇《被高估的几种it技术》，大部分都没意见，只是对于其中xml, oop, 云计算、web service，敏捷开发几项，感觉应该客观地再评价一下。</summary><published>2011-02-14T07:31:00Z</published><updated>2011-02-14T07:31:00Z</updated><author><name>HAL9000</name><uri>http://www.cnblogs.com/haoxiaobo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haoxiaobo/archive/2011/02/14/1954384.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haoxiaobo/archive/2011/02/14/1954384.html"/><content type="html">&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;有位老兄写了一篇《被高估的几种it技术》，大部分都没意见，只是对于其中xml, oop, 云计算、web service，敏捷开发几项，感觉应该客观地再评价一下。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;xml&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;xml有其他数据语义标准之长，而无之短，只是语法上上有点儿冗余，但是这东西主要还是让计算机看的，捎待让人看懂已经很不错了。如果你玩过银行里那种古系统中的文本文件数据报文你就知道xml的好了。xml还有一整套配套的技术，如xmldoc, xpath等辅助使用。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;我见过用字符串拼接、查找来生成xml或是解析xml的（好可怜的程序员），这种用法是在用xml的皮毛，如果你是这样的程序员之一，那快去系统学习一下吧！不然要累毙了。&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;oop&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;原作者认为oop的设计模式把程序开发搞复杂志了，实际上oop与设计模式不是一回事，oop的思想根本上是把现实世界在计算机中建立映射，这是很好很有效的降低开发复杂度的办法。设计模式是是在oop基础上的算法总结，是指导而非要求。要反对的是学院派由于《设计模式》一书的存在而&amp;#8220;过度设计&amp;#8221;，而非是oop本身。但是，当你系统扩展弹性要求高了之后，你会发现答案还是设计模式中的一些办法。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;我没有看过《设计模式》之前，多年做oop的开发，之间为了解决问题而想出了不少设计办法。后来为了不被学院派精神虐待而看了《设计模式》这本当年的&amp;#8220;圣经&amp;#8221;之后，发现其中大半的设计办法我早就在之前的工作中自行发明使用过了。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;web service&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;web service是目前最好的解决平台间数据通讯的技术了。中立的数据类型，支持对象的语法规则，中立的通讯协议，自动代理方法工具，甚至连异常都能跨平台传输，你还需要啥呢？&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;不过，它的确不是万用法宝，它只能解决他适合解决的问题。ibm最会炒概念，你迷信ibm是你无知, webservice仍然工作得让人安心。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;最后，要是如果能解决web service的接口版本的兼容性问题就更好了，不解释了，用过的就知道我的意思。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;敏捷开发&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;敏捷开发的一个潜台词是&amp;#8220;高手开发&amp;#8221;，&amp;#8220;敏捷&amp;#8221; 的核心就是：深刻理解业务需求 + 合适（成本、可扩展性的均衡）地实现需求+ 一有必要立即重构以增加设计弹性 + tdd（质量保证）。所有这一切都需要高手才能做到。关于双人编程，实践中发有两个巨大好处: 一、知识传承没有问题了。二、两个人一起工作，注意能高度集中几倍于单人工作时的时间，三，讨论能理清思路。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;#8220;敏捷&amp;#8221;中文档的问题：同步程序与文档是一件很麻烦而没有效果的事情，后来人一般不会看详细设计的文档，更别提你的文笔也不一定达到让人能轻松读下去的水平。我的解决办法是：&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;一：设计文档就到架构设计。说明程序结构、设计思路、数据库设计，聪明人看过之后就明白你的意思了，一般不需要更详细的文档了。&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;一：程序就是文档，我不在乎你的变量名有多长：匈牙利命名法 、动词短语方法名。后来人看你的程序要像看一篇文章那么清楚。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;二：文档注释，必要的过程＼算法＼注释对接口方法进行说明。然后ndoc之类的工具就可以生成文档了，比自己搞得好得多，而且不会出错。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;对于大型的系统，我的实践经验是：在架构设计层面（系统设计、程序结构设计、数据库设计等），高手进行&amp;#8220;敏捷式设计&amp;#8221;，而具体的实现可由普通开发人员完成，一则提供优秀的系统设计、为未来始终留下扩展余地，二来也不会过度设计导致实现成本过高，三来普通的开发人员的工作也好干。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;题外话：与高手一起工作的惬意无与伦比。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;云计算&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;其实这是一个基础运行体系的解决方案，在专业it运行领域，虚拟化、基于冗余思想的高可用硬件是多年以来企业级厂商努力的方向。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;虚拟化有两个方向，一个是把一个高性能的硬件分为多个虚拟机运行，如ibm的高端机型，另一个方向是把多个物理机整合为一个虚拟的单一机器，任务分散、分布执行，从而得到高性能计算能力。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;云的意思是两者的结合&amp;#8212;&amp;#8212;多个物理机整合为一个虚拟机，这个一个虚拟机上再分为多个独立的逻辑单位，用于隔离不同的应用程序运行空间。这样，即得到了应用程序管理的便利，又得到了冗余硬件的可靠性，以及高弹性的性能管理。只要你做过基础运维你就会理解这个东西的宝贵。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;一个IT经理高声呼喊，快点到来吧，云计算！我需要一个私有云来解放我！&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/haoxiaobo/aggbug/1954384.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haoxiaobo/archive/2011/02/14/1954384.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/haoxiaobo/archive/2010/12/31/1922661.html</id><title type="text">用C#开发TUXEDO客户端</title><summary type="text">本文说明了以C#调用Tuxedo服务的基本过程，会帮助你完成第一次Tuxedo调用。在后记中，又讨论了字符集可能会引起的问题, 希望能减少你在这条路的摸索时间</summary><published>2010-12-31T01:04:00Z</published><updated>2010-12-31T01:04:00Z</updated><author><name>HAL9000</name><uri>http://www.cnblogs.com/haoxiaobo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/haoxiaobo/archive/2010/12/31/1922661.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/haoxiaobo/archive/2010/12/31/1922661.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;strong&gt;0 概述&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Tuxedo是类似于Message query server的一种东西，它以消息服务器的方式提供一个服务器框架，客户端向服务器发送请求报文，服务器处理之后返回应答报文。当然，服务器有对消息队列的各种管理能力。&lt;/p&gt;&lt;p&gt;我猜这个东西最初提供给客户的动机是为了保留客户用C开发的业务逻辑，又能方便地把自己的系统改造为面向服务的交易系统, 毕竟客户们的系统已经正常运行多年，该卖给他们一些新东西了。&lt;/p&gt;&lt;p&gt;&lt;span  style="font-size: 12.5px; "&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;因为要与C兼容，还有客户们现存应用的多样性问题，Tuxedo决定在设计上不提供消息语法与语义的支持，只是透明地转发数据块&amp;#8212;&amp;#8212;也就是说，C语言里的char*，struct*, 甚至是void*.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;于是，很多公司当时都上了当，把自己的系统改为了Tuxedo的架构，但是几乎马上的，更好的东西就出来了：jri, web service...新的服务协议都不仅提供通信层的支持，还有语法支持，有些甚至还有语义支持。杯具呀！&lt;/p&gt;&lt;p&gt;现在，用新技术开发的应用程序很可能会遇上需要与旧的tuxedo服务交互的要求，幸运的是，BEA提供了几种主流语言调用Tuxedo服务的技术，不幸的是，有一些很讨厌的问题存在，主要是C语言的ANSI字符集与现代语言的unicode内码的兼容问题，更别提还有utf-8这种东西&amp;#8230;&amp;#8230;你分得清UTF8和Unicode吗？&lt;/p&gt;&lt;p&gt;本文说明了以C#调用Tuxedo服务的基本过程，会帮助你完成第一次Tuxedo调用。在后记中，又讨论了字符集可能会引起的问题, 希望能减少你在这条路的摸索时间。 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size: 24pt; "&gt;1&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 24pt; "&gt;安装&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;1.1&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;安装版本的选择&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;从&lt;/span&gt;BEA&lt;span style="font-family:宋体;"&gt;网站可以下载到所有版本的&lt;/span&gt;tuxedo&lt;span style="font-family:宋体;"&gt;服务器与客户端的安装包。我下载了&lt;/span&gt;V10.0 &lt;span style="font-family:宋体;"&gt;专&lt;/span&gt;for xp&lt;span style="font-family:宋体;"&gt;版，装在&lt;/span&gt;Windows Vista Professional&lt;span style="font-family:宋体;"&gt;上。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;从&lt;/span&gt;9.1&lt;span style="font-family:宋体;"&gt;以后的客户端版本，就开始支持&lt;/span&gt;.net&lt;span style="font-family:宋体;"&gt;的托管代码的访问。在安装完了&lt;/span&gt;v10.0&lt;span style="font-family:宋体;"&gt;之后，察看了一下&lt;/span&gt;%TUXDIR\%bin\libscdnet.dll&lt;span style="font-family:宋体;"&gt;文件，他的版本其实还是&lt;/span&gt;9.1&lt;span style="font-family:宋体;"&gt;，可能在&lt;/span&gt;V10.0&lt;span style="font-family:宋体;"&gt;上这个托管库并没有升级。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;在&lt;/span&gt;BEA&lt;span style="font-family:宋体;"&gt;的网站上下载完安装包之后，别忘记了在下载页面里下载许可证文件。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;1.2&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;安装后的一些调整&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;1.2.1&amp;nbsp;&lt;/span&gt;TUXDIR&lt;span style="font-family:宋体;"&gt;环境变量的修改&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;我安装完成之后，客户端程序被安装在了&lt;/span&gt;C:\Program Files\BEA Systems\TUXEDO\tuxedo10.0_VS2005&lt;span style="font-family:宋体;"&gt;路径下，但是&lt;/span&gt;TUXDIR&lt;span style="font-family:宋体;"&gt;变量的设置值不知道什么原因没有指到正确的路径&lt;/span&gt;,&lt;span style="font-family:宋体;"&gt;而是指到了&lt;/span&gt;C:\Program Files\BEA Systems\TUXEDO&lt;span style="font-family: 宋体;"&gt;，导致运行程序时出错，经检查&lt;/span&gt;&lt;span&gt;C:\Program Files\BEA Systems\TUXEDO&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;下的&lt;/span&gt;ULOG&lt;span style="font-family:宋体;"&gt;日志文件，报告找不到&lt;/span&gt;locale&lt;span style="font-family:宋体;"&gt;文件夹。我试着修改了一下&lt;/span&gt;TUXDIR&lt;span style="font-family:宋体;"&gt;环境变量，但没有作用。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;于是把&lt;/span&gt;&lt;span&gt;C:\Program Files\BEA Systems\TUXEDO\tuxedo10.0_VS2005\&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;下的所有文件复制了一份到上一层的&lt;/span&gt;&lt;span&gt;C:\Program Files\BEA Systems\TUXEDO&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;，这个问题就解决了。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;1.2.2&amp;nbsp;&lt;/span&gt;PATH&lt;span style="font-family:宋体;"&gt;环境变量的修改&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;在&lt;/span&gt;PATH&lt;span style="font-family:宋体;"&gt;里增加对&lt;/span&gt;&lt;span&gt;C:\Program Files\BEA Systems\TUXEDO\tuxedo10.0_VS2005\bin&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;目录的指向。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;1.2.3&amp;nbsp;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;许可证文件&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;把下载到的许可证文件改名为&lt;/span&gt;lic.txt&lt;span style="font-family:宋体;"&gt;，复制到&lt;/span&gt;udataobj&lt;span style="font-family:宋体;"&gt;目录下。由于我们复制了安装目录，就造成了有两个这个文件夹的情况。都复制进去好了。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;2&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;用&lt;/span&gt;C#&lt;span style="font-family:宋体;"&gt;写&lt;/span&gt;tuxedo&lt;span style="font-family:宋体;"&gt;客户端程序的基础知识&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;2.1&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;托管类的引用&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;%TUXDIR%/bin/libwscdnet.dll&lt;span style="font-family:宋体;"&gt;是&lt;/span&gt;.net2.0&lt;span style="font-family:宋体;"&gt;的托管代码类库，可以通过对这个库的引用来对&lt;/span&gt;tuxedo&lt;span style="font-family:宋体;"&gt;函数进行调用。当建立了一个&lt;/span&gt;C#&lt;span style="font-family:宋体;"&gt;客户端项目后，必须新建一个引用，选择&lt;/span&gt;%TUXDIR%/bin/libwscdnet.dll&lt;span style="font-family:宋体;"&gt;。其命名空间是&lt;/span&gt;Bea.Tuxedo;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;2.2&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;服务器地址等环境变量的设置&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;根据网上的说法，有三种方法设置服务器地址：&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt;text-indent:-21.0pt;"&gt;&lt;span&gt;一．&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;用环境变量来设置：&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt;text-indent:0cm;"&gt;&lt;span style="font-family:宋体;"&gt;在系统的环境变量中设置&lt;/span&gt;WSNADDR=//&amp;lt;ip address&amp;gt;:&amp;lt;port&amp;gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt;text-indent:0cm;"&gt;&lt;span style="font-family:宋体;"&gt;这样做的好处是不必在程序里配置。坏处是只支持一个服务器的连接。&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt;text-indent:0cm;"&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt;text-indent:-21.0pt;"&gt;&lt;span&gt;二．&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;用&lt;/span&gt;tuxreadenv&lt;span style="font-family:宋体;"&gt;函数&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt;text-indent:0cm;"&gt;&lt;span style="font-family:宋体;"&gt;用&lt;/span&gt;tuxreadenv&lt;span style="font-family:宋体;"&gt;函数来从一个配置文件中读取指定的节，作为当前环境变量的设置。&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt;text-indent:0cm;"&gt;&lt;span style="font-family:宋体;"&gt;如：&lt;/span&gt;tuxenv.ini.&lt;span style="font-family:宋体;"&gt;内容格式如下：&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt;text-indent:0cm;"&gt;[TUXCOMM]&lt;/p&gt;  &lt;p style="margin-left:21.0pt;text-indent:0cm;"&gt;TUXDIR=c:\tuxedo&lt;/p&gt;  &lt;p style="margin-left:21.0pt;text-indent:0cm;"&gt;PATH=%PATH%;c:\tuxedo\bin&lt;/p&gt;  &lt;p style="margin-left:21.0pt;text-indent:0cm;"&gt;WSADDR=//192.168.0.1:6000&lt;/p&gt;  &lt;p style="margin-left:21.0pt;text-indent:0cm;"&gt;&lt;span style="font-family:宋体;"&gt;在程序中使用&lt;/span&gt;: tuxreadenv("tuxenv.ini","TUXCOMM");&lt;span style="font-family:宋体;"&gt;语句来调用。&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt;text-indent:0cm;"&gt;&lt;span style="font-family:宋体;"&gt;在&lt;/span&gt;C#&lt;span style="font-family:宋体;"&gt;中，&lt;/span&gt;tuxreadenv&lt;span style="font-family:宋体;"&gt;函数被&lt;/span&gt;warp&lt;span style="font-family:宋体;"&gt;到&lt;/span&gt;Utils.tuxreadenv()&lt;span style="font-family:宋体;"&gt;了。&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt;text-indent:0cm;"&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt;text-indent:-21.0pt;"&gt;&lt;span&gt;三．&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;用&lt;/span&gt;tuxputenv&lt;span style="font-family:宋体;"&gt;函数&lt;/span&gt;inline&lt;span style="font-family:宋体;"&gt;地指定环境变量&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt;text-indent:0cm;"&gt;tuxputenv&lt;span style="font-family:宋体;"&gt;函数可以在程序中直接指定环境变量。如：&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt;text-indent:0cm;"&gt;tuxputenv("WSNADDR=//10.1.128.227:9401");&lt;/p&gt;  &lt;p style="margin-left:21.0pt;text-indent:0cm;"&gt;&lt;span style="font-family:宋体;"&gt;如果有多个环境变量要设置，可以多次调用这个函数来分别执行设置。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;在&lt;/span&gt;C#&lt;span style="font-family:宋体;"&gt;中，&lt;/span&gt;tuxputenv&lt;span style="font-family:宋体;"&gt;函数被&lt;/span&gt;warp&lt;span style="font-family:宋体;"&gt;到&lt;/span&gt;Utils. tuxputenv ()&lt;span style="font-family:宋体;"&gt;了。&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt;text-indent:0cm;"&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;2.3&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;高版本客户端调用低于&lt;/span&gt;7.1&lt;span style="font-family:宋体;"&gt;版的服务器的问题&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-family:宋体;"&gt;由于服务器是&lt;/span&gt;V6.5&lt;span style="font-family:宋体;"&gt;，而我装的客户端是&lt;/span&gt;10.0&lt;span style="font-family:宋体;"&gt;，因此存在一个协议兼容性的问题，在运行时报错：&lt;/span&gt;protocol error. &lt;span style="font-family:宋体;"&gt;经查看&lt;/span&gt;ULOG&lt;span style="font-family:宋体;"&gt;文件，发现在调用&lt;/span&gt;7.1&lt;span style="font-family:宋体;"&gt;以下的服务器时，要设置一个环境变量&lt;/span&gt;WSINTOPPRE71&lt;span style="font-family:宋体;"&gt;的值为&amp;#8220;&lt;/span&gt;yes&lt;span style="font-family:宋体;"&gt;&amp;#8221;。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-family:宋体;"&gt;增加对这个环境变量设置的方法，见上节三种方法中的任何一种。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;2.4&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;调用的一般形式&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;客户端调用服务的一般过程为&lt;/span&gt;:&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;设定环境变量&lt;/span&gt;&lt;span style="font-family:Wingdings;"&gt;&amp;#224;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;初始化应用上下文&lt;/span&gt;&lt;span style="font-family:Wingdings;"&gt;&amp;#224;&lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;调用服务&lt;/span&gt;&lt;span style="font-family: Wingdings;"&gt;&amp;#224;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;得到结果&lt;/span&gt;&lt;span style="font-family: Wingdings;"&gt;&amp;#224;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;关闭应用上下文&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;下面是一个最简单的&lt;/span&gt;C#&lt;span style="font-family:宋体;"&gt;客户端：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;//&lt;span style="font-family:宋体;"&gt;设定环境变量&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Utils.tuxputenv("WSNADDR=//10.1.128.227:9401");&lt;/p&gt;  &lt;p&gt;Utils.tuxputenv("WSINTOPPRE71=yes");&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;//&lt;span style="font-family:宋体;"&gt;初始化应用上下文&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;AppContext ac = AppContext.tpinit(null);&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;//&lt;span style="font-family:宋体;"&gt;同步调用服务。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;// &lt;span style="font-family:宋体;"&gt;同步调用时，服务器不返回结果或是出错之前，&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;// tpcall&lt;span style="font-family: 宋体;"&gt;方法不会返回，程序将等在这里。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;TypedString sndstr = new TypedString(1000);&lt;/p&gt;  &lt;p&gt;sndstr.PutString(0, &amp;#8220;hello world!&amp;#8221;);&lt;/p&gt;  &lt;p&gt;TypedString rcvstr = new TypedString(1000);&lt;/p&gt;  &lt;p&gt;&lt;span&gt;ac.tpcall("TOUPPER", sndstr, ref rcvstr, 0);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;// &lt;span style="font-family:宋体;"&gt;得到结果&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;string rcvstr_str = rcvstr.GetString(0, 1000);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;//&lt;span style="font-family:宋体;"&gt;关闭应用上下文&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;ac.tpterm();&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;2.5&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;异步调用服务&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;TUXEDO&lt;span style="font-family:宋体;"&gt;支持异步调用模式。在异步调用方式下，用&lt;/span&gt; tpacall&lt;span style="font-family:宋体;"&gt;方式调用服务。当异步调用一个服务后，客户端程序不等服务器完成工作就立即继续执行其他工作，只保留一个句柄。等到客户端程序有空的时，再回来用&lt;/span&gt;tpgetrply&lt;span style="font-family:宋体;"&gt;方汉等待已经调过的服务。如下面的程序&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;//&lt;span style="font-family:宋体;"&gt;异步调用服务。得到异步调用描述符&lt;/span&gt; acd.&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span&gt;AsyncCallDescriptor acd = ac.tpacall("TOUPPER", sndstr, 0);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;// &amp;#8230;. &lt;span style="font-family:宋体;"&gt;做些其他的事情。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;// &lt;span style="font-family:宋体;"&gt;继续刚刚的服务调用，等待结果。这个方法是一个同步函数。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;ac.tpgetrply(ref acd, ref rcvstr, 0);&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;string rcvstr_str = rcvstr.GetString();&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;2.6&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;多线程调用&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;多线程调用时，需要在应用程序上下文初始化时，加入多线程标志。如下：&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;Times New Roman&amp;quot;;color:#2B91AF;"&gt;TypedTPINIT&lt;/span&gt;&lt;span style="font-size:9.0pt; font-family:Consolas;Times New Roman&amp;quot;;"&gt; tpinfo = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;TypedTPINIT&lt;/span&gt;();&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;Times New Roman&amp;quot;;"&gt;tpinfo.flags = &lt;span style="color:#2B91AF"&gt;TypedTPINIT&lt;/span&gt;.TPMULTICONTEXTS;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;Times New Roman&amp;quot;;color:#2B91AF;"&gt;AppContext&lt;/span&gt;&lt;span style="font-size:9.0pt; font-family:Consolas;Times New Roman&amp;quot;;"&gt; ac = &lt;span style="color:#2B91AF"&gt;AppContext&lt;/span&gt;.tpinit(tpinfo);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;2.7&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;结构数据传递问题&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;Tuxedo windows&lt;span style="font-family:宋体;"&gt;客户端的原始&lt;/span&gt;API&lt;span style="font-family:宋体;"&gt;是面向&lt;/span&gt;C&lt;span style="font-family:宋体;"&gt;语言的，因此在很多的服务器程序的编写时，会采用&lt;/span&gt;struct&lt;span style="font-family:宋体;"&gt;结构来会传递数据的方案。对于&lt;/span&gt;C&lt;span style="font-family:宋体;"&gt;结构体数据，在&lt;/span&gt;tuxedo&lt;span style="font-family:宋体;"&gt;中对应的消息类型应该是&lt;/span&gt;CArray, &lt;span style="font-family:宋体;"&gt;在用&lt;/span&gt;C#&lt;span style="font-family:宋体;"&gt;制作客户端时，可以采用&lt;/span&gt;TypedCArray&lt;span style="font-family:宋体;"&gt;这个类型来传递数据，其中，需要特别注意的问题是&lt;/span&gt;.net&lt;span style="font-family:宋体;"&gt;中&lt;/span&gt;interop&lt;span style="font-family:宋体;"&gt;操作时的一些技术细节。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:20.25pt"&gt;&lt;span style="font-family:宋体;"&gt;下面是一个具体的例子：&lt;/span&gt;&lt;/p&gt;  &lt;div style="border:solid windowtext 1.0pt;padding:1.0pt 4.0pt 1.0pt 4.0pt; background:#FDE9D9;"&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[StructLayout(LayoutKind.Sequential, Pack = 4&lt;/span&gt;&lt;span&gt;, CharSet = CharSet.Ansi&lt;/span&gt;)]&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public struct MYMSGBODY&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public string usrname;&lt;/span&gt; // char usrname[20]&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[MarshalAs(UnmanagedType.U4, SizeConst=4)]&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public uint lLogNo; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;// unsigned long int lLogNo;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;[MarshalAs(UnmanagedType.I4)]&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public int iRecNum; // &amp;nbsp;int iRecNum;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;p style="text-indent:20.25pt"&gt;&lt;span style="font-family:宋体;"&gt;在&lt;/span&gt;MSDN&lt;span style="font-family:宋体;"&gt;上有详细的结构体&lt;/span&gt;interop&lt;span style="font-family:宋体;"&gt;类型对应表可以查阅。这里要解释其中几个重要的地方：&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:41.25pt;text-indent:-21.0pt;"&gt;&lt;span style="font-family:Wingdings;"&gt;l&amp;nbsp;&lt;/span&gt;StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi)&lt;/p&gt;  &lt;p style="margin-left:62.25pt;text-indent:-21.0pt;"&gt;&lt;span style="font-family:Wingdings;"&gt;n&amp;nbsp;&lt;/span&gt;Pack=4&lt;span style="font-family:宋体;"&gt;表示以最大&lt;/span&gt;4&lt;span style="font-family:宋体;"&gt;字节边界对齐成员。&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:62.25pt;text-indent:-21.0pt;"&gt;&lt;span style="font-family:Wingdings;"&gt;n&amp;nbsp;&lt;/span&gt;CharSet = CharSet.Ansi&lt;span style="font-family:宋体;"&gt;表示字串是&lt;/span&gt;ansi&lt;span style="font-family:宋体;"&gt;字串。之后再详述。&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:41.25pt;text-indent:-21.0pt;"&gt;&lt;span style="font-family:Wingdings;"&gt;l&amp;nbsp;&lt;/span&gt;&lt;span&gt;MarshalAs(UnmanagedType.U4, SizeConst=4)&lt;br /&gt; &lt;/span&gt;&lt;span style="font-family:宋体;"&gt;此属性标记为此&lt;/span&gt;string&lt;span style="font-family:宋体;"&gt;成员是以值传递的，也就是是一个数组，而不是指针。并指定了长度。这个长度是指&lt;/span&gt;C&lt;span style="font-family:宋体;"&gt;串里包括了结尾&lt;/span&gt;0&lt;span style="font-family:宋体;"&gt;的总长度。&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:41.25pt;text-indent:-21.0pt;"&gt;&lt;span style="font-family:Wingdings;"&gt;l&amp;nbsp;&lt;/span&gt;Long&lt;span style="font-family:宋体;"&gt;类型：这个类型在&lt;/span&gt;C&lt;span style="font-family:宋体;"&gt;与&lt;/span&gt;.net&lt;span style="font-family:宋体;"&gt;里的有重要不同，在&lt;/span&gt;C&lt;span style="font-family:宋体;"&gt;中，&lt;/span&gt; int&lt;span style="font-family:宋体;"&gt;的大小根据平台不同有&lt;/span&gt;16&lt;span style="font-family:宋体;"&gt;位长，&lt;/span&gt;32&lt;span style="font-family:宋体;"&gt;位长，（在&lt;/span&gt;windows&lt;span style="font-family:宋体;"&gt;和现代的&lt;/span&gt;unix&lt;span style="font-family:宋体;"&gt;中，一般都是&lt;/span&gt;32&lt;span style="font-family:宋体;"&gt;位）&lt;/span&gt;, long&lt;span style="font-family:宋体;"&gt;的长度在&lt;/span&gt;windows&lt;span style="font-family:宋体;"&gt;和&lt;/span&gt;unix&lt;span style="font-family:宋体;"&gt;中一般是&lt;/span&gt;32&lt;span style="font-family:宋体;"&gt;位的，而在&lt;/span&gt;.net&lt;span style="font-family:宋体;"&gt;中，&lt;/span&gt;long&lt;span style="font-family:宋体;"&gt;类型的长度是&lt;/span&gt;64&lt;span style="font-family:宋体;"&gt;位，并且&lt;/span&gt;interop&lt;span style="font-family:宋体;"&gt;很多操作不支持对&lt;/span&gt;long&lt;span style="font-family:宋体;"&gt;型数据的转换，如对结构体取&lt;/span&gt;size&lt;span style="font-family:宋体;"&gt;时，如果有&lt;/span&gt;long&lt;span style="font-family:宋体;"&gt;型字段，就会出现异常，这里要注意。&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:41.25pt;text-indent:-21.0pt;"&gt;&lt;span style="font-family:Wingdings;"&gt;l&amp;nbsp;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;内存分配的对齐问题&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:41.25pt;text-indent:0cm;"&gt;&lt;span style="font-family:宋体;"&gt;这个问题是最难以讲清楚的问题。在&lt;/span&gt;C&lt;span style="font-family:宋体;"&gt;语句的编译器中，都会有一些关于结构体成员如何对齐地址的编译指令或是伪指令，如&lt;/span&gt;VC&lt;span style="font-family:宋体;"&gt;的&lt;/span&gt;#pragma pack, __declspec( align() )&lt;span style="font-family: 宋体;"&gt;指令等。这些指令指示编译器如何在内存中排布结构体的成员。&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:41.25pt;text-indent:0cm;"&gt;&lt;span style="font-family:宋体;"&gt;其中，&lt;/span&gt;pack=n&lt;span style="font-family:宋体;"&gt;的意思是：结构体中下一个成员的起始地址，要用&lt;/span&gt; &lt;span style="font-family:宋体;"&gt;&amp;#8220;成员类型的长度和&lt;/span&gt;n&lt;span style="font-family:宋体;"&gt;之中的比较小的那个&amp;#8221;来对齐。比如说下面的结构体成员：&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:41.25pt;text-indent:0cm;"&gt;#program pack(8)&lt;/p&gt;  &lt;p style="margin-left:41.25pt;text-indent:0cm;"&gt;Struct ST_E1{&lt;/p&gt;  &lt;p style="margin-left:41.25pt;text-indent:0cm;"&gt;char s1[2];&lt;span&gt;&amp;nbsp;&amp;nbsp; // &lt;/span&gt;&lt;span style="font-family:宋体;"&gt;从&lt;/span&gt;0&lt;span style="font-family:宋体;"&gt;偏移开始&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;占到&lt;/span&gt;1&lt;span style="font-family:宋体;"&gt;位置，共&lt;/span&gt;2&lt;span style="font-family:宋体;"&gt;字节&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:41.25pt;text-indent:0cm;"&gt;int i;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // min(sizeof int= 4&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;，&lt;/span&gt;pack=8)=4, &lt;span style="font-family:宋体;"&gt;因此，&lt;/span&gt;i&lt;span style="font-family:宋体;"&gt;的起始地址应该按&lt;/span&gt;4&lt;span style="font-family:宋体;"&gt;对齐&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:41.25pt;text-indent:0cm;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;也就是空两个字节，到偏移&lt;/span&gt;4&lt;span style="font-family:宋体;"&gt;处开始，到偏移&lt;/span&gt;7&lt;span style="font-family:宋体;"&gt;，共&lt;/span&gt;4&lt;span style="font-family:宋体;"&gt;字节&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:41.25pt;text-indent:0cm;"&gt;char s2[3];&amp;nbsp;// min(sizeof char=1, pack=8) = 1, &lt;span style="font-family:宋体;"&gt;因此&lt;/span&gt;s2&lt;span style="font-family:宋体;"&gt;的起始地址按&lt;/span&gt;1&lt;span style="font-family:宋体;"&gt;对齐，&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:41.25pt;text-indent:0cm;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;也就是从偏移&lt;/span&gt;8&lt;span style="font-family:宋体;"&gt;开始，到&lt;/span&gt;10&lt;span style="font-family:宋体;"&gt;，共&lt;/span&gt;3&lt;span style="font-family:宋体;"&gt;字节。&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:41.25pt;text-indent:0cm;"&gt;Char s3&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &lt;/span&gt;&lt;span style="font-family:宋体;"&gt;同理，&lt;/span&gt;s3&lt;span style="font-family:宋体;"&gt;占偏移量&lt;/span&gt;11&lt;span style="font-family:宋体;"&gt;，一个字节&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:41.25pt;text-indent:0cm;"&gt;}&lt;/p&gt;  &lt;p style="margin-left:41.25pt;text-indent:0cm;"&gt;&lt;span style="font-family:宋体;"&gt;结构体总长度为&lt;/span&gt;12&lt;span style="font-family:宋体;"&gt;个字节长。&lt;/span&gt;&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;"&gt;  &lt;tbody&gt;&lt;tr&gt;   &lt;td width="38" valign="top" style="width:28.55pt;border:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;Off&lt;/p&gt;   &lt;/td&gt;   &lt;td width="41" valign="top" style="width:30.45pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;0&lt;/p&gt;   &lt;/td&gt;   &lt;td width="41" valign="top" style="width:30.4pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;1&lt;/p&gt;   &lt;/td&gt;   &lt;td width="41" valign="top" style="width:30.6pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;2&lt;/p&gt;   &lt;/td&gt;   &lt;td width="41" valign="top" style="width:30.6pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;3&lt;/p&gt;   &lt;/td&gt;   &lt;td width="37" valign="top" style="width:27.7pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;4&lt;/p&gt;   &lt;/td&gt;   &lt;td width="37" valign="top" style="width:27.7pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;5&lt;/p&gt;   &lt;/td&gt;   &lt;td width="37" valign="top" style="width:27.7pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;6&lt;/p&gt;   &lt;/td&gt;   &lt;td width="37" valign="top" style="width:27.7pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;7&lt;/p&gt;   &lt;/td&gt;   &lt;td width="38" valign="top" style="width:28.65pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;8&lt;/p&gt;   &lt;/td&gt;   &lt;td width="38" valign="top" style="width:28.65pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;9&lt;/p&gt;   &lt;/td&gt;   &lt;td width="36" valign="top" style="width:26.85pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;10&lt;/p&gt;   &lt;/td&gt;   &lt;td width="36" valign="top" style="width:26.85pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;11&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td width="38" valign="top" style="width:28.55pt;border:solid black 1.0pt;border-top:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;V&lt;/p&gt;   &lt;/td&gt;   &lt;td width="41" valign="top" style="width:30.45pt;border-top:none;border-left:   none;border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;S1&lt;/p&gt;   &lt;/td&gt;   &lt;td width="41" valign="top" style="width:30.4pt;border-top:none;border-left:none;   border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;S1&lt;/p&gt;   &lt;/td&gt;   &lt;td width="41" valign="top" style="width:30.6pt;border-top:none;border-left:none;   border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;&lt;span style="font-family:宋体;"&gt;空&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="41" valign="top" style="width:30.6pt;border-top:none;border-left:none;   border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;&lt;span style="font-family:宋体;"&gt;空&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="37" valign="top" style="width:27.7pt;border-top:none;border-left:none;   border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;i&lt;/p&gt;   &lt;/td&gt;   &lt;td width="37" valign="top" style="width:27.7pt;border-top:none;border-left:none;   border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;i&lt;/p&gt;   &lt;/td&gt;   &lt;td width="37" valign="top" style="width:27.7pt;border-top:none;border-left:none;   border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;i&lt;/p&gt;   &lt;/td&gt;   &lt;td width="37" valign="top" style="width:27.7pt;border-top:none;border-left:none;   border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;i&lt;/p&gt;   &lt;/td&gt;   &lt;td width="38" valign="top" style="width:28.65pt;border-top:none;border-left:   none;border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;S2&lt;/p&gt;   &lt;/td&gt;   &lt;td width="38" valign="top" style="width:28.65pt;border-top:none;border-left:   none;border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;S2&lt;/p&gt;   &lt;/td&gt;   &lt;td width="36" valign="top" style="width:26.85pt;border-top:none;border-left:   none;border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;S2&lt;/p&gt;   &lt;/td&gt;   &lt;td width="36" valign="top" style="width:26.85pt;border-top:none;border-left:   none;border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;S3&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;如果&lt;/span&gt;pack&lt;span style="font-family:宋体;"&gt;指为&lt;/span&gt;1&lt;span style="font-family:宋体;"&gt;呢？那么分配的方式如下：&lt;/span&gt;&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;"&gt;  &lt;tbody&gt;&lt;tr&gt;   &lt;td width="38" valign="top" style="width:28.55pt;border:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;Off&lt;/p&gt;   &lt;/td&gt;   &lt;td width="41" valign="top" style="width:30.45pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;0&lt;/p&gt;   &lt;/td&gt;   &lt;td width="41" valign="top" style="width:30.4pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;1&lt;/p&gt;   &lt;/td&gt;   &lt;td width="41" valign="top" style="width:30.6pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;2&lt;/p&gt;   &lt;/td&gt;   &lt;td width="41" valign="top" style="width:30.6pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;3&lt;/p&gt;   &lt;/td&gt;   &lt;td width="37" valign="top" style="width:27.7pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;4&lt;/p&gt;   &lt;/td&gt;   &lt;td width="37" valign="top" style="width:27.7pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;5&lt;/p&gt;   &lt;/td&gt;   &lt;td width="37" valign="top" style="width:27.7pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;6&lt;/p&gt;   &lt;/td&gt;   &lt;td width="37" valign="top" style="width:27.7pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;7&lt;/p&gt;   &lt;/td&gt;   &lt;td width="38" valign="top" style="width:28.65pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;8&lt;/p&gt;   &lt;/td&gt;   &lt;td width="38" valign="top" style="width:28.65pt;border:solid black 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;9&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td width="38" valign="top" style="width:28.55pt;border:solid black 1.0pt;border-top:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;V&lt;/p&gt;   &lt;/td&gt;   &lt;td width="41" valign="top" style="width:30.45pt;border-top:none;border-left:   none;border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;S1&lt;/p&gt;   &lt;/td&gt;   &lt;td width="41" valign="top" style="width:30.4pt;border-top:none;border-left:none;   border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;S1&lt;/p&gt;   &lt;/td&gt;   &lt;td width="41" valign="top" style="width:30.6pt;border-top:none;border-left:none;   border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;i&lt;/p&gt;   &lt;/td&gt;   &lt;td width="41" valign="top" style="width:30.6pt;border-top:none;border-left:none;   border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;i&lt;/p&gt;   &lt;/td&gt;   &lt;td width="37" valign="top" style="width:27.7pt;border-top:none;border-left:none;   border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;i&lt;/p&gt;   &lt;/td&gt;   &lt;td width="37" valign="top" style="width:27.7pt;border-top:none;border-left:none;   border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;i&lt;/p&gt;   &lt;/td&gt;   &lt;td width="37" valign="top" style="width:27.7pt;border-top:none;border-left:none;   border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;S2&lt;/p&gt;   &lt;/td&gt;   &lt;td width="37" valign="top" style="width:27.7pt;border-top:none;border-left:none;   border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;S2&lt;/p&gt;   &lt;/td&gt;   &lt;td width="38" valign="top" style="width:28.65pt;border-top:none;border-left:   none;border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;S2&lt;/p&gt;   &lt;/td&gt;   &lt;td width="38" valign="top" style="width:28.65pt;border-top:none;border-left:   none;border-bottom:solid black 1.0pt;   border-right:solid black 1.0pt;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p&gt;S3&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;共&lt;/span&gt;10&lt;span style="font-family:宋体;"&gt;个字节长。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-family:宋体;"&gt;可以看出，如果两边的&lt;/span&gt;pack&lt;span style="font-family:宋体;"&gt;值不一样，那么这个结构体在送到目的地之后就会出现成员偏移乱掉的问题（开始想念&lt;/span&gt;web services&lt;span style="font-family:宋体;"&gt;了吧？但是我们不总是能选择所处的条件的）。因此，一定要检查服务器与客户端的这个编译选项是不是一样的。一般情况下，&lt;/span&gt;pack=4&lt;span style="font-family:宋体;"&gt;是比较常见的情况。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-family:宋体;"&gt;有关更多的内存对齐方式的讨论，可以参见本人另一博客文章及其评论内容。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span&gt;&lt;a href="http://www.cnblogs.com/haoxiaobo/archive/2005/09/05/230204.html"&gt;&lt;strong&gt;http://www.cnblogs.com/haoxiaobo/archive/2005/09/05/230204.html&lt;/strong&gt;&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;/p&gt;  &lt;p style="margin-left:41.25pt;text-indent:-21.0pt;"&gt;&lt;span style="font-family:Wingdings;"&gt;l&amp;nbsp;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;字符集问题&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:20.25pt"&gt;&lt;span style="font-family:宋体;"&gt;字符集是另一个需要注意的兼容性问题。例如上面的成员定义：&lt;/span&gt;&lt;/p&gt;  &lt;div style="border:solid windowtext 1.0pt;padding:1.0pt 4.0pt 1.0pt 4.0pt; background:#FDE9D9;"&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;public string usrname; // char usrname[20]&lt;/p&gt;  &lt;/div&gt;  &lt;p style="margin-left:20.25pt"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;在大多数面向&lt;/span&gt;C&lt;span style="font-family:宋体;"&gt;语言的&lt;/span&gt;API&lt;span style="font-family:宋体;"&gt;中，基本上是没有&lt;/span&gt;char&lt;span style="font-family:宋体;"&gt;与&lt;/span&gt;byte&lt;span style="font-family:宋体;"&gt;的区别的，但是&lt;/span&gt;.net&lt;span style="font-family:宋体;"&gt;中对于&lt;/span&gt;char&lt;span style="font-family:宋体;"&gt;与&lt;/span&gt;byte&lt;span style="font-family:宋体;"&gt;则有本质的不同，&lt;/span&gt;char&lt;span style="font-family:宋体;"&gt;是指一个与文化相关的符号，而&lt;/span&gt;byte&lt;span style="font-family:宋体;"&gt;指一个&lt;/span&gt;8&lt;span style="font-family:宋体;"&gt;位二进制数的物理存储单位。&lt;/span&gt; &lt;span style="font-family:宋体;"&gt;一个&lt;/span&gt;char&lt;span style="font-family:宋体;"&gt;需要几个&lt;/span&gt;byte&lt;span style="font-family:宋体;"&gt;来保存，要视字符集编码方式而定，在&lt;/span&gt;.net&lt;span style="font-family:宋体;"&gt;和&lt;/span&gt;java&lt;span style="font-family:宋体;"&gt;里，内部的&lt;/span&gt;char&lt;span style="font-family:宋体;"&gt;都是&lt;/span&gt;unicode&lt;span style="font-family:宋体;"&gt;，一个字符两个字节，而在&lt;/span&gt;C&lt;span style="font-family:宋体;"&gt;中，基本上都是&lt;/span&gt;ansi&lt;span style="font-family:宋体;"&gt;（除了&lt;/span&gt;windows nt&lt;span style="font-family:宋体;"&gt;之后新增的那些&lt;/span&gt; _T&lt;span style="font-family:宋体;"&gt;类型）。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;由于这个原因，一定要认真考虑服务器系统的字符集编码，否则会导致字符串在&lt;/span&gt;interop&lt;span style="font-family:宋体;"&gt;转换时，产生非常令人生气的结果。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt;"&gt;&lt;span style="font-family:宋体;"&gt;在结构体的定义时，&lt;/span&gt;&lt;span&gt;charset = charset.ansi&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;即通知了&lt;/span&gt;interop&lt;span style="font-family:宋体;"&gt;程序，字符串在向结构体转换时，要用&lt;/span&gt;ansi&lt;span style="font-family:宋体;"&gt;方式进行转换。&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:20.25pt"&gt;&lt;/p&gt;  &lt;p style="margin-left:20.25pt"&gt;&lt;span style="font-family:宋体;"&gt;更多有关字符集的讨论，请参见本人另一篇博客文章：&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:20.25pt"&gt;&lt;a href="http://xiaobohao.spaces.live.com/blog/cns!D1C72860197EBF38!1250.entry"&gt;&lt;strong&gt;http://xiaobohao.spaces.live.com/blog/cns!D1C72860197EBF38!1250.entry&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p style="margin-left:21.6pt"&gt;&lt;/p&gt;  &lt;p style="margin-left:21.6pt"&gt;&lt;span style="font-family:宋体;"&gt;完整的用结构体内存块数据做消息体，调用&lt;/span&gt;tuxedo&lt;span style="font-family:宋体;"&gt;服务的代码如下：&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:21.6pt"&gt;&lt;/p&gt;  &lt;div style="border:solid windowtext 1.0pt;padding:1.0pt 4.0pt 1.0pt 4.0pt; background:#FDE9D9;"&gt;  &lt;p&gt;Bea.Tuxedo.ATMI.&lt;span style="color:#2B91AF"&gt;Utils.tuxputenv(&lt;span style="color:purple"&gt;"WSNADDR=//10.1.128.227:9401"&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Bea.Tuxedo.ATMI.&lt;span style="color:#2B91AF"&gt;Utils.tuxputenv(&lt;span style="color:purple"&gt;"WSINTOPPRE71=yes"&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color:#2B91AF;"&gt;AppContext&lt;/span&gt; ac = &lt;span style="color:#2B91AF"&gt;AppContext.tpinit(&lt;span style="color:blue"&gt;null&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;RecivedStruct rec;&amp;nbsp;// &lt;/span&gt;这个&lt;span&gt;RecivedSTRUCT即是tuxedo服务所规定的返回消息结构体在C#里的对应定义，请参阅本节之前的说明，对C风格的结构进行C#定义。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color:#2B91AF;"&gt;SendStruct&lt;/span&gt; app = &lt;span style="color:blue"&gt;new &lt;span style="color:#2B91AF"&gt;SendStruct &lt;/span&gt;();&lt;/span&gt;&amp;nbsp;&lt;span style="color:#00B050"&gt;// &lt;/span&gt;&lt;span style="font-family:宋体; color:#00B050;"&gt;这个&lt;/span&gt;&lt;span style=" color:#00B050;"&gt;SENDSTRUCT&lt;/span&gt;&lt;span style="font-family:宋体;color:#00B050;"&gt;即是&lt;/span&gt;&lt;span style="color:#00B050;"&gt;tuxedo&lt;/span&gt;&lt;span style="font-family:宋体; color:#00B050;"&gt;服务所规定的调用消息结构体在&lt;/span&gt;&lt;span style=" color:#00B050;"&gt;C#&lt;/span&gt;&lt;span style="font-family:宋体;color:#00B050;"&gt;里的对应定义，请参阅本节之前的说明，对&lt;/span&gt;&lt;span style=" color:#00B050;"&gt;C&lt;/span&gt;&lt;span style="font-family:宋体;color:#00B050;"&gt;风格的结构进行&lt;/span&gt;&lt;span style="color:#00B050;"&gt;C#&lt;/span&gt;&lt;span style="font-family:宋体; color:#00B050;"&gt;定义。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;app.sOperCode = &amp;#8220;&amp;#8230;&amp;#8221;;&amp;nbsp;&lt;span style="color:#00B050"&gt;// &lt;/span&gt;&lt;span style="font-family:宋体; color:#00B050;"&gt;几个示意成员&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;app.sDeptCode = &amp;#8220;&amp;#8230;&amp;#8221;;&lt;/p&gt;  &lt;p&gt;//&amp;#8230;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;// &lt;span style="font-family:宋体;"&gt;开始把&lt;/span&gt;C#&lt;span style="font-family:宋体;"&gt;结构体的内容复制为&lt;/span&gt;byte[]&lt;span style="font-family:宋体;"&gt;。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;// &lt;span style="font-family:宋体;"&gt;取得长度&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;AppLen = &lt;span style="color:#2B91AF"&gt;Marshal.SizeOf(&lt;/span&gt;app);&amp;nbsp;&lt;/p&gt;  &lt;p&gt;int iRecLen = Marshal.SizeOf(typeof(RecivedStruct));&lt;/p&gt;  &lt;p&gt;&lt;span style="color:#2B91AF;"&gt;TypedCArray&lt;/span&gt; tbSend = &lt;span style="color:blue"&gt;new &lt;span style="color:#2B91AF"&gt;TypedCArray&lt;/span&gt;(iAppLen);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color:#2B91AF;"&gt;TypedBuffer&lt;/span&gt; tbRecive = &lt;span style="color:blue"&gt;new &lt;span style="color:#2B91AF"&gt;TypedCArray&lt;/span&gt;(iRecLen);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color:blue;"&gt;byte&lt;/span&gt;&lt;span&gt;[] ar&lt;/span&gt;AppData = &lt;span style="color:blue"&gt;new &lt;span style="color:blue"&gt;byte&lt;/span&gt;[iAppLen];&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;// &lt;span style="font-family:宋体;"&gt;分配一个系统堆内存&lt;/span&gt;, &lt;span style="font-family:宋体;"&gt;并用于一个指针来指向之&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color:#2B91AF;"&gt;IntPtr&lt;/span&gt; pApp = &lt;span style="color:#2B91AF"&gt;Marshal.AllocHGlobal(iAppLen);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color:#2B91AF;"&gt;IntPtr&lt;/span&gt; pRec&lt;span&gt; = Marshal.AllocHGlobal(iRecLen);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;// &lt;span style="font-family:宋体;"&gt;将托管结构复制到此地址指向的内存块中。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color:#2B91AF;"&gt;Marshal&lt;/span&gt;.StructureToPtr(app, pApp, &lt;span style="color:blue"&gt;false);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;// &lt;span style="font-family:宋体;"&gt;再将此地址块复制到字节数组中。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color:#2B91AF;"&gt;Marshal&lt;/span&gt;.Copy(pApp, arAppData, 0, iLen);&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;//&lt;span style="font-family:宋体;"&gt;把此字节数组绑定到要发送数据中。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;tbSend.PutBytes(arAppData);&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="color:blue;"&gt;try&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &lt;/span&gt;&lt;span style="font-family:宋体;"&gt;调用服务，返回一个&lt;/span&gt;typedbuffer.&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ac.tpcall(sServiceName, tbSend, &lt;span style="color:blue"&gt;ref&lt;/span&gt; tbRecive, 0);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &lt;/span&gt;&lt;span style="font-family:宋体;"&gt;开始从这个返回的内容里取出数据。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &lt;/span&gt;&lt;span style="font-family:宋体;"&gt;初始化一个与返回值相同大小的数组。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;byte&lt;/span&gt;[] arRecived = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:blue"&gt;byte&lt;/span&gt;[tbRecive.Size];&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &lt;/span&gt;&lt;span style="font-family:宋体;"&gt;从返回值对象中取出字节数组。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((&lt;span style="color:#2B91AF"&gt;TypedCArray&lt;/span&gt;)tbRecive).GetBytes(arRecived, arRecived.Length);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // &lt;/span&gt;&lt;span style="font-family:宋体;"&gt;用相反的步子把数据从字节流中复制到&lt;/span&gt;C#&lt;span style="font-family:宋体;"&gt;结构中。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Marsal.Copy(arRecived, 0, pRec, iRecLen);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Rec = Marsal.PtrToStructure(pRec, typeof(RecivedStruct));&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;&lt;span style="color:blue;"&gt;catch&lt;/span&gt; (&lt;span style="color:#2B91AF"&gt;TPException tpex)&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:#2B91AF;"&gt;Trace.&lt;/span&gt;TraceError(tpex.ToString());&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;&lt;span style="color:blue;"&gt;finally&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ac.tpterm();&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2B91AF"&gt;Marshal&lt;/span&gt;.FreeHGlobal(pAp&lt;/span&gt;p);&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2B91AF"&gt;Marshal&lt;/span&gt;.FreeHGlobal(&lt;/span&gt;pRec);&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;3&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;常用&lt;/span&gt;Tuxedo&lt;span style="font-family:宋体;"&gt;类与方法：&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;3.1&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;tpchkauth&lt;span style="font-family:宋体;"&gt;检查是否需要认证和认证的级别&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;int tpchkauth();&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;在调用tpinit()之前检查是否需要认证和认证的级别。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;返回值：&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;TPNOAUTH&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：不需要认证； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;TPSYSAUTH&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：系统认证，需要密码； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;TPAPPAUTH&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：应用认证，需要密码和特殊应用数据； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;当返回值为TPSYSAUTH和TPAPPAUTH时，我们必须使用tpalloc()分配一个TPINIT结构，在该结构中填入认证数据，然后用该结构作为参数调用tpinit()。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;失败原因主要有：&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;协议错； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;操作系统错； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;tuxedo&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;底层错。 &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;3.2&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;tpinit&lt;span style="font-family:宋体;"&gt;初始化&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;在使用tuxedo其他服务之前，必须调用tpinit加入到应用中。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;int tpinit(TPINIT *tpinfo);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;参数说明：&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;tpinfo&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：指向TPINIT类型的指针。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;TPINIT&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;类型在atmi.h中有定义，如以下几个域：&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;char usrname [32]; (32 characters significant)&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;char cltname [32]; (32 characters significant)&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;char passwd [32]; (8 characters significant)&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;char grpname [32]; (32 characters significant)&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;long flags;&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;long datalen;&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;long data;&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;usrname&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：用户名或login名；&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;cltname&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：应用定义；&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;passwd&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：应用密码；&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;grpname&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：在事务中使用，必须在配置文件定义的组列表中；&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;flags&lt;/span&gt;&lt;span style="font-size: 9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：定义请求/通知类型和系统存取方法，其中TPU_SIG、TPU_DIP和TPU_IGN不能同时指定；TPSA_FASTPATH和TPSA_PROTECTED不能同时指定。有如下的值：&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;TPU_SIG&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：选择信号通知； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;TPU_DIP&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：选择dip-in通知； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;TPU_IGN&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：忽略通知； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;TPSA_FASTPATH&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：选择fastpath方式系统存取； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;TPSA_PROTECTED&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：选择protected方式系统存取； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;datalen&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：应用特殊数据的长度；&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;data&lt;/span&gt;&lt;span style="font-size: 9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：应用特殊数据；&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;域flags的值覆盖系统的缺省定义，前提是在配置文件中没有指定NO_OVERRIDE。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;如果参数使用(TPINIT*)NULL，则client使用系统缺省的通知设置和系统存取设置，若需要认证，则出错返回TPEPERM。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;tpinit()&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;调用失败返回-1，失败原因有：&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;参数错； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;没有空间在BB； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;没有权限； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;协议错； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;操作系统错； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;tuxedo&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;底层错。 &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;示例：&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;TPINIT *tpinfo;&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;char password[9];&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;/* prompt user for password */&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;if ((tpinfo = (TPINIT *)tpalloc(&amp;#8220;TPINIT&amp;#8221;, NULL,&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TPINITNEED(0))) == NULL) {&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;(void)userlog(&amp;#8220;unable to allocate TPINIT buffer&amp;#8221;);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;exit(1);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;(void)strcpy(tpinfo-&amp;gt;passwd, password);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;(void)strcpy(tpinfo-&amp;gt;usrname, &amp;#8220;Smith&amp;#8221;);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;(void)strcpy(tpinfo-&amp;gt;cltname, &amp;#8220;Teller&amp;#8221;);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;tpinfo-&amp;gt;flags = (TPU_DIP|TPSA_PROTECTED);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;if (tpinit(tpinfo) == -1) {&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;(void)userlog(&amp;#8220;failed to join application&amp;#8221;);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;tpfree((char*)tpinfo);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;exit(1);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;3.3&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;tperm&lt;span style="font-family:宋体;"&gt;离开应用&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;使用tuxedo服务完毕，调用tpterm()离开应用。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;int tpterm();&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;函数出错返回-1。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;错误原因有：&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;协议错； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;操作系统错； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;tuxedo&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;底层错。 &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;3.4&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;tpacall&lt;span style="font-family:宋体;"&gt;发送异步请求&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;发送异步请求。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;int tpacall(char *service, char *bufptr, long length,&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;long flags);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;参数说明：&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;service&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：请求的service名(最大15个字符，以null结尾)；&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;bufptr&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：请求发送的数据；&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;length&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：发送数据长度(只有CARRAY类型用，其他设为0)；&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;flags&lt;/span&gt;&lt;span style="font-size: 9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：发送模式，有如下的值：&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:10.5pt; text-indent:21.25pt;layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;TPNOTRAN&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：该次调用不能在一个事务里； &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:10.5pt; text-indent:21.25pt;layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;TPNOREPLY&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：不需要回应(reply)； &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:10.5pt; text-indent:21.25pt;layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;TPNOBLOCK&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：非阻塞； &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:10.5pt; text-indent:21.25pt;layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;TPNOTIME&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：不超时，一直等待； &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:10.5pt; text-indent:21.25pt;layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;TPSIGRSTRT&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：被信号中断的系统调用重启。 &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;成功返回一个非负的描述符，该描述符可用于后续的tpgetrply调用，出错返回-1。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;错误原因有：&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt; text-indent:21.25pt;layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;参数错； &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt; text-indent:21.25pt;layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;当前太多的tpacall处理存在，上限是50； &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt; text-indent:21.25pt;layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;事务错； &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt; text-indent:21.25pt;layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;超时(time-out)； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;3.5&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;tpgetrply&lt;span style="font-family:宋体;"&gt;接收异步回应数据&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;接收异步回应数据。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;int tpgetrply(int *handle, char **bufpp, long *length,&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;long flags)&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;；&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;参数说明：&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;handle&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：tpacall返回的描述符；&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;bufpp&lt;/span&gt;&lt;span style="font-size: 9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：接收buffer的地址的地址，原buffer会自动调整；&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;length&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：接收的buffer的长度的地址；&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;flags&lt;/span&gt;&lt;span style="font-size: 9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：接收选项。有如下值：&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:10.5pt; text-indent:21.25pt;layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;TPNOBLOCK&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：非阻塞； &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:10.5pt; text-indent:21.25pt;layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;TPNOTIME&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：不超时，一直等待； &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:10.5pt; text-indent:21.25pt;layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;TPSIGRSTRT&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：被信号中断的系统调用重启； &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:10.5pt; text-indent:21.25pt;layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;TPGETANY&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：接收任何回应； &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:10.5pt; text-indent:21.25pt;layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;TPNOCHANGE&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：要求接收的回应与发送数据相同。 &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;成功返回0，失败返回-1。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;出错原因：&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;参数错； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;错误的接收buffer类型； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;超时； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;其他错误； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;3.6&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;tpcancel&lt;span style="font-family:宋体;"&gt;取消由&lt;/span&gt;tpacall&lt;span style="font-family:宋体;"&gt;发送的请求的响应&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;取消由tpacall发送的请求的响应，在没有事务未完时。不能取消一个已经处理的请求。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;int tpcancel(int handle);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;参数说明：&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;handle&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：tpacall返回的描述符；&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;出错返回-1。错误原因有：&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;错误的描述符； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;当前在事务模式； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;其他错误； &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;3.7&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;tpcall&lt;span style="font-family:宋体;"&gt;同步发送请求并接收回应数据&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;同步发送请求并接收回应数据。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;int tpcall(char *service, char *sbufp, long slength, \&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; char **rbufpp, long *rlength, long flags);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;参数说明：&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;service&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：请求的service名；&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;bufp&lt;/span&gt;&lt;span style="font-size: 9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：发送buffer的地址；&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;slength&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：发送数据长度(只CARRAY使用，其他为0)；&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;rbufpp&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：响应buffer的地址的地址，可以与发送buffer为同一块区域；&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;rlength&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：响应buffer的长度的地址(不能为NULL)；&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;flags&lt;/span&gt;&lt;span style="font-size: 9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：标志。有如下值(含义见tpacall和tpgetrply)：&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:10.5pt; text-indent:21.25pt;layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;TPNOTRAN&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：该次调用不能在一个事务里； &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:10.5pt; text-indent:21.25pt;layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;TPNOREPLY&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：不需要回应(reply)； &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:10.5pt; text-indent:21.25pt;layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;TPNOBLOCK&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：非阻塞； &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:10.5pt; text-indent:21.25pt;layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;TPNOTIME&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：不超时，一直等待； &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:10.5pt; text-indent:21.25pt;layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;TPSIGRSTRT&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：被信号中断的系统调用重启。 &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;返回-1表示出错，其他返回值都表示成功。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;错误原因与tpacall和tpgetrply相同，除了描述符错。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;3.8&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;tpgprio&lt;span style="font-family:宋体;"&gt;获得上一次请求或接收的消息的优先级&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;获得上一次请求或接收的消息的优先级。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;int tpgprio();&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;成功返回的范围是1-100，值越大优先级越高。失败返回-1。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;使用举例：&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;struct {&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;int hdl; /* handle*/&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;int pr; /* priority*/&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;} pa[SIZE];&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;for (i=0; i &amp;lt; requests; i++) {&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;/* Determine service and data for request */&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;pa [i].hdl = tpacall(Svc, buf, len, flags);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;/* Save priority used to send request */&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;pa[i].pr = tpgprio();&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;/* Use qsort(3) routine to sort handles in priority order */&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;qsort((char*) pa, requests, sizeof(pa[0]), cmpfcn);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;for (i=0; i&amp;lt; requests; i++) {&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;tpgetrply(&amp;amp;pa[i].hdl, &amp;amp;rbufp, &amp;amp;rlen, rflags);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;3.9&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;tpsprio&lt;span style="font-family:宋体;"&gt;设置下一个要发送的消息的优先级&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;设置下一个要发送的消息的优先级。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;int tpsprio (int prio, long flags);&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;参数说明：&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;prio&lt;/span&gt;&lt;span style="font-size: 9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：要设置的优先级；&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family: 新宋体;Times New Roman&amp;quot;"&gt;flags&lt;/span&gt;&lt;span style="font-size: 9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：标志。有如下值：&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:10.5pt; text-indent:21.25pt;layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;0&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：使用相对优先级，值改为(default+prio)； &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:10.5pt; text-indent:21.25pt;layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;TPABSOLUTE&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;：绝对优先级，值改为prio； &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:10.5pt; text-indent:21.25pt;layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;优先级的范围是1-100，超过次限制的值被改为相应的最大(小)值。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;/p&gt;  &lt;p style="text-indent:21.25pt; layout-grid-mode:char"&gt;&lt;span style="font-size:9.0pt;font-family:新宋体;Times New Roman&amp;quot;"&gt;失败返回-1。错误原因有TPEINVAL、TPEPROTO、TPESYSTEM、和TPEOS。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;-------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;&lt;font  face="verdana, 'courier new'"&gt;&lt;span  style="font-size: 21px; line-height: 21px;"&gt;&lt;strong&gt;后记：&lt;/strong&gt;&lt;/span&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;再谈字符集问题&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p style="text-indent:20.25pt"&gt;&lt;span style="font-family:宋体;"&gt;在tuxedo返回消息的格式定义中，如果采用定长字串组合的方式（表笑，我们的业务系统就是这么干的），会造成一些意外的困难。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:20.25pt"&gt;&lt;span style="font-family:宋体;"&gt;如下：如果返回值格式的定义是：&lt;/span&gt;&lt;/p&gt;  &lt;div style="border:solid windowtext 1.0pt;padding:1.0pt 4.0pt 1.0pt 4.0pt; background:#FDE9D9;"&gt;  &lt;p&gt;%4s%2s&amp;nbsp;// &lt;span style="font-family:宋体;"&gt;一个&lt;/span&gt;4&lt;span style="font-family:宋体;"&gt;字节的串，一个&lt;/span&gt;2&lt;span style="font-family:宋体;"&gt;字节的串&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;  &lt;p style="text-indent:20.25pt"&gt;&lt;span style="font-family:宋体;"&gt;有一个返回值是：&lt;/span&gt;&lt;/p&gt;  &lt;div style="border:solid windowtext 1.0pt;padding:1.0pt 4.0pt 1.0pt 4.0pt; background:#FDE9D9;"&gt;  &lt;p&gt;Aaaabb&lt;/p&gt;  &lt;/div&gt;  &lt;p style="text-indent:20.25pt"&gt;&lt;span style="font-family:宋体;"&gt;在&lt;/span&gt;C&lt;span style="font-family:宋体;"&gt;语言中以&lt;/span&gt;sscanf()&lt;span style="font-family:宋体;"&gt;来结析这个串很容易：&lt;/span&gt;&lt;/p&gt;  &lt;div style="border:solid windowtext 1.0pt;padding:1.0pt 4.0pt 1.0pt 4.0pt; background:#FDE9D9;"&gt;  &lt;p&gt;char s1[5],s2[3];&lt;/p&gt;  &lt;p&gt;Sscanf(&amp;#8220;AAAABB&amp;#8221;, &amp;#8220;%4s%2s&amp;#8221;,&amp;nbsp;s1,s2)&lt;/p&gt;  &lt;/div&gt;  &lt;p style="text-indent:20.25pt"&gt;&lt;span style="font-family:宋体;"&gt;但是在&lt;/span&gt;C#, java&lt;span style="font-family:宋体;"&gt;中，由于没有&lt;/span&gt;sscanf&lt;span style="font-family:宋体;"&gt;这个函数，就不得不手工写截字串的函数，这样的数据还可以应付。但继续考虑以下的情况：&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:20.25pt"&gt;&lt;/p&gt;  &lt;div style="border:solid windowtext 1.0pt;padding:1.0pt 4.0pt 1.0pt 4.0pt; background:#FDE9D9;"&gt;  &lt;p&gt;char s1[5],s2[3];&lt;/p&gt;  &lt;p&gt;Sscanf(&amp;#8220;&lt;span style="font-family:宋体;"&gt;中国红&lt;/span&gt;&amp;#8221;, &amp;#8220;%4s%2s&amp;#8221;,&amp;nbsp;s1,s2)&lt;/p&gt;  &lt;/div&gt;  &lt;p style="text-indent:20.25pt"&gt;&lt;/p&gt;  &lt;p style="text-indent:20.25pt"&gt;&lt;span style="font-family:宋体;"&gt;在有汉字的情况下，使用&lt;/span&gt;ANSI&lt;span style="font-family:宋体;"&gt;字符集的程序在&lt;/span&gt;sscanf&lt;span style="font-family:宋体;"&gt;之后，结果是&lt;/span&gt;s1=&amp;#8221;&lt;span style="font-family:宋体;"&gt;中国&lt;/span&gt;&amp;#8221;, s2=&amp;#8221;&lt;span style="font-family:宋体;"&gt;红&lt;/span&gt;&amp;#8221;.&lt;/p&gt;  &lt;p style="text-indent:20.25pt"&gt;&lt;span style="font-family:宋体;"&gt;而在&lt;/span&gt;C#&lt;span style="font-family:宋体;"&gt;等用&lt;/span&gt;unicode&lt;span style="font-family:宋体;"&gt;字符集的程序中，截取&lt;/span&gt;4&lt;span style="font-family:宋体;"&gt;个字符的结果将会出错，因为整个字串才只有&lt;/span&gt;3&lt;span style="font-family:宋体;"&gt;个字符。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:20.25pt"&gt;&lt;span style="font-family:宋体;"&gt;因此，在&lt;/span&gt;unicode&lt;span style="font-family:宋体;"&gt;程序中对这个字串解析，就必须先把字串从&lt;/span&gt;unicode&lt;span style="font-family:宋体;"&gt;串以&lt;/span&gt;GB18030&lt;span style="font-family:宋体;"&gt;编码转换为字节组，然后再对字节流进行截取，截取的结果，又必须转换为&lt;/span&gt;unicode&lt;span style="font-family:宋体;"&gt;以在程序中处理。&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;&lt;span  style="font-size: 12.5px; "&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;---------------------------------------------&lt;/p&gt;&lt;p&gt;再后记：这篇文章是从前的文章，原来在xiaobohao.live.spaces.com中，后来微软放弃了live spaces, 只好用MS提供的迁移功能迁到了wordpress, 然后，悲杯了，你懂的。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;好不容易从墙外找回了这篇文章，加了一点点修改，放到博客园里来。&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/haoxiaobo/aggbug/1922661.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/haoxiaobo/archive/2010/12/31/1922661.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
