﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-阿π-随笔分类-其它</title><link>http://www.cppblog.com/lapcca/category/13742.html</link><description>专注于网络协议,系统底层,服务器软件</description><language>zh-cn</language><lastBuildDate>Tue, 06 Nov 2012 19:11:00 GMT</lastBuildDate><pubDate>Tue, 06 Nov 2012 19:11:00 GMT</pubDate><ttl>60</ttl><item><title>Linux下makefile教程</title><link>http://www.cppblog.com/lapcca/archive/2012/06/06/177838.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Wed, 06 Jun 2012 14:57:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2012/06/06/177838.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/177838.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2012/06/06/177838.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/177838.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/177838.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转自陈皓 (CSDN)概述&#8212;&#8212;什么是makefile？或许很多Winodws的程序员都不知道这个东西，因为那些Windows的IDE都为你做了这个工作，但我觉得要作一个好的和 professional的程序员，makefile还是要懂。这就好像现在有这么多的HTML的编辑器，但如果你想成为一个专业人士，你还是要了解HTML的标识的含义。特别在Unix下的软件编译，你就不能不...&nbsp;&nbsp;<a href='http://www.cppblog.com/lapcca/archive/2012/06/06/177838.html'>阅读全文</a><img src ="http://www.cppblog.com/lapcca/aggbug/177838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2012-06-06 22:57 <a href="http://www.cppblog.com/lapcca/archive/2012/06/06/177838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++ 中关于int，unsigned int , short的跨平台移植</title><link>http://www.cppblog.com/lapcca/archive/2011/04/15/144302.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Fri, 15 Apr 2011 06:02:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2011/04/15/144302.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/144302.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2011/04/15/144302.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/144302.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/144302.html</trackback:ping><description><![CDATA[int类型比较特殊，具体的字节数同机器字长和编译器有关。如果要保证移植性，尽量用__int16 __int32 __int64吧<br />__int16、__int32这种数据类型在所有平台下都分配相同的字节。所以在移植上不存在问题。<br /><span style="COLOR: red">所谓的不可移植是指：在一个平台上编写的代码无法拿到另一个平台上运行时，不能达到期望的运行结果</span>。<br />例如：在32为平台上（所谓32位平台是指通用寄存器的数据宽度是32）编写代码，int 类型分配4个字节，而在16位平台是则分配2个字节，那么在16位上编译出来的exe，<br />其中是为int分配2字节，而在32位平台上运行时，会按照4个字节来解析，显然会出错误的！！<br /><br />而对于非int行，目前为止，所有的类型分配的字节数都是兼容的，即不同平台对于同一个类型分配相同的字节数！！<br /><br /><span style="COLOR: red">建议：在代码中尽量避免使用int类型，根据不同的需要可以用short,long,unsigned int 等代替。<br /></span><br />下面是各个类型一览表【转】<br /><p>64位指的是cpu通用寄存器的数据宽度是64位的。</p><p></p><table class="FCK__ShowTableBorders" style="WIDTH: 578px; BORDER-COLLAPSE: collapse; HEIGHT: 550px" cellspacing="0" cellpadding="0" border="0"><tbody><tr style="HEIGHT: 12.75pt" height="17"><td class="xl30" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext 2pt double; BORDER-LEFT: windowtext 2pt double; WIDTH: 85pt; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12.75pt; BACKGROUND-COLOR: silver" width="113" height="17"><font size="2"><strong>数据类型名称</strong></font></td><td class="xl32" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext 2pt double; BORDER-LEFT: windowtext; WIDTH: 41pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver" width="54"><font size="2"><strong>字节数</strong></font></td><td class="xl31" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext 2pt double; BORDER-LEFT: windowtext; WIDTH: 190pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver" width="253"><font size="2"><strong>别名</strong></font></td><td class="xl33" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext 2pt double; BORDER-LEFT: windowtext; WIDTH: 328pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: silver" width="437"><strong><font size="2">取值范围</font></strong></td></tr><tr style="HEIGHT: 12pt" height="16"><td class="xl34" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 2pt double; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12pt; BACKGROUND-COLOR: rgb(153,204,255)" height="16"><font size="2"><strong>int</strong></font></td><td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">*</font></td><td class="xl24" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">signed,signed int</font></td><td class="xl26" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">由<a href="http://dev.21tx.com/os/" target="_blank"><font color="#3366cc"><u>操作系统</u></font></a>决定，即与操作系统的＂字长＂有关</font></td></tr><tr style="HEIGHT: 12pt" height="16"><td class="xl34" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 2pt double; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12pt; BACKGROUND-COLOR: rgb(153,204,255)" height="16"><font size="2"><strong>unsigned int</strong></font></td><td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">*</font></td><td class="xl24" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">unsigned</font></td><td class="xl26" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">由操作系统决定，即与操作系统的＂字长＂有关</font></td></tr><tr style="HEIGHT: 12pt" height="16"><td class="xl34" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 2pt double; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12pt; BACKGROUND-COLOR: rgb(153,204,255)" height="16"><font size="2"><strong>__int8</strong></font></td><td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">1</font></td><td class="xl24" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">char,signed char</font></td><td class="xl26" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">–128 到 127</font></td></tr><tr style="HEIGHT: 12.75pt" height="17"><td class="xl34" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 2pt double; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12.75pt; BACKGROUND-COLOR: rgb(153,204,255)" height="17"><font size="2"><strong>__int16</strong></font></td><td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">2</font></td><td class="xl24" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">short,short int,signed short int</font></td><td class="xl26" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">–32,768 到 32,767</font></td></tr><tr style="HEIGHT: 12pt" height="16"><td class="xl34" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 2pt double; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12pt; BACKGROUND-COLOR: rgb(153,204,255)" height="16"><font size="2"><strong>__int32</strong></font></td><td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">4</font></td><td class="xl24" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">signed,signed int</font></td><td class="xl26" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">–2,147,483,648 到 2,147,483,647</font></td></tr><tr style="HEIGHT: 12pt" height="16"><td class="xl34" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 2pt double; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12pt; BACKGROUND-COLOR: rgb(153,204,255)" height="16"><font size="2"><strong>__int64</strong></font></td><td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">8</font></td><td class="xl24" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">无</font></td><td class="xl26" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">–9,223,372,036,854,775,808 到 9,223,372,036,854,775,807</font></td></tr><tr style="HEIGHT: 12pt" height="16"><td class="xl34" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 2pt double; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12pt; BACKGROUND-COLOR: rgb(153,204,255)" height="16"><font size="2"><strong>bool</strong></font></td><td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">1</font></td><td class="xl24" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">无</font></td><td class="xl26" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">false 或 true</font></td></tr><tr style="HEIGHT: 12pt" height="16"><td class="xl34" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 2pt double; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12pt; BACKGROUND-COLOR: rgb(153,204,255)" height="16"><font size="2"><strong>char</strong></font></td><td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">1</font></td><td class="xl24" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">signed char</font></td><td class="xl26" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">–128 到 127</font></td></tr><tr style="HEIGHT: 12pt" height="16"><td class="xl34" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 2pt double; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12pt; BACKGROUND-COLOR: rgb(153,204,255)" height="16"><font size="2"><strong>unsigned char</strong></font></td><td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">1</font></td><td class="xl24" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">无</font></td><td class="xl26" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">0 到 255</font></td></tr><tr style="HEIGHT: 12pt" height="16"><td class="xl34" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 2pt double; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12pt; BACKGROUND-COLOR: rgb(153,204,255)" height="16"><font size="2"><strong>short</strong></font></td><td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">2</font></td><td class="xl24" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">short int,signed short int</font></td><td class="xl26" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">–32,768 到 32,767</font></td></tr><tr style="HEIGHT: 12pt" height="16"><td class="xl34" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 2pt double; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12pt; BACKGROUND-COLOR: rgb(153,204,255)" height="16"><font size="2"><strong>unsigned short</strong></font></td><td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">2</font></td><td class="xl24" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">unsigned short int</font></td><td class="xl26" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">0 到 65,535</font></td></tr><tr style="HEIGHT: 12pt" height="16"><td class="xl34" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 2pt double; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12pt; BACKGROUND-COLOR: rgb(153,204,255)" height="16"><font size="2"><strong>long</strong></font></td><td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">4</font></td><td class="xl24" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">long int,signed long int</font></td><td class="xl26" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">–2,147,483,648 到 2,147,483,647</font></td></tr><tr style="HEIGHT: 12pt" height="16"><td class="xl34" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 2pt double; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12pt; BACKGROUND-COLOR: rgb(153,204,255)" height="16"><font size="2"><strong>long long</strong></font></td><td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">8</font></td><td class="xl24" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">none (but equivalent to __int64)</font></td><td class="xl26" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">–9,223,372,036,854,775,808 到 9,223,372,036,854,775,807</font></td></tr><tr style="HEIGHT: 12pt" height="16"><td class="xl34" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 2pt double; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12pt; BACKGROUND-COLOR: rgb(153,204,255)" height="16"><font size="2"><strong>unsigned long</strong></font></td><td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">4</font></td><td class="xl24" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">unsigned long int</font></td><td class="xl26" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">0 到 4,294,967,295</font></td></tr><tr style="HEIGHT: 12pt" height="16"><td class="xl34" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 2pt double; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12pt; BACKGROUND-COLOR: rgb(153,204,255)" height="16"><font size="2"><strong>enum</strong></font></td><td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">*</font></td><td class="xl24" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">无</font></td><td class="xl26" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">由操作系统决定，即与操作系统的＂字长＂有关</font></td></tr><tr style="HEIGHT: 12pt" height="16"><td class="xl34" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 2pt double; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12pt; BACKGROUND-COLOR: rgb(153,204,255)" height="16"><font size="2"><strong>float</strong></font></td><td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">4</font></td><td class="xl24" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">无</font></td><td class="xl26" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">3.4E +/- 38 (7 digits)</font></td></tr><tr style="HEIGHT: 12pt" height="16"><td class="xl34" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 2pt double; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12pt; BACKGROUND-COLOR: rgb(153,204,255)" height="16"><font size="2"><strong>double</strong></font></td><td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">8</font></td><td class="xl24" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">无</font></td><td class="xl26" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">1.7E +/- 308 (15 digits)</font></td></tr><tr style="HEIGHT: 12pt" height="16"><td class="xl34" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 2pt double; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 12pt; BACKGROUND-COLOR: rgb(153,204,255)" height="16"><font size="2"><strong>long double</strong></font></td><td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">8</font></td><td class="xl24" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">无</font></td><td class="xl26" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent"><font size="2">1.7E +/- 308 (15 digits)</font></td></tr><tr style="HEIGHT: 12.75pt" height="17"><td class="xl35" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 2pt double; BORDER-BOTTOM: windowtext 2pt double; HEIGHT: 12.75pt; BACKGROUND-COLOR: rgb(153,204,255)" height="17"><font size="2"><strong>wchar_t</strong></font></td><td class="xl28" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 2pt double; BACKGROUND-COLOR: transparent"><font size="2">2</font></td><td class="xl27" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 2pt double; BACKGROUND-COLOR: transparent"><font size="2">__wchar_t</font></td><td class="xl29" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext; BORDER-LEFT: windowtext; BORDER-BOTTOM: windowtext 2pt double; BACKGROUND-COLOR: transparent"><font size="2">0 到 65,535</font></td></tr></tbody></table><table height="273" width="100%" border="1"><tbody><tr><td width="22%" height="19">类型标识符</td><td width="19%" height="19">类型说明</td><td width="10%" height="19">长度<br />（字节）</td><td width="29%" height="19">范围</td><td width="20%" height="19">备注</td></tr><tr><td width="22%" height="18"><strong>char</strong></td><td width="19%" height="18">字符型</td><td width="10%" height="18">1</td><td width="29%" height="18">-128 ~ 127</td><td width="20%" height="18">-2<sup>7</sup> ~ (2<sup>7</sup> -1)</td></tr><tr><td width="22%" height="19"><strong>unsigned char</strong></td><td width="19%" height="19">无符字符型</td><td width="10%" height="19">1</td><td width="29%" height="19">0 ~ 255</td><td width="20%" height="19">0 ~ (2<sup>8</sup> -1)</td></tr><tr><td width="22%" height="18"><strong>short int</strong></td><td width="19%" height="18">短整型</td><td width="10%" height="18">2</td><td width="29%" height="18">-32768 ~ 32767</td><td width="20%" height="18">2<sup>-15</sup> ~ (2<sup>15</sup> - 1)</td></tr><tr><td width="22%" height="19"><strong>unsigned short int</strong></td><td width="19%" height="19">无符短整型</td><td width="10%" height="19">2</td><td width="29%" height="19">0 ~ 65535</td><td width="20%" height="19">0 ~ (2<sup>16</sup> - 1)</td></tr><tr><td width="22%" height="19"><strong>int</strong></td><td width="19%" height="19">整型</td><td width="10%" height="19">4</td><td width="29%" height="19">-2147483648 ~ 2147483647</td><td width="20%" height="19">-2<sup>31</sup> ~ (2<sup>31</sup> - 1)</td></tr><tr><td width="22%" height="19"><strong>unsigned int</strong></td><td width="19%" height="19">无符整型</td><td width="10%" height="19">4</td><td width="29%" height="19">0 ~ 4294967295</td><td width="20%" height="19">0 ~ (2<sup>32</sup>-1)</td></tr><tr><td width="22%" height="19"><strong>float</strong></td><td width="19%" height="19">实型（单精度）</td><td width="10%" height="19">4</td><td width="29%" height="19">1.18*10<sup>-38</sup> ~ 3.40*10<sup>38</sup></td><td width="20%" height="19">7位有效位</td></tr><tr><td width="22%" height="19"><strong>double</strong></td><td width="19%" height="19">实型（双精度）</td><td width="10%" height="19">8</td><td width="29%" height="19">2.23*10<sup>-308 </sup>~ 1.79*10<sup>308</sup></td><td width="20%" height="19">15位有效位</td></tr><tr><td width="22%" height="19"><strong>long double</strong></td><td width="19%" height="19">实型（长双精度）</td><td width="10%" height="19">10</td><td width="29%" height="19">3.37*10<sup>-4932</sup> ~ 1.18*10<sup>4932</sup></td><td width="20%" height="19">19位有效位<br /></td></tr></tbody></table><br /><br /><img src ="http://www.cppblog.com/lapcca/aggbug/144302.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2011-04-15 14:02 <a href="http://www.cppblog.com/lapcca/archive/2011/04/15/144302.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中的四种强制类型转换的区别 [转]</title><link>http://www.cppblog.com/lapcca/archive/2010/11/30/135081.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Tue, 30 Nov 2010 07:37:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/11/30/135081.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/135081.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/11/30/135081.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/135081.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/135081.html</trackback:ping><description><![CDATA[<p>使用标准C++的类型转换符：static_cast、dynamic_cast、reinterpret_cast、和const_cast。</p>
		<p> </p>
		<p>1 static_cast</p>
		<p>用法：static_cast &lt; type-id &gt; ( expression )     </p>
		<p>该运算符把expression转换为type-id类型，但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法：</p>
		<p>①用于类层次结构中基类和子类之间指针或引用的转换。</p>
		<p>  进行上行转换（把子类的指针或引用转换成基类表示）是安全的；</p>
		<p>  进行下行转换（把基类指针或引用转换成子类表示）时，由于没有动态类型检查，所以是不安全的。</p>
		<p>②用于基本数据类型之间的转换，如把int转换成char，把int转换成enum。这种转换的安全性也要开发人员来保证。</p>
		<p>③把空指针转换成目标类型的空指针。</p>
		<p>④把任何类型的表达式转换成void类型。</p>
		<p> </p>
		<p>注意：static_cast不能转换掉expression的const、volitale、或者__unaligned属性。</p>
		<p> </p>
		<p>2 dynamic_cast</p>
		<p>用法：dynamic_cast &lt; type-id &gt; ( expression )</p>
		<p>该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void *；</p>
		<p>如果type-id是类指针类型，那么expression也必须是一个指针，如果type-id是一个引用，那么expression也必须是一个引用。</p>
		<p> </p>
		<p>dynamic_cast主要用于类层次间的上行转换和下行转换，还可以用于类之间的交叉转换。</p>
		<p>在类层次间进行上行转换时，dynamic_cast和static_cast的效果是一样的；</p>
		<p>在进行下行转换时，dynamic_cast具有类型检查的功能，比static_cast更安全。</p>
		<p>class B{</p>
		<p>public:</p>
		<p>       int m_iNum;</p>
		<p>       virtual void foo();</p>
		<p>};</p>
		<p> </p>
		<p>class D:public B{</p>
		<p>    public:</p>
		<p>       char *m_szName[100];</p>
		<p>};</p>
		<p> </p>
		<p>void func(B *pb){</p>
		<p>    D *pd1 = static_cast&lt;D *&gt;(pb);</p>
		<p>    D *pd2 = dynamic_cast&lt;D *&gt;(pb);</p>
		<p>}</p>
		<p> </p>
		<p>在上面的代码段中，如果pb指向一个D类型的对象，pd1和pd2是一样的，并且对这两个指针执行D类型的任何操作都是安全的；</p>
		<p>但是，如果pb指向的是一个B类型的对象，那么pd1将是一个指向该对象的指针，对它进行D类型的操作将是不安全的（如访问m_szName），</p>
		<p>而pd2将是一个空指针。</p>
		<p> </p>
		<p>另外要注意：B要有虚函数，否则会编译出错；static_cast则没有这个限制。</p>
		<p>这是由于运行时类型检查需要运行时类型信息，而这个信息存储在类的虚函数表（</p>
		<p>关于虚函数表的概念，详细可见&lt;Inside c++ object model&gt;）中，只有定义了虚函数的类才有虚函数表，</p>
		<p>没有定义虚函数的类是没有虚函数表的。</p>
		<p> </p>
		<p>另外，dynamic_cast还支持交叉转换（cross cast）。如下代码所示。</p>
		<p>class A{</p>
		<p>public:</p>
		<p>        int m_iNum;</p>
		<p>        virtual void f(){}</p>
		<p>};</p>
		<p> </p>
		<p>class B:public A{</p>
		<p>};</p>
		<p> </p>
		<p>class D:public A{</p>
		<p>};</p>
		<p> </p>
		<p>void foo(){</p>
		<p>    B *pb = new B;</p>
		<p>    pb-&gt;m_iNum = 100;</p>
		<p> </p>
		<p>    D *pd1 = static_cast&lt;D *&gt;(pb);    //compile error</p>
		<p>    D *pd2 = dynamic_cast&lt;D *&gt;(pb); //pd2 is NULL</p>
		<p>    delete pb;</p>
		<p>}</p>
		<p> </p>
		<p>在函数foo中，使用static_cast进行转换是不被允许的，将在编译时出错；而使用 dynamic_cast的转换则是允许的，结果是空指针。</p>
		<p> </p>
		<p>3 reinterpret_cast</p>
		<p>用法：reinterpret_cast&lt;type-id&gt; (expression)</p>
		<p>type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。</p>
		<p>它可以把一个指针转换成一个整数，也可以把一个整数转换成一个指针（先把一个指针转换成一个整数，</p>
		<p>在把该整数转换成原类型的指针，还可以得到原先的指针值）。</p>
		<p> </p>
		<p>该运算符的用法比较多。</p>
		<p> </p>
		<p>(static_cast .与. reinterpret_cast比较，见下面 )</p>
		<p> </p>
		<p>4 const_cast</p>
		<p>用法：const_cast&lt;type_id&gt; (expression)</p>
		<p>该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外， type_id和expression的类型是一样的。</p>
		<p>常量指针被转化成非常量指针，并且仍然指向原来的对象；</p>
		<p>常量引用被转换成非常量引用，并且仍然指向原来的对象；常量对象被转换成非常量对象。</p>
		<p> </p>
		<p>Voiatile和const类试。举如下一例：</p>
		<p>class B{</p>
		<p>public:</p>
		<p>     int m_iNum;</p>
		<p>}</p>
		<p>void foo(){</p>
		<p>const B b1;</p>
		<p>b1.m_iNum = 100;            //comile error</p>
		<p>B b2 = const_cast&lt;B&gt;(b1);</p>
		<p>b2. m_iNum = 200;           //fine</p>
		<p>}</p>
		<p>上面的代码编译时会报错，因为b1是一个常量对象，不能对它进行改变；</p>
		<p>使用const_cast把它转换成一个常量对象，就可以对它的数据成员任意改变。注意：b1和b2是两个不同的对象。</p>
		<p> </p>
		<p>== ===========================================</p>
		<p> </p>
		<p>== dynamic_cast .vs. static_cast </p>
		<p>== ===========================================</p>
		<p> </p>
		<p>class B { ... };</p>
		<p>class D : public B { ... };</p>
		<p> </p>
		<p>void f(B* pb)</p>
		<p>{</p>
		<p> </p>
		<p>D* pd1 = dynamic_cast&lt;D*&gt;(pb);</p>
		<p> </p>
		<p>D* pd2 = static_cast&lt;D*&gt;(pb); </p>
		<p>}</p>
		<p> </p>
		<p>If pb really points to an object of type D, then pd1 and pd2 will get the same value. They will also get the same value if pb == 0. </p>
		<p> </p>
		<p>If pb points to an object of type B and not to the complete D class, then dynamic_cast will know enough to return zero. However, static_cast relies on the programmer’s assertion that pb points to an object of type D and simply returns a pointer to that supposed D object. </p>
		<p> </p>
		<p>即dynamic_cast可用于继承体系中的向下转型，即将基类指针转换为派生类指针，比static_cast更严格更安全。dynamic_cast在执行效率上比static_cast要差一些，但static_cast在更宽上范围内可以完成映射，这种不加限制的映射伴随着不安全性。static_cast覆盖的变换类型除类层次的静态导航以外，还包括无映射变换、窄化变换(这种变换会导致对象切片,丢失信息)、用VOID*的强制变换、隐式类型变换等... </p>
		<p> </p>
		<p>== ===========================================</p>
		<p>== static_cast .vs. reinterpret_cast</p>
		<p>== ================================================</p>
		<p> </p>
		<p>reinterpret_cast是为了映射到一个完全不同类型的意思，这个关键词在我们需要把类型映射回原有类型时用到它。我们映射到的类型仅仅是为了故弄玄虚和其他目的，这是所有映射中最危险的。(这句话是C++编程思想中的原话)</p>
		<p> </p>
		<p>static_cast 和 reinterpret_cast 操作符修改了操作数类型。它们不是互逆的； static_cast 在编译时使用类型信息执行转换，在转换执行必要的检测(诸如指针越界计算, 类型检查). 其操作数相对是安全的。另一方面；reinterpret_cast 仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换， 例子如下：</p>
		<p> </p>
		<p>int n=9; double d=static_cast &lt; double &gt; (n); </p>
		<p> </p>
		<p>上面的例子中, 我们将一个变量从 int 转换到 double。 这些类型的二进制表达式是不同的。 要将整数 9 转换到 双精度整数 9，static_cast 需要正确地为双精度整数 d 补足比特位。其结果为 9.0。而reinterpret_cast 的行为却不同: </p>
		<p> </p>
		<p>int n=9;</p>
		<p>double d=reinterpret_cast&lt;double &amp; &gt; (n);</p>
		<p> </p>
		<p>这次, 结果有所不同. 在进行计算以后, d 包含无用值. 这是因为 reinterpret_cast 仅仅是复制 n 的比特位到 d, 没有进行必要的分析.</p>
		<p> </p>
		<p>因此, 你需要谨慎使用 reinterpret_cast. </p><img src ="http://www.cppblog.com/lapcca/aggbug/135081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-11-30 15:37 <a href="http://www.cppblog.com/lapcca/archive/2010/11/30/135081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++ 枚举网页</title><link>http://www.cppblog.com/lapcca/archive/2010/11/22/134277.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Mon, 22 Nov 2010 07:34:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/11/22/134277.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/134277.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/11/22/134277.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/134277.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/134277.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: #include 				&lt;				stdio.h				&gt;																#include 				&lt;				tchar.h				&gt;																#include				&lt;				iostream				&gt;																#include...&nbsp;&nbsp;<a href='http://www.cppblog.com/lapcca/archive/2010/11/22/134277.html'>阅读全文</a><img src ="http://www.cppblog.com/lapcca/aggbug/134277.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-11-22 15:34 <a href="http://www.cppblog.com/lapcca/archive/2010/11/22/134277.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]QQ_dll Function</title><link>http://www.cppblog.com/lapcca/archive/2010/11/03/132297.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Wed, 03 Nov 2010 07:26:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/11/03/132297.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/132297.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/11/03/132297.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/132297.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/132297.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: AddrSearch.dll DllCanUnloadNow DllGetClassObject DllRegisterServer DllUnregisterServer		AFCtrl.dll DllCanUnloadNow DllGetClassObject DllMain DllRegisterServer DllUnregisterServer		AFUtil.dll publi...&nbsp;&nbsp;<a href='http://www.cppblog.com/lapcca/archive/2010/11/03/132297.html'>阅读全文</a><img src ="http://www.cppblog.com/lapcca/aggbug/132297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-11-03 15:26 <a href="http://www.cppblog.com/lapcca/archive/2010/11/03/132297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[分享收藏]IP协议族协议头结构</title><link>http://www.cppblog.com/lapcca/archive/2010/11/03/132295.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Wed, 03 Nov 2010 07:23:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/11/03/132295.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/132295.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/11/03/132295.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/132295.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/132295.html</trackback:ping><description><![CDATA[//IP协议族协议头结构(含 c声明 和 rfc 字符图示) <br />//Jurassic 2003.3.6 created. <br />/*++ <br />TCP Header Format <br />                                     <br />    0                   1                   2                   3    <br />    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1  <br />   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ <br />   |          Source Port          |       Destination Port        | <br />   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ <br />   |                        Sequence Number                        | <br />   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ <br />   |                    Acknowledgment Number                      | <br />   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ <br />   |  Data |           |U|A|P|R|S|F|                               | <br />   | Offset| Reserved  |R|C|S|S|Y|I|            Window             | <br />   |       |           |G|K|H|T|N|N|                               | <br />   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ <br />   |           Checksum            |         Urgent Pointer        | <br />   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ <br />   |                    Options                    |    Padding    | <br />   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ <br />   |                             data                              | <br />   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                            <br /><br />attached:<a href="/Files/lapcca/IP协议族协议头结构.zip">完整附件<br /></a><img src ="http://www.cppblog.com/lapcca/aggbug/132295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-11-03 15:23 <a href="http://www.cppblog.com/lapcca/archive/2010/11/03/132295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>atoi,atof实现</title><link>http://www.cppblog.com/lapcca/archive/2010/11/03/132274.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Wed, 03 Nov 2010 03:28:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/11/03/132274.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/132274.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/11/03/132274.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/132274.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/132274.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">
						<br />
						<img id="Codehighlighter1_1_74_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1_74_Open_Text.style.display='none'; Codehighlighter1_1_74_Closed_Image.style.display='inline'; Codehighlighter1_1_74_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_1_74_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1_74_Closed_Text.style.display='none'; Codehighlighter1_1_74_Open_Image.style.display='inline'; Codehighlighter1_1_74_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_1_74_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span>
				<span id="Codehighlighter1_1_74_Open_Text">
						<span style="COLOR: #008000">/*</span>
						<span style="COLOR: #008000">**********************************************************************</span>
						<span style="COLOR: #008000">*/</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000"> int a2i(const char *s) 函数原形 <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">功能: 把s所指向的字符串转换成int类型;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">返回值：字符串的转换值。<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000"> double a2f(const char *s) 函数原形 <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">功能: 把s所指向的字符串转换成double类型;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">返回值：字符串的转换值。</span>
				<span style="COLOR: #008000">
						<br />
						<img id="Codehighlighter1_229_302_Open_Image" onclick="this.style.display='none'; Codehighlighter1_229_302_Open_Text.style.display='none'; Codehighlighter1_229_302_Closed_Image.style.display='inline'; Codehighlighter1_229_302_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_229_302_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_229_302_Closed_Text.style.display='none'; Codehighlighter1_229_302_Open_Image.style.display='inline'; Codehighlighter1_229_302_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_229_302_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span>
				<span id="Codehighlighter1_229_302_Open_Text">
						<span style="COLOR: #008000">/*</span>
						<span style="COLOR: #008000">**********************************************************************</span>
						<span style="COLOR: #008000">*/</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> a2i(</span>
				<span style="COLOR: #0000ff">const</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">char</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">s)<br /><img id="Codehighlighter1_328_491_Open_Image" onclick="this.style.display='none'; Codehighlighter1_328_491_Open_Text.style.display='none'; Codehighlighter1_328_491_Closed_Image.style.display='inline'; Codehighlighter1_328_491_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_328_491_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_328_491_Closed_Text.style.display='none'; Codehighlighter1_328_491_Open_Image.style.display='inline'; Codehighlighter1_328_491_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_328_491_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_328_491_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> sign</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">,num</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">s</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        sign</span>
						<span style="COLOR: #000000">=-</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">else</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">s</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">+</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        sign</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    s</span>
						<span style="COLOR: #000000">++</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">while</span>
						<span style="COLOR: #000000">((</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">s)</span>
						<span style="COLOR: #000000">!=</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">\0</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">)<br /><img id="Codehighlighter1_434_467_Open_Image" onclick="this.style.display='none'; Codehighlighter1_434_467_Open_Text.style.display='none'; Codehighlighter1_434_467_Closed_Image.style.display='inline'; Codehighlighter1_434_467_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_434_467_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_434_467_Closed_Text.style.display='none'; Codehighlighter1_434_467_Open_Image.style.display='inline'; Codehighlighter1_434_467_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_434_467_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_434_467_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        num</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">num</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">10</span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000">(</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">s</span>
								<span style="COLOR: #000000">-</span>
								<span style="COLOR: #000000">'</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">'</span>
								<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        s</span>
								<span style="COLOR: #000000">++</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">    <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> num</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">sign;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">double</span>
				<span style="COLOR: #000000"> a2f(</span>
				<span style="COLOR: #0000ff">const</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">char</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">s)<br /><img id="Codehighlighter1_520_864_Open_Image" onclick="this.style.display='none'; Codehighlighter1_520_864_Open_Text.style.display='none'; Codehighlighter1_520_864_Closed_Image.style.display='inline'; Codehighlighter1_520_864_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_520_864_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_520_864_Closed_Text.style.display='none'; Codehighlighter1_520_864_Open_Image.style.display='inline'; Codehighlighter1_520_864_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_520_864_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_520_864_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">bool</span>
						<span style="COLOR: #000000"> bDot</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #0000ff">false</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">double</span>
						<span style="COLOR: #000000"> result</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> sign</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> (</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">s</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">-</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">)<br /><img id="Codehighlighter1_586_600_Open_Image" onclick="this.style.display='none'; Codehighlighter1_586_600_Open_Text.style.display='none'; Codehighlighter1_586_600_Closed_Image.style.display='inline'; Codehighlighter1_586_600_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_586_600_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_586_600_Closed_Text.style.display='none'; Codehighlighter1_586_600_Open_Image.style.display='inline'; Codehighlighter1_586_600_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_586_600_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_586_600_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        sign</span>
								<span style="COLOR: #000000">=-</span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">else</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">s</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">+</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">)<br /><img id="Codehighlighter1_621_634_Open_Image" onclick="this.style.display='none'; Codehighlighter1_621_634_Open_Text.style.display='none'; Codehighlighter1_621_634_Closed_Image.style.display='inline'; Codehighlighter1_621_634_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_621_634_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_621_634_Closed_Text.style.display='none'; Codehighlighter1_621_634_Open_Image.style.display='inline'; Codehighlighter1_621_634_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_621_634_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_621_634_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        sign</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    s</span>
						<span style="COLOR: #000000">++</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">double</span>
						<span style="COLOR: #000000"> temp</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">while</span>
						<span style="COLOR: #000000"> ((</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">s)</span>
						<span style="COLOR: #000000">!=</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">\0</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">)<br /><img id="Codehighlighter1_683_839_Open_Image" onclick="this.style.display='none'; Codehighlighter1_683_839_Open_Text.style.display='none'; Codehighlighter1_683_839_Closed_Image.style.display='inline'; Codehighlighter1_683_839_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_683_839_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_683_839_Closed_Text.style.display='none'; Codehighlighter1_683_839_Open_Image.style.display='inline'; Codehighlighter1_683_839_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_683_839_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_683_839_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000">(</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">s</span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000">'</span>
								<span style="COLOR: #000000">.</span>
								<span style="COLOR: #000000">'</span>
								<span style="COLOR: #000000">)<br /><img id="Codehighlighter1_701_716_Open_Image" onclick="this.style.display='none'; Codehighlighter1_701_716_Open_Text.style.display='none'; Codehighlighter1_701_716_Closed_Image.style.display='inline'; Codehighlighter1_701_716_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_701_716_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_701_716_Closed_Text.style.display='none'; Codehighlighter1_701_716_Open_Image.style.display='inline'; Codehighlighter1_701_716_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span id="Codehighlighter1_701_716_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.cppblog.com/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_701_716_Open_Text">
										<span style="COLOR: #000000">{bDot</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #0000ff">true</span>
										<span style="COLOR: #000000">;s</span>
										<span style="COLOR: #000000">++</span>
										<span style="COLOR: #000000">;}</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
										<br />
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
										<br />
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> (</span>
								<span style="COLOR: #000000">!</span>
								<span style="COLOR: #000000">bDot)<br /><img id="Codehighlighter1_735_769_Open_Image" onclick="this.style.display='none'; Codehighlighter1_735_769_Open_Text.style.display='none'; Codehighlighter1_735_769_Closed_Image.style.display='inline'; Codehighlighter1_735_769_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_735_769_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_735_769_Closed_Text.style.display='none'; Codehighlighter1_735_769_Open_Image.style.display='inline'; Codehighlighter1_735_769_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span id="Codehighlighter1_735_769_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.cppblog.com/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_735_769_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            result</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">result</span>
										<span style="COLOR: #000000">*</span>
										<span style="COLOR: #000000">10</span>
										<span style="COLOR: #000000">+</span>
										<span style="COLOR: #000000">(</span>
										<span style="COLOR: #000000">*</span>
										<span style="COLOR: #000000">s</span>
										<span style="COLOR: #000000">-</span>
										<span style="COLOR: #000000">'</span>
										<span style="COLOR: #000000">0</span>
										<span style="COLOR: #000000">'</span>
										<span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000">
										<br />
										<img id="Codehighlighter1_780_829_Open_Image" onclick="this.style.display='none'; Codehighlighter1_780_829_Open_Text.style.display='none'; Codehighlighter1_780_829_Closed_Image.style.display='inline'; Codehighlighter1_780_829_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_780_829_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_780_829_Closed_Text.style.display='none'; Codehighlighter1_780_829_Open_Image.style.display='inline'; Codehighlighter1_780_829_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span id="Codehighlighter1_780_829_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.cppblog.com/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_780_829_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            temp</span>
										<span style="COLOR: #000000">*=</span>
										<span style="COLOR: #000000">10</span>
										<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            result</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">result</span>
										<span style="COLOR: #000000">+</span>
										<span style="COLOR: #000000">(</span>
										<span style="COLOR: #000000">*</span>
										<span style="COLOR: #000000">s</span>
										<span style="COLOR: #000000">-</span>
										<span style="COLOR: #000000">'</span>
										<span style="COLOR: #000000">0</span>
										<span style="COLOR: #000000">'</span>
										<span style="COLOR: #000000">)</span>
										<span style="COLOR: #000000">/</span>
										<span style="COLOR: #000000">temp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        s</span>
								<span style="COLOR: #000000">++</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> sign</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">result;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div><img src ="http://www.cppblog.com/lapcca/aggbug/132274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-11-03 11:28 <a href="http://www.cppblog.com/lapcca/archive/2010/11/03/132274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++ web Kit简介</title><link>http://www.cppblog.com/lapcca/archive/2010/10/25/131176.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Mon, 25 Oct 2010 03:57:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/10/25/131176.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/131176.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/10/25/131176.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/131176.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/131176.html</trackback:ping><description><![CDATA[<h3>
				<span>Wt：简介</span>
		</h3>
		<p>Wt(音同'witty')是一个C++库，用以开发交互性Web应用。</p>
		<p>Wt的API<b>以widget为中心</b>，将桌面GUI APIs的良好测试模式引入Web开发。 Wt为开发者提供了几乎所有Web实现细节的抽象，其中包括事件处理、图像支持、优雅降级（或渐进增强）、及良好的URL处理。</p>
		<p>与其他诸多基于页面的开发框架相比，Wt可以创建状态化的应用，同时实现了高度的交互性和可访问性；其交互性体现在Wt可以综合使用各种技术，如Ajax等；其可访问性体现在Wt可以使应用在必要的时候支持纯HTML浏览器；这些特性的获得充分利用了自动的<b>优雅降级或渐进增强</b>。</p>
		<p>Wt库还自带了应用服务器程序，可配置为独立的Web服务器，当然也允许通过FastCGI连同其他Web服务器进行整合。</p>
		<h4>交互性、安全性、可访问性</h4>
		<p>基于页面的开发框架（如PHP、JSP/JSF、Ruby on Rails等）没有实现底层基础技术的抽象，这些技术包括HTML/XHTML、JavaScript、CSS、Ajax、Forms、DHTML 、SVG/VML/Canvas等。显然，基于页面的开发框架必须要求开发者随时熟悉和掌握这些基本技术，同时当浏览器不支持时，还要为应用的优雅降级负责。另外，如果应用采取早期HTML页面为中心的设计模式，开发者不仅要实现控制器以告诉用户如何从一个页面跳转到另一个页面，而且还要在采用一些高级Ajax技术时手工设计和维护客户端与服务器端的通讯。</p>
		<p>另一方面，就算是纯粹的Ajax框架，也要求开发者通过繁杂的JavaScript编程来处理浏览器的怪异行为和客户端与服务器端间的安全通讯，这些处理任何人都不能跳过去不与理会。同时，这些应用通常不能符合可访问性的原则，也不能很好被搜索机器人索引到。</p>
		<p>安全方面，生成HTML或填充HTML模版很容易导致安全问题，如<a href="http://en.wikipedia.org/wiki/Cross-site_scripting">跨站脚本（XSS） </a>和<a href="http://en.wikipedia.org/wiki/Cross-site_request_forgery"> 跨站请求伪造（CSRF）</a>；XSS问题一般由（疏忽）允许嵌入JavaScript代码引起， CSRF问题一般由（相信）Cookies（可）作为认证手段引起。作为开发者，这些安全问题将是很难避免的，因为我们有时需要允许用户插入自己的JavaScript 代码来实现某些功能，但开发框架本身却没提供给我们过滤机制。</p>
		<p>相反，使用Wt来部署Web应用可以完全用C++来开发，Wt自动产生所必须的 HTML/XHTML、CSS、Javascript、CGI、SVG/VML/Canvas和Ajax代码；与此同时，代码的安全性和浏览器兼容性等问题都将转交给Wt。例如，在可能的情况下， Wt将最大限度的使用JavaScript和Ajax，但在Ajax功能受限时，Wt也能保证系统功能运行正常。其原理是Wt将先启用纯HTML/CGI应用，随后在可能的情况下渐进增强至Ajax应用。另外，Wt提供了内置的安全性考虑。</p>
		<h4>典型应用举隅：</h4>
		<ul>
				<li>由于Wt C++ Web应用服务器占用较小的物理空间，故而可以为<b>嵌入式系统</b> 提供基于Web的GUIs；</li>
				<li>Wt可以为需要<b>整合现有C++库</b>的应用提供基于Web的GUIs, 这些 应用可能包括科学上的或工程上的应用；</li>
				<li>Wt可以创建从<b>现有C++桌面应用</b>到Web的有效渠道；</li>
				<li>Wt还可以应用于一些<b>高性能、复杂的</b>Web应用，这样的应用 一般具有高度定制、充分利用Ajax的特点，同时具有完全的可访问性和较高的 搜索引擎优化(SEO)需求</li>
		</ul>
		<h4>使用Wt的其他好处</h4>
		<ul>
				<li>可以使用我们熟悉的桌面GUI模式开发Web应用；</li>
				<li>Wt为我们提供了广阔的widgets集，这些widgets可以在环境不支持 JavaScript的情况下照常工作（当然，如果支持则效果更佳）；</li>
				<li>在Wt中客户端与服务器端的验证和事件处理采用同一规范；</li>
				<li>Wt允许开发者选择XHTML和CSS来进行布局和样式编辑；</li>
				<li>Wt可生成标准的、兼容的HTML或XHTML代码；</li>
				<li>Wt采用内联VML、内联SVG、HTML 5 画布或PNG可生成应用于Web的可移植的、 反锯齿的图像，当然这些图像还可以轻松渲染为PDF格式；</li>
				<li>
				</li>
				<li>Wt可以避免常见的安全问题，因为Wt拥有对表示层的完全控制，并能够主动 过滤掉<i>处于活动状态的</i>标签和属性；Wt同时实现了业务逻辑的隐藏，并 通过状态化的设计简化了认证机制；</li>
				<li>基于Wt的应用的载入时间极短且占用带宽也很低，究其原因是Wt中这些特点 仅受限于页面显示的复杂程度，而不是应用程序自身的尺寸；Wt还实现了所有的 常用技巧和方法，以优化应用的快速反应，Wt几乎做到了针对所有浏览器的优化；</li>
				<li>Wt提供了服务器端初始的事件处理，即<i>服务器推</i>或<i>Comet</i>， 这部分API使用简单、稳定且在所有浏览器上均能实现；</li>
				<li>Wt在服务器部署上，既可以使用内置的httpd，又可以使用FastCGI/ISAPI， 当然前者实施起来更简便易行。</li>
		</ul><img src ="http://www.cppblog.com/lapcca/aggbug/131176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-10-25 11:57 <a href="http://www.cppblog.com/lapcca/archive/2010/10/25/131176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PE文件头的结构图</title><link>http://www.cppblog.com/lapcca/archive/2010/09/30/128122.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Thu, 30 Sep 2010 04:23:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/09/30/128122.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/128122.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/09/30/128122.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/128122.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/128122.html</trackback:ping><description><![CDATA[<img src="http://www.cppblog.com/images/cppblog_com/lapcca/13342/o_PE%e6%96%87%e4%bb%b6%e5%a4%b4%e7%bb%93%e6%9e%84%e5%9b%be1.jpg" /> <br /><br />最近学习PE文件，《软件加密技术内幕》第一章有详细的讲解<br />不过看了半天搞的头到晕了，结构太多，最后自己查看WINNT.H头文件<br />把PE头中的结构画了一张图，在看书学习的时候边看书边看图学习理解较快！<br />有什么错误请高手指正，谢谢！<br />其次强烈建议大家看《软件加密技术内幕》第一章配合本图，效果不错哦！<br />附上自己写的一个PE文件查看器，简单。里面用了一些《软件加密技术内幕》<br />光盘中的代码，用MFC写的！<br />错误在所难免，恳请大家指正！<br /><br /><br /><a href="/Files/lapcca/PE文件查看器.rar">PE文件查看器源码</a><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />转自：<a href="http://bbs.pediy.com/showthread.php?t=62693&amp;highlight=rar">http://bbs.pediy.com/showthread.php?t=62693&amp;highlight=rar</a><img src ="http://www.cppblog.com/lapcca/aggbug/128122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-09-30 12:23 <a href="http://www.cppblog.com/lapcca/archive/2010/09/30/128122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DLL在应用程序间共享数据</title><link>http://www.cppblog.com/lapcca/archive/2010/09/17/126860.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Fri, 17 Sep 2010 05:38:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/09/17/126860.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/126860.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/09/17/126860.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/126860.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/126860.html</trackback:ping><description><![CDATA[<p> </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">#pragma data_seg(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">.mydata</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">)<br /><img id="Codehighlighter1_41_45_Open_Image" onclick="this.style.display='none'; Codehighlighter1_41_45_Open_Text.style.display='none'; Codehighlighter1_41_45_Closed_Image.style.display='inline'; Codehighlighter1_41_45_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_41_45_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_41_45_Closed_Text.style.display='none'; Codehighlighter1_41_45_Open_Image.style.display='inline'; Codehighlighter1_41_45_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />POINT pPoint</span>
				<span style="COLOR: #000000">=</span>
				<span id="Codehighlighter1_41_45_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_41_45_Open_Text">
						<span style="COLOR: #000000">{</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">,</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">}</span>
				</span>
				<span style="COLOR: #000000">;</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">must initialize</span>
				<span style="COLOR: #008000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">#pragma data_seg()<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#pragma comment(linker,</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">/SECTION:.mydata,RWS</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
		</div><img src ="http://www.cppblog.com/lapcca/aggbug/126860.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-09-17 13:38 <a href="http://www.cppblog.com/lapcca/archive/2010/09/17/126860.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用斯特林(Stirling)公式求解n!</title><link>http://www.cppblog.com/lapcca/archive/2010/09/13/126499.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Mon, 13 Sep 2010 03:52:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/09/13/126499.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/126499.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/09/13/126499.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/126499.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/126499.html</trackback:ping><description><![CDATA[<p>
				<span style="COLOR: #ff0000">
						<font color="#000000">
								<strong>   <img src="http://www.cppblog.com/images/cppblog_com/lapcca/13342/o_stirling.gif" /></strong>
						</font>
				</span>
		</p><img src ="http://www.cppblog.com/lapcca/aggbug/126499.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-09-13 11:52 <a href="http://www.cppblog.com/lapcca/archive/2010/09/13/126499.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BMP文件头格式 bmp文件二进制解析</title><link>http://www.cppblog.com/lapcca/archive/2010/09/09/126229.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Thu, 09 Sep 2010 04:10:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/09/09/126229.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/126229.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/09/09/126229.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/126229.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/126229.html</trackback:ping><description><![CDATA[<p>
				<span>BMP</span>
				<span>文件头格式</span>
				<span>
						<span>bmp</span>
				</span>
				<span>文件二进制解析</span>
				<span>,bmp</span>
				<span>文件解析</span>
				<span>,bmp</span>
				<span>存储格式</span>
				<span>
				</span>
		</p>
		<p>
				<span>下面的表格是我整理的</span>
				<span>BMP</span>
				<span>文件头的格式。</span>
		</p>
		<p>
				<span>方便大家查询。</span>
		</p>
		<p> </p>
		<p>
				<span>Bmp</span>
				<span>的文件头是</span>
				<span>54 , </span>
				<span>以下都是</span>
				<span>24 bit,</span>
		</p>
		<p>
				<span>如果</span>
				<span>
				</span>
				<span>图像大小是</span>
				<span>720 * 480 ,</span>
				<span>那么文件大小是</span>
				<span>: 54 + 720 * 480 *3 </span>
				<span>很好理解</span>
				<span>,</span>
		</p>
		<p>
				<span>如果</span>
				<span>
				</span>
				<span>图像大小是</span>
				<span>
						<span>333 * 333</span>
				</span>
				<span>那么文件大小就不是</span>
				<span>: 54 + 333 * 333 *3 </span>
				<span>了</span>
				<span>,</span>
				<span>奇怪么</span>
				<span>?,<br /><br />   总算引出高人了，我就公布答案吧： <br /><span>   如果</span><span></span><span>图像大小是</span><span> <span>1*7  </span></span><span>那么文件大小就是</span><span>: 54 + 1*7*3 + 7*n </span><span>了</span><span>,<br /></span><span>   如果</span><span></span><span>图像大小是</span><span> <span>3*5  </span></span><span>那么文件大小就是</span><span>: 54 + 3*5*3 + 5*n </span><span>了</span><span>,<br /></span><span>   如果</span><span></span><span>图像大小是</span><span> 11<span>*77  </span></span><span>那么文件大小就是</span><span>: 54 + 11*77*3 + 77*n </span><span>了</span><span>,<br /></span>   总之是如果width * high * 3  + high * n ！＝ 4的倍数， 那么文件大小就是 54 +  width * high * 3 + high*n  了。<br /><br />   n的取值范围是 0 ～～3   直到算下来，size是4的倍数。<br /><br /><img src="http://www.cppblog.com/images/cppblog_com/lapcca/13342/o_bmp.jpg" /><br /><br /><br />转自：<a href="http://www.cnitblog.com/dvb-dvb/archive/2009/07/06/59865.aspx">http://www.cnitblog.com/dvb-dvb/archive/2009/07/06/59865.aspx</a></span>
		</p><img src ="http://www.cppblog.com/lapcca/aggbug/126229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-09-09 12:10 <a href="http://www.cppblog.com/lapcca/archive/2010/09/09/126229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Application Compatibility - Session 0 Isolation</title><link>http://www.cppblog.com/lapcca/archive/2010/09/08/126152.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Wed, 08 Sep 2010 06:03:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/09/08/126152.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/126152.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/09/08/126152.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/126152.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/126152.html</trackback:ping><description><![CDATA[<div class="post-content user-defined-markup" sizset="108" sizcache="1185">
				<p>
						<img style="MARGIN: 0px 10px 0px 0px" height="75" hspace="0" src="http://www.cppblog.com/images/cppblog_com/lapcca/13342/o_Vista.jpg" width="85" align="left" mce_src="http://askperf.members.winisp.net/BlogImages/Vista.jpg" />In Windows XP, Windows Server 2003, and earlier versions of the Windows operating system, all services run in the same session as the first user who logs on to the console.  This session is called Session 0. Running services and user applications together in Session 0 poses a security risk because services run at elevated privilege and therefore are targets for malicious agents who are looking for a means to elevate their own privilege level. 
</p>
				<p>The Microsoft Windows Vista operating system mitigates this security risk by isolating services in Session 0 and making Session 0 non-interactive.  In Windows Vista (and Windows Longhorn Server), only system processes and services run in Session 0.  The user logs on to Session 1.  On Windows Longhorn Server, subsequent users log on to subsequent sessions (Session 2, Session 3 etc).  This means that services never run in the same session as users' applications and are therefore protected from attacks that originate in application code. 
</p>
				<p>Specific examples of affected driver classes include: 
</p>
				<ul>
						<li>Printer drivers, which are loaded by the spooler service 
</li>
						<li>All drivers authored with the User Mode Driver Framework (UMDF), because these drivers are hosted by a process in Session 0 </li>
				</ul>
				<p>Application classes affected by this feature: 
</p>
				<ul>
						<li>Services that create a UI 
</li>
						<li>A service that tries to use window message functions such as SendMessage and PostMessage to communicate with an application 
</li>
						<li>Applications creating globally named objects</li>
				</ul>
				<p>
						<strong>Sessions in Windows XP / 2003<br /></strong>OK - so we've already mentioned that Session 0 poses a security risk because services run at elevated privilege.  The first user on the console also runs in Session 0 - which provides the most common attack vector used to target unsuspecting users.</p>
				<p>
						<strong>
								<strong>
										<img style="MARGIN: 0px 10px 5px 0px" height="237" hspace="0" src="http://www.cppblog.com/images/cppblog_com/lapcca/13342/o_image1.png" width="240" mce_src="http://blogs.technet.com/blogfiles/askperf/WindowsLiveWriter/ApplicationCompatibilitySession0Isolatio_F203/image7.png" />
								</strong>
						</strong>
				</p>
				<p>
						<strong>Sessions in Windows Vista<br /></strong>In Windows Vista, Session 0 is created for services and user-mode drivers.  Session 1 is created for the first user who logs in.  Applications for this user run in Session 1.</p>
				<ul>
						<li>Each time a user logs in, a session is created for that user 
</li>
						<li>Each session contains a collection of windows stations 
</li>
						<li>The only supported interactive window station is WinSta0, so each session gets one of these 
</li>
						<li>WinSta0 contains the keyboard, mouse, and display device 
</li>
						<li>Each window station can contain multiple desktops, which have logical display surfaces and can be used to manage windows 
</li>
						<li>Messages can only be sent between processes that are on the same desktop (the hook procedure of a process can also only receive messages intended for windows created on the same desktop) 
</li>
						<li>Only one desktop at a time is active 
</li>
						<li>There are several default desktops – default, WinLogon (secure), and screen-saver</li>
				</ul>
				<p>
						<img height="290" hspace="0" src="http://www.cppblog.com/images/cppblog_com/lapcca/13342/o_Session0Isolation1.gif" width="720" mce_src="http://blogs.technet.com/blogfiles/askperf/WindowsLiveWriter/ApplicationCompatibilitySession0Isolatio_F203/Session0Isolation1.gif" />
				</p>
				<p>OK - so what could this actually look like in a real world scenario?  Consider the following example - if a service belonging to an application generates a UI element in Session 0 - for example a dialog box waiting for the user to click "OK" or "Cancel", the application is now waiting on the service, and the UI is not displayed in the user session.  From the user perspective, the application appears to be hung, when in actual fact it is performing quite normally, and patiently waiting for a user response that the user cannot see!</p>
				<p>As you can imagine - this presents a problem for users, administrators and developers.  However, there are some quick mitigating factors to consider.</p>
				<ul>
						<li>If the application's service uses a UI, a built-in mitigation in Windows Vista allows the user to interact with the Session 0 UI in a special desktop.  This will make the UI specific to the application available and not the entire Session 0 desktop. 
</li>
						<li>If the application creates globally named objects, then use the Windows XP compatibility mode to ensure that the application will continue to work with the Session 0 services.</li>
				</ul>
				<p>When testing applications for compatibility with Windows Vista, consider the following test scenarios:</p>
				<ul>
						<li>Test and verify the application on Windows XP in a Terminal Server mode or a Fast User Switching (FUS) mode.  If the application works properly on Windows XP in these scenarios, then it is very likely to work under Windows Vista. 
</li>
						<li>Verify that the application functions properly after applying the Window XP compatibility mode, which contains mitigation for some of the Session 0 issues. 
</li>
						<li>Test the driver in Windows Vista to ensure that it runs properly.  If that is not possible, test the driver in Windows XP with FUS enabled and multiple users logged on.  If the driver works correctly for second and subsequent logged-on users, it is not likely to be affected by the Session 0 changes in Windows Vista.  The only issues that this test does not detect are those related to the absence of the video driver in Session 0 in Windows Vista.</li>
				</ul>
				<p>Finally, you can leverage the following Windows Vista capability solutions:</p>
				<ul>
						<li>Use client or server mechanisms such as remote procedure call (RPC) or named pipes to communicate between services and applications. 
</li>
						<li>Use the <em>WTSSendMessage</em> function to create a simple message box on the user's desktop.  This allows the service to give the user a notification and request a simple response. 
</li>
						<li>For more complex UI, use the <em>CreateProcessAsUser</em> function to create a process in the user's session. 
</li>
						<li>Explicitly choose either the Local\ or Global\ namespace for any named objects, such as events or mapped memory, which the service makes available.</li>
				</ul>
				<p>And that will do it for a quick look at how Session 0 isolation affects Application Compatibility in Windows Vista.  The links below contain more information on some of the concepts discussed above.  Until next time ...</p>
		</div><img src ="http://www.cppblog.com/lapcca/aggbug/126152.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-09-08 14:03 <a href="http://www.cppblog.com/lapcca/archive/2010/09/08/126152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习linux/unix编程方法的建议,学习Linux的四个步骤</title><link>http://www.cppblog.com/lapcca/archive/2010/08/31/125386.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Tue, 31 Aug 2010 03:49:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/08/31/125386.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/125386.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/08/31/125386.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/125386.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/125386.html</trackback:ping><description><![CDATA[<p>
				<img src="http://www.cppblog.com/images/cppblog_com/lapcca/13342/o_41__600x100_linux_logo.jpg" />
				<br />
				<font face="Courier New">假设你是计算机科班出身，计算机系的基本课程如数据结构、操作系统、体系结构、编译原理、计算机网络你全修过<br />我想大概可以分为4个阶段，水平从低到高<br />从安装使用=&gt;linux常用命令=&gt;linux系统编程=&gt;内核开发阅读内核源码<br />其中学习linux常用命令时就要学会自己编译内核，优化系统，调整参数<br />安装和常用命令书太多了，找本稍微详细点的就ok，其间需要学会正则表达式<br />系统编程推荐《高级unix环境编程》，黑话叫APUE<br />还有《unix网络编程》<br />这时候大概还需要看资料理解elf文件格式，连接器和加载器，cmu的一本教材中文名为《深入理解计算机系统》比较好<br />内核开发阅读内核源码阶段，从写驱动入手逐渐深入linux内核开发<br />参考书如下《linux device drivers》，黑话叫ldd<br />《linux kernel development》，黑话叫lkd<br />《understading the linux kernel》，黑话叫utlk<br />《linux源码情景分析》<br />这四本书为搞内核的必读书籍<br />最后，第三阶段和第四阶段最重动手，空言无益，光看书也不罩，不动手那些东西理解不了<br /><br /><strong><font color="#666633" size="4">学习linux/unix编程方法的建议</font></strong><br />建议学习路径：<br />　　首先先学学编辑器，vim, emacs什么的都行。<br />然后学make file文件，只要知道一点就行，这样就可以准备编程序了。<br />　　然后看看《C程序设计语言》K&amp;R，这样呢，基本上就可以进行一般的编程了，顺便找本数据结构的书来看。<br />　　如果想学习UNIX/LINUX的编程，《APUE》绝对经典的教材，加深一下功底，学习《UNP》的第二卷。这样基本上系统方面的就可以掌握了。<br />　　然后再看Douglus E. Comer的《用TCP/IP进行网际互连》第一卷，学习一下网络的知识，再看《UNP》的第一卷，不仅学习网络编程，而且对系统编程的一些常用的技巧就很熟悉了，如果继续网络编程，建议看《TCP/IP进行网际互连》的第三卷，里面有很多关于应用协议telnet、ftp等协议的编程。<br />如果想写设备驱动程序，首先您的系统编程的接口比如文件、IPC等必须要熟知了，再学习《LDD》2。<br />　　对于几本经典教材的评价：<br />　　《The C Programing Language》K&amp;R 经典的C语言程序设计教材，作者是C语言的发明者，教材内容深入浅出。虽然有点老，但是必备的一本手册，现在有时候我还常翻翻。篇幅比较小，但是每看一遍，就有一遍的收获。另外也可用谭浩强的《C语言程序设计》代替。<br />　　《Advanced Programing in Unix Envirement》 W.Richard Stevens：也是非常经典的书（废话，Stevens的书哪有不经典的！），虽然初学者就可以看，但是事实上它是《Unix Network Programing》的一本辅助资料。国内的翻译的《UNIX环境高级编程》的水平不怎么样，现在有影印版，直接读英文比读中文来得容易。<br />　　《Unix Network Programing》W.Richard Stevens：第一卷讲BSD Socket网络编程接口和另外一种网络编程接口的，不过现在一般都用BSD Socket，所以这本书只要看大约一半多就可以了。第二卷没有设计到网络的东西，主要讲进程间通讯和Posix线程。所以看了《APUE》以后，就可以看它了，基本上系统的东西就由《APUE》和《UNP》vol2概括了。看过《UNP》以后，您就会知道系统编程的绝大部分编程技巧，即使卷一是讲网络编程的。国内是清华翻译得《Unix网络编程》，翻译者得功底也比较高，翻译地比较好。所以建议还是看中文版。<br />　　《TCP/IP祥解》一共三卷，卷一讲协议，卷二讲实现，卷三讲编程应用。我没有怎么看过。，但是据说也很经典的，因为我没有时间看卷二，所以不便评价。<br />　　《用TCP/IP进行网际互连》Douglus.E.Comer 一共三卷，卷一讲原理，卷二讲实现，卷三讲高级协议。感觉上这一套要比Stevens的那一套要好，就连Stevens也不得不承认它的第一卷非常经典。事实上，第一卷即使你没有一点网络的知识，看完以后也会对网络的来龙去脉了如指掌。第一卷中还有很多习题也设计得经典和实用，因为作者本身就是一位教师，并且卷一是国外研究生的教材。习题并没有答案，留给读者思考，因为问题得答案可以让你成为一个中级的Hacker，这些问题的答案可以象Douglus索取，不过只有他只给教师卷二我没有怎么看，卷三可以作为参考手册，其中地例子也很经典。如果您看过Qterm的源代码，就会知道Qterm的telnet 实现部分大多数就是从这本书的源代码过来的。对于网络原理的书，我推荐它，而不是Stevens的《TCP/IP祥解》。<br />　　《Operating System - Design and Implement》这个是讲操作系统的书，用Minix做的例子。作者母语不是英文，所以英文看起来比较晦涩。国内翻译的是《操作系统设计与实现》，我没看过中文版，因为翻译者是尤晋元，他翻译的《APUE》已经让我失望头顶了。读了这本书，对操作系统的底层怎么工作的就会<br />有一个清晰的认识。<br />　　《Linux Device Driver》2e ，为数不多的关于Linux设备驱动程序的好书。不过内容有些杂乱，如果您没有一些写驱动的经验，初次看会有些摸不着南北。国内翻译的是《Linux设备驱动程序》第二版，第一版，第二版的译者我都有很深的接触，不过总体上来说，虽然第二版翻译的有些不尽人意，但是相比第一版来说已经超出了一大截。要读这一本书，至少应该先找一些《计算机原理》《计算机体系结构》的书来马马虎虎读读，至少应该对硬件和计算机的工作过程有一些了解。<br /></font>       </p><img src ="http://www.cppblog.com/lapcca/aggbug/125386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-08-31 11:49 <a href="http://www.cppblog.com/lapcca/archive/2010/08/31/125386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基本操作的位运算实现</title><link>http://www.cppblog.com/lapcca/archive/2010/08/27/124948.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Fri, 27 Aug 2010 08:26:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/08/27/124948.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/124948.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/08/27/124948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/124948.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/124948.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 下面使用位运算来实现一些基本的操作和基本的函数，这些实现全部都是宏，这是高效率的关键。														/**/										/*						 base.h：基本操作的位运算实现 						*/								  #ifndef BASE_H   				#define				 BASE_H   												...&nbsp;&nbsp;<a href='http://www.cppblog.com/lapcca/archive/2010/08/27/124948.html'>阅读全文</a><img src ="http://www.cppblog.com/lapcca/aggbug/124948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-08-27 16:26 <a href="http://www.cppblog.com/lapcca/archive/2010/08/27/124948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>定位IAT并输出导入函数名称和对应的函数地址</title><link>http://www.cppblog.com/lapcca/archive/2010/08/23/124404.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Mon, 23 Aug 2010 05:22:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/08/23/124404.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/124404.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/08/23/124404.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/124404.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/124404.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">#include </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">stdio.h</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">windows.h</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 3</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 4</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> main()<br /></span>
				<span style="COLOR: #008080"> 5</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_53_1677_Open_Image" onclick="this.style.display='none'; Codehighlighter1_53_1677_Open_Text.style.display='none'; Codehighlighter1_53_1677_Closed_Image.style.display='inline'; Codehighlighter1_53_1677_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_53_1677_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_53_1677_Closed_Text.style.display='none'; Codehighlighter1_53_1677_Open_Image.style.display='inline'; Codehighlighter1_53_1677_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_53_1677_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_53_1677_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080"> 6</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">取得主模块的模块句柄（即进程模块基地址）</span>
						<span style="COLOR: #008000">
								<br />
						</span>
						<span style="COLOR: #008080"> 7</span>
						<span style="COLOR: #008000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">HMODULE hMod </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> GetModuleHandle(NULL);<br /></span>
						<span style="COLOR: #008080"> 8</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
						</span>
						<span style="COLOR: #008080"> 9</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">把进程基址赋给pDosHeader,即起始基址就是PE的IMAGE_DOS_HEADER</span>
						<span style="COLOR: #008000">
								<br />
						</span>
						<span style="COLOR: #008080">10</span>
						<span style="COLOR: #008000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">IMAGE_DOS_HEADER</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> pDosHeader </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> (IMAGE_DOS_HEADER</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">)hMod;<br /></span>
						<span style="COLOR: #008080">11</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
						</span>
						<span style="COLOR: #008080">12</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">定位到PE HEADER<br /></span>
						<span style="COLOR: #008080">13</span>
						<span style="COLOR: #008000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">基址hMod加上IMAGE_DOS_HEADER结构的e_lfanew成员到达IMAGE_NT_HEADERS<br /></span>
						<span style="COLOR: #008080">14</span>
						<span style="COLOR: #008000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">NT文件头的前4字节是文件签名("PE00" 字符串),然后是20字节的IMAGE_FILE_HEADER结构<br /></span>
						<span style="COLOR: #008080">15</span>
						<span style="COLOR: #008000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">即到达IMAGE_OPTIONAL_HEADER结构的地址,获取了一个指向IMAGE_OPTIONAL_HEADER结构体的指针</span>
						<span style="COLOR: #008000">
								<br />
						</span>
						<span style="COLOR: #008080">16</span>
						<span style="COLOR: #008000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">IMAGE_OPTIONAL_HEADER </span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> pOptHeader </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">17</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />(IMAGE_OPTIONAL_HEADER </span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">)((BYTE</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">)hMod </span>
						<span style="COLOR: #000000">+</span>
						<span style="COLOR: #000000"> pDosHeader</span>
						<span style="COLOR: #000000">-&gt;</span>
						<span style="COLOR: #000000">e_lfanew </span>
						<span style="COLOR: #000000">+</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">24</span>
						<span style="COLOR: #000000">);<br /></span>
						<span style="COLOR: #008080">18</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
						</span>
						<span style="COLOR: #008080">19</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">定位到导入表<br /></span>
						<span style="COLOR: #008080">20</span>
						<span style="COLOR: #008000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">通过IMAGE_OPTIONAL_HEADER结构中的DataDirectory结构数组中的第二个成员中的<br /></span>
						<span style="COLOR: #008080">21</span>
						<span style="COLOR: #008000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">VirturalAddress字段定位到IMAGE_IMPORT_DESCRIPTOR结构的起始地址<br /></span>
						<span style="COLOR: #008080">22</span>
						<span style="COLOR: #008000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">即获得导入表中第一个IMAGE_IMPORT_DESCRIPTOR结构的指针(导入表首地址)</span>
						<span style="COLOR: #008000">
								<br />
						</span>
						<span style="COLOR: #008080">23</span>
						<span style="COLOR: #008000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">IMAGE_IMPORT_DESCRIPTOR</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> pImportDesc </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> (IMAGE_IMPORT_DESCRIPTOR</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">)<br /></span>
						<span style="COLOR: #008080">24</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />((BYTE</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">)hMod </span>
						<span style="COLOR: #000000">+</span>
						<span style="COLOR: #000000"> pOptHeader</span>
						<span style="COLOR: #000000">-&gt;</span>
						<span style="COLOR: #000000">DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);<br /></span>
						<span style="COLOR: #008080">25</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
						</span>
						<span style="COLOR: #008080">26</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">while</span>
						<span style="COLOR: #000000">(pImportDesc</span>
						<span style="COLOR: #000000">-&gt;</span>
						<span style="COLOR: #000000">FirstThunk)<br /></span>
						<span style="COLOR: #008080">27</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_878_1641_Open_Image" onclick="this.style.display='none'; Codehighlighter1_878_1641_Open_Text.style.display='none'; Codehighlighter1_878_1641_Closed_Image.style.display='inline'; Codehighlighter1_878_1641_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_878_1641_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_878_1641_Closed_Text.style.display='none'; Codehighlighter1_878_1641_Open_Image.style.display='inline'; Codehighlighter1_878_1641_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
						</span>
						<span id="Codehighlighter1_878_1641_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_878_1641_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">28</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">遍历结构的OriginalFirstThunk字段所指向的IMAGE_IMPORT_BY_NAME结构得到导出函数名<br /></span>
								<span style="COLOR: #008080">29</span>
								<span style="COLOR: #008000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">遍历IMAGE_IMPORT_DESCRIPTOR结构的FirstThunk数组得到每个函数的地址<br /></span>
								<span style="COLOR: #008080">30</span>
								<span style="COLOR: #008000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
										<br />
								</span>
								<span style="COLOR: #008080">31</span>
								<span style="COLOR: #008000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">导出模块的名称</span>
								<span style="COLOR: #008000">
										<br />
								</span>
								<span style="COLOR: #008080">32</span>
								<span style="COLOR: #008000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #0000ff">char</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000"> pszDllName </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> (</span>
								<span style="COLOR: #0000ff">char</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">)((BYTE</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">)hMod </span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000">pImportDesc</span>
								<span style="COLOR: #000000">-&gt;</span>
								<span style="COLOR: #000000">Name);<br /></span>
								<span style="COLOR: #008080">33</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />printf(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">\n模块名称：%s \n</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">, pszDllName);<br /></span>
								<span style="COLOR: #008080">34</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
										<br />
								</span>
								<span style="COLOR: #008080">35</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> 一个IMAGE_THUNK_DATA就是一个双字，它指定了一个导入函数</span>
								<span style="COLOR: #008000">
										<br />
								</span>
								<span style="COLOR: #008080">36</span>
								<span style="COLOR: #008000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">IMAGE_THUNK_DATA</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000"> pThunk </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> (IMAGE_THUNK_DATA</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">)<br /></span>
								<span style="COLOR: #008080">37</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />((BYTE</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">)hMod </span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000"> pImportDesc</span>
								<span style="COLOR: #000000">-&gt;</span>
								<span style="COLOR: #000000">OriginalFirstThunk);<br /></span>
								<span style="COLOR: #008080">38</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000"> n </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">;<br /></span>
								<span style="COLOR: #008080">39</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #0000ff">while</span>
								<span style="COLOR: #000000">(pThunk</span>
								<span style="COLOR: #000000">-&gt;</span>
								<span style="COLOR: #000000">u1.Function)<br /></span>
								<span style="COLOR: #008080">40</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_1276_1623_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1276_1623_Open_Text.style.display='none'; Codehighlighter1_1276_1623_Closed_Image.style.display='inline'; Codehighlighter1_1276_1623_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_1276_1623_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1276_1623_Closed_Text.style.display='none'; Codehighlighter1_1276_1623_Open_Image.style.display='inline'; Codehighlighter1_1276_1623_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
								</span>
								<span id="Codehighlighter1_1276_1623_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.cppblog.com/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_1276_1623_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080">41</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000"> 取得函数名称。hint/name表前两个字节是函数的序号，后4个字节是函数名称字符串的地址</span>
										<span style="COLOR: #008000">
												<br />
										</span>
										<span style="COLOR: #008080">42</span>
										<span style="COLOR: #008000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #0000ff">char</span>
										<span style="COLOR: #000000">*</span>
										<span style="COLOR: #000000"> pszFunName </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> (</span>
										<span style="COLOR: #0000ff">char</span>
										<span style="COLOR: #000000">*</span>
										<span style="COLOR: #000000">)<br /></span>
										<span style="COLOR: #008080">43</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />((BYTE</span>
										<span style="COLOR: #000000">*</span>
										<span style="COLOR: #000000">)hMod </span>
										<span style="COLOR: #000000">+</span>
										<span style="COLOR: #000000"> (DWORD)pThunk</span>
										<span style="COLOR: #000000">-&gt;</span>
										<span style="COLOR: #000000">u1.AddressOfData </span>
										<span style="COLOR: #000000">+</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #000000">2</span>
										<span style="COLOR: #000000">);<br /></span>
										<span style="COLOR: #008080">44</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000"> 取得函数地址。IAT表就是一个DWORD类型的数组，每个成员记录一个函数的地址</span>
										<span style="COLOR: #008000">
												<br />
										</span>
										<span style="COLOR: #008080">45</span>
										<span style="COLOR: #008000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">PDWORD lpAddr </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> (DWORD</span>
										<span style="COLOR: #000000">*</span>
										<span style="COLOR: #000000">)((BYTE</span>
										<span style="COLOR: #000000">*</span>
										<span style="COLOR: #000000">)hMod </span>
										<span style="COLOR: #000000">+</span>
										<span style="COLOR: #000000"> pImportDesc</span>
										<span style="COLOR: #000000">-&gt;</span>
										<span style="COLOR: #000000">FirstThunk) </span>
										<span style="COLOR: #000000">+</span>
										<span style="COLOR: #000000"> n;<br /></span>
										<span style="COLOR: #008080">46</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
												<br />
										</span>
										<span style="COLOR: #008080">47</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000"> 打印出函数名称和地址</span>
										<span style="COLOR: #008000">
												<br />
										</span>
										<span style="COLOR: #008080">48</span>
										<span style="COLOR: #008000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">printf(</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">   从此模块导入的函数：%-25s，</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">, pszFunName);<br /></span>
										<span style="COLOR: #008080">49</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />printf(</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">函数地址：%X \n</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">, lpAddr);<br /></span>
										<span style="COLOR: #008080">50</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />n</span>
										<span style="COLOR: #000000">++</span>
										<span style="COLOR: #000000">; pThunk</span>
										<span style="COLOR: #000000">++</span>
										<span style="COLOR: #000000">;<br /></span>
										<span style="COLOR: #008080">51</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
								</span>
								<span style="COLOR: #000000">
										<br />
								</span>
								<span style="COLOR: #008080">52</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
										<br />
								</span>
								<span style="COLOR: #008080">53</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />pImportDesc</span>
								<span style="COLOR: #000000">++</span>
								<span style="COLOR: #000000">;<br /></span>
								<span style="COLOR: #008080">54</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">55</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />MessageBox(NULL,</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Test</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">,</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Test</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">,</span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">);<br /></span>
						<span style="COLOR: #008080">56</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div><img src ="http://www.cppblog.com/lapcca/aggbug/124404.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-08-23 13:22 <a href="http://www.cppblog.com/lapcca/archive/2010/08/23/124404.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hook API 简单示例</title><link>http://www.cppblog.com/lapcca/archive/2010/08/23/124400.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Mon, 23 Aug 2010 05:15:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/08/23/124400.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/124400.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/08/23/124400.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/124400.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/124400.html</trackback:ping><description><![CDATA[<p> </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">  1</span>
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">#include </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">windows.h</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">  2</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">stdio.h</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">  3</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">  4</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000"> 挂钩指定模块hMod对MessageBoxA的调用</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">  5</span>
				<span style="COLOR: #008000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">BOOL SetHook(HMODULE hMod);<br /></span>
				<span style="COLOR: #008080">  6</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000"> 定义MessageBoxA函数原型</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">  7</span>
				<span style="COLOR: #008000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">typedef </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> (WINAPI </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">PFNMESSAGEBOX)(HWND, LPCSTR, LPCSTR, UINT uType);<br /></span>
				<span style="COLOR: #008080">  8</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000"> 保存MessageBoxA函数的真实地址</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">  9</span>
				<span style="COLOR: #008000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">PROC g_orgProc </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> (PROC)MessageBoxA;<br /></span>
				<span style="COLOR: #008080"> 10</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 11</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 12</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />BOOL EnableDebugPrivilege() <br /></span>
				<span style="COLOR: #008080"> 13</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_281_795_Open_Image" onclick="this.style.display='none'; Codehighlighter1_281_795_Open_Text.style.display='none'; Codehighlighter1_281_795_Closed_Image.style.display='inline'; Codehighlighter1_281_795_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_281_795_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_281_795_Closed_Text.style.display='none'; Codehighlighter1_281_795_Open_Image.style.display='inline'; Codehighlighter1_281_795_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_281_795_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_281_795_Open_Text">
						<span style="COLOR: #000000">{ <br /></span>
						<span style="COLOR: #008080"> 14</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />BOOL fOk </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> FALSE; <br /></span>
						<span style="COLOR: #008080"> 15</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />HANDLE hToken; <br /></span>
						<span style="COLOR: #008080"> 16</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
						</span>
						<span style="COLOR: #008080"> 17</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000"> (OpenProcessToken(GetCurrentProcess(), <br /></span>
						<span style="COLOR: #008080"> 18</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />       TOKEN_ADJUST_PRIVILEGES, </span>
						<span style="COLOR: #000000">&amp;</span>
						<span style="COLOR: #000000">hToken)) <br /></span>
						<span style="COLOR: #008080"> 19</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_406_756_Open_Image" onclick="this.style.display='none'; Codehighlighter1_406_756_Open_Text.style.display='none'; Codehighlighter1_406_756_Closed_Image.style.display='inline'; Codehighlighter1_406_756_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_406_756_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_406_756_Closed_Text.style.display='none'; Codehighlighter1_406_756_Open_Image.style.display='inline'; Codehighlighter1_406_756_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
						</span>
						<span id="Codehighlighter1_406_756_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_406_756_Open_Text">
								<span style="COLOR: #000000">{ <br /></span>
								<span style="COLOR: #008080"> 20</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />       TOKEN_PRIVILEGES tp;<br /></span>
								<span style="COLOR: #008080"> 21</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />       tp.PrivilegeCount </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">; <br /></span>
								<span style="COLOR: #008080"> 22</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />       LookupPrivilegeValue(NULL, SE_DEBUG_NAME, </span>
								<span style="COLOR: #000000">&amp;</span>
								<span style="COLOR: #000000">tp.Privileges[</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">].Luid); <br /></span>
								<span style="COLOR: #008080"> 23</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />       tp.Privileges[</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">].Attributes </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> SE_PRIVILEGE_ENABLED; <br /></span>
								<span style="COLOR: #008080"> 24</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />       AdjustTokenPrivileges(hToken, FALSE, </span>
								<span style="COLOR: #000000">&amp;</span>
								<span style="COLOR: #000000">tp, </span>
								<span style="COLOR: #0000ff">sizeof</span>
								<span style="COLOR: #000000">(tp), NULL, NULL); <br /></span>
								<span style="COLOR: #008080"> 25</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />       fOk </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> (GetLastError() </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> ERROR_SUCCESS); <br /></span>
								<span style="COLOR: #008080"> 26</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />       CloseHandle(hToken); <br /></span>
								<span style="COLOR: #008080"> 27</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000"> <br /></span>
						<span style="COLOR: #008080"> 28</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> fOk; </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">提升成功返回TRUE，失败返回FALSE </span>
						<span style="COLOR: #008000">
								<br />
						</span>
						<span style="COLOR: #008080"> 29</span>
						<span style="COLOR: #008000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />
						</span>
						<span style="COLOR: #000000">}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 30</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 31</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000"> main()<br /></span>
				<span style="COLOR: #008080"> 32</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_810_984_Open_Image" onclick="this.style.display='none'; Codehighlighter1_810_984_Open_Text.style.display='none'; Codehighlighter1_810_984_Closed_Image.style.display='inline'; Codehighlighter1_810_984_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_810_984_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_810_984_Closed_Text.style.display='none'; Codehighlighter1_810_984_Open_Image.style.display='inline'; Codehighlighter1_810_984_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_810_984_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_810_984_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080"> 33</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(EnableDebugPrivilege())<br /></span>
						<span style="COLOR: #008080"> 34</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_839_981_Open_Image" onclick="this.style.display='none'; Codehighlighter1_839_981_Open_Text.style.display='none'; Codehighlighter1_839_981_Closed_Image.style.display='inline'; Codehighlighter1_839_981_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_839_981_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_839_981_Closed_Text.style.display='none'; Codehighlighter1_839_981_Open_Image.style.display='inline'; Codehighlighter1_839_981_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
						</span>
						<span id="Codehighlighter1_839_981_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_839_981_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080"> 35</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> 调用原API函数</span>
								<span style="COLOR: #008000">
										<br />
								</span>
								<span style="COLOR: #008080"> 36</span>
								<span style="COLOR: #008000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">::MessageBox(NULL, </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">原函数</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">, </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">Hook Api</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">, </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">);<br /></span>
								<span style="COLOR: #008080"> 37</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> 挂钩后再调用</span>
								<span style="COLOR: #008000">
										<br />
								</span>
								<span style="COLOR: #008080"> 38</span>
								<span style="COLOR: #008000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">SetHook(::GetModuleHandle(NULL));<br /></span>
								<span style="COLOR: #008080"> 39</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />::MessageBox(NULL, </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">原函数</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">, </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">Hook Api</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">, </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">);<br /></span>
								<span style="COLOR: #008080"> 40</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080"> 41</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
						</span>
						<span style="COLOR: #008080"> 42</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 43</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 44</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000"> 用于替换MessageBoxA的自定义函数</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 45</span>
				<span style="COLOR: #008000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> WINAPI MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)<br /></span>
				<span style="COLOR: #008080"> 46</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_1093_1179_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1093_1179_Open_Text.style.display='none'; Codehighlighter1_1093_1179_Closed_Image.style.display='inline'; Codehighlighter1_1093_1179_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_1093_1179_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1093_1179_Closed_Text.style.display='none'; Codehighlighter1_1093_1179_Open_Image.style.display='inline'; Codehighlighter1_1093_1179_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_1093_1179_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_1093_1179_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080"> 47</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> ((PFNMESSAGEBOX)g_orgProc)(hWnd, </span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Hook API Sucess!</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">, </span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">OK</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">, uType);<br /></span>
						<span style="COLOR: #008080"> 48</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">0</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080"> 49</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 50</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 51</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />BOOL SetHook(HMODULE hMod)<br /></span>
				<span style="COLOR: #008080"> 52</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_1209_2470_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1209_2470_Open_Text.style.display='none'; Codehighlighter1_1209_2470_Closed_Image.style.display='inline'; Codehighlighter1_1209_2470_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_1209_2470_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1209_2470_Closed_Text.style.display='none'; Codehighlighter1_1209_2470_Open_Image.style.display='inline'; Codehighlighter1_1209_2470_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_1209_2470_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_1209_2470_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080"> 53</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />IMAGE_DOS_HEADER</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> pDosHeader </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> (IMAGE_DOS_HEADER</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">)hMod;<br /></span>
						<span style="COLOR: #008080"> 54</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />IMAGE_OPTIONAL_HEADER </span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> pOptHeader </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080"> 55</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />(IMAGE_OPTIONAL_HEADER </span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">)((BYTE</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">)hMod </span>
						<span style="COLOR: #000000">+</span>
						<span style="COLOR: #000000"> pDosHeader</span>
						<span style="COLOR: #000000">-&gt;</span>
						<span style="COLOR: #000000">e_lfanew </span>
						<span style="COLOR: #000000">+</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">24</span>
						<span style="COLOR: #000000">);<br /></span>
						<span style="COLOR: #008080"> 56</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
						</span>
						<span style="COLOR: #008080"> 57</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />IMAGE_IMPORT_DESCRIPTOR</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> pImportDesc </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> (IMAGE_IMPORT_DESCRIPTOR</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">)<br /></span>
						<span style="COLOR: #008080"> 58</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />((BYTE</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">)hMod </span>
						<span style="COLOR: #000000">+</span>
						<span style="COLOR: #000000"> pOptHeader</span>
						<span style="COLOR: #000000">-&gt;</span>
						<span style="COLOR: #000000">DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);<br /></span>
						<span style="COLOR: #008080"> 59</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
						</span>
						<span style="COLOR: #008080"> 60</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000"> 在导入表中查找user32.dll模块。因为MessageBoxA函数从user32.dll模块导出</span>
						<span style="COLOR: #008000">
								<br />
						</span>
						<span style="COLOR: #008080"> 61</span>
						<span style="COLOR: #008000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">while</span>
						<span style="COLOR: #000000">(pImportDesc</span>
						<span style="COLOR: #000000">-&gt;</span>
						<span style="COLOR: #000000">FirstThunk)<br /></span>
						<span style="COLOR: #008080"> 62</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_1613_1747_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1613_1747_Open_Text.style.display='none'; Codehighlighter1_1613_1747_Closed_Image.style.display='inline'; Codehighlighter1_1613_1747_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_1613_1747_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1613_1747_Closed_Text.style.display='none'; Codehighlighter1_1613_1747_Open_Image.style.display='inline'; Codehighlighter1_1613_1747_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
						</span>
						<span id="Codehighlighter1_1613_1747_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_1613_1747_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080"> 63</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #0000ff">char</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000"> pszDllName </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> (</span>
								<span style="COLOR: #0000ff">char</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">)((BYTE</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">)hMod </span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000"> pImportDesc</span>
								<span style="COLOR: #000000">-&gt;</span>
								<span style="COLOR: #000000">Name);<br /></span>
								<span style="COLOR: #008080"> 64</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000">(lstrcmpiA(pszDllName, </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">user32.dll</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">) </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">)<br /></span>
								<span style="COLOR: #008080"> 65</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_1721_1730_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1721_1730_Open_Text.style.display='none'; Codehighlighter1_1721_1730_Closed_Image.style.display='inline'; Codehighlighter1_1721_1730_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_1721_1730_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1721_1730_Closed_Text.style.display='none'; Codehighlighter1_1721_1730_Open_Image.style.display='inline'; Codehighlighter1_1721_1730_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
								</span>
								<span id="Codehighlighter1_1721_1730_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.cppblog.com/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_1721_1730_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080"> 66</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #0000ff">break</span>
										<span style="COLOR: #000000">;<br /></span>
										<span style="COLOR: #008080"> 67</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
								</span>
								<span style="COLOR: #000000">
										<br />
								</span>
								<span style="COLOR: #008080"> 68</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />pImportDesc</span>
								<span style="COLOR: #000000">++</span>
								<span style="COLOR: #000000">;<br /></span>
								<span style="COLOR: #008080"> 69</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080"> 70</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
						</span>
						<span style="COLOR: #008080"> 71</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(pImportDesc</span>
						<span style="COLOR: #000000">-&gt;</span>
						<span style="COLOR: #000000">FirstThunk)<br /></span>
						<span style="COLOR: #008080"> 72</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_1778_2454_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1778_2454_Open_Text.style.display='none'; Codehighlighter1_1778_2454_Closed_Image.style.display='inline'; Codehighlighter1_1778_2454_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_1778_2454_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1778_2454_Closed_Text.style.display='none'; Codehighlighter1_1778_2454_Open_Image.style.display='inline'; Codehighlighter1_1778_2454_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
						</span>
						<span id="Codehighlighter1_1778_2454_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_1778_2454_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080"> 73</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
										<br />
								</span>
								<span style="COLOR: #008080"> 74</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> 一个IMAGE_THUNK_DATA就是一个双字，它指定了一个导入函数<br /></span>
								<span style="COLOR: #008080"> 75</span>
								<span style="COLOR: #008000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> 调入地址表其实是IMAGE_THUNK_DATA结构的数组，也就是DWORD数组</span>
								<span style="COLOR: #008000">
										<br />
								</span>
								<span style="COLOR: #008080"> 76</span>
								<span style="COLOR: #008000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">IMAGE_THUNK_DATA</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000"> pThunk </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> (IMAGE_THUNK_DATA</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">)<br /></span>
								<span style="COLOR: #008080"> 77</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />((BYTE</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">)hMod </span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000"> pImportDesc</span>
								<span style="COLOR: #000000">-&gt;</span>
								<span style="COLOR: #000000">FirstThunk);<br /></span>
								<span style="COLOR: #008080"> 78</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #0000ff">while</span>
								<span style="COLOR: #000000">(pThunk</span>
								<span style="COLOR: #000000">-&gt;</span>
								<span style="COLOR: #000000">u1.Function)<br /></span>
								<span style="COLOR: #008080"> 79</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_1979_2452_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1979_2452_Open_Text.style.display='none'; Codehighlighter1_1979_2452_Closed_Image.style.display='inline'; Codehighlighter1_1979_2452_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_1979_2452_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1979_2452_Closed_Text.style.display='none'; Codehighlighter1_1979_2452_Open_Image.style.display='inline'; Codehighlighter1_1979_2452_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
								</span>
								<span id="Codehighlighter1_1979_2452_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.cppblog.com/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_1979_2452_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080"> 80</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000"> lpAddr指向的内存保存了函数的地址</span>
										<span style="COLOR: #008000">
												<br />
										</span>
										<span style="COLOR: #008080"> 81</span>
										<span style="COLOR: #008000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">DWORD</span>
										<span style="COLOR: #000000">*</span>
										<span style="COLOR: #000000"> lpAddr </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> (DWORD</span>
										<span style="COLOR: #000000">*</span>
										<span style="COLOR: #000000">)</span>
										<span style="COLOR: #000000">&amp;</span>
										<span style="COLOR: #000000">(pThunk</span>
										<span style="COLOR: #000000">-&gt;</span>
										<span style="COLOR: #000000">u1.Function);<br /></span>
										<span style="COLOR: #008080"> 82</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #0000ff">if</span>
										<span style="COLOR: #000000">(</span>
										<span style="COLOR: #000000">*</span>
										<span style="COLOR: #000000">lpAddr </span>
										<span style="COLOR: #000000">==</span>
										<span style="COLOR: #000000"> (DWORD)g_orgProc)<br /></span>
										<span style="COLOR: #008080"> 83</span>
										<span style="COLOR: #000000">
												<img id="Codehighlighter1_2084_2440_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2084_2440_Open_Text.style.display='none'; Codehighlighter1_2084_2440_Closed_Image.style.display='inline'; Codehighlighter1_2084_2440_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
												<img id="Codehighlighter1_2084_2440_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2084_2440_Closed_Text.style.display='none'; Codehighlighter1_2084_2440_Open_Image.style.display='inline'; Codehighlighter1_2084_2440_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
										</span>
										<span id="Codehighlighter1_2084_2440_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
												<img src="http://www.cppblog.com/images/dot.gif" />
										</span>
										<span id="Codehighlighter1_2084_2440_Open_Text">
												<span style="COLOR: #000000">{ <br /></span>
												<span style="COLOR: #008080"> 84</span>
												<span style="COLOR: #000000">
														<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />DWORD oldProc;<br /></span>
												<span style="COLOR: #008080"> 85</span>
												<span style="COLOR: #000000">
														<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />BOOL VirSu</span>
												<span style="COLOR: #000000">=</span>
												<span style="COLOR: #000000">VirtualProtect(lpAddr,</span>
												<span style="COLOR: #0000ff">sizeof</span>
												<span style="COLOR: #000000">(DWORD),PAGE_READWRITE,</span>
												<span style="COLOR: #000000">&amp;</span>
												<span style="COLOR: #000000">oldProc);<br /></span>
												<span style="COLOR: #008080"> 86</span>
												<span style="COLOR: #000000">
														<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
												</span>
												<span style="COLOR: #0000ff">if</span>
												<span style="COLOR: #000000">(VirSu</span>
												<span style="COLOR: #000000">==</span>
												<span style="COLOR: #000000">TRUE)<br /></span>
												<span style="COLOR: #008080"> 87</span>
												<span style="COLOR: #000000">
														<img id="Codehighlighter1_2191_2383_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2191_2383_Open_Text.style.display='none'; Codehighlighter1_2191_2383_Closed_Image.style.display='inline'; Codehighlighter1_2191_2383_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
														<img id="Codehighlighter1_2191_2383_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2191_2383_Closed_Text.style.display='none'; Codehighlighter1_2191_2383_Open_Image.style.display='inline'; Codehighlighter1_2191_2383_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
												</span>
												<span id="Codehighlighter1_2191_2383_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
														<img src="http://www.cppblog.com/images/dot.gif" />
												</span>
												<span id="Codehighlighter1_2191_2383_Open_Text">
														<span style="COLOR: #000000">{<br /></span>
														<span style="COLOR: #008080"> 88</span>
														<span style="COLOR: #000000">
																<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
														</span>
														<span style="COLOR: #008000">//</span>
														<span style="COLOR: #008000"> 修改IAT表项，使其指向我们自定义的函数，相当于“*lpAddr = (DWORD)MyMessageBoxA;”</span>
														<span style="COLOR: #008000">
																<br />
														</span>
														<span style="COLOR: #008080"> 89</span>
														<span style="COLOR: #008000">
																<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
														</span>
														<span style="COLOR: #000000">DWORD</span>
														<span style="COLOR: #000000">*</span>
														<span style="COLOR: #000000"> lpNewProc </span>
														<span style="COLOR: #000000">=</span>
														<span style="COLOR: #000000"> (DWORD</span>
														<span style="COLOR: #000000">*</span>
														<span style="COLOR: #000000">)MyMessageBoxA;<br /></span>
														<span style="COLOR: #008080"> 90</span>
														<span style="COLOR: #000000">
																<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />::WriteProcessMemory(::GetCurrentProcess(), <br /></span>
														<span style="COLOR: #008080"> 91</span>
														<span style="COLOR: #000000">
																<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />lpAddr, </span>
														<span style="COLOR: #000000">&amp;</span>
														<span style="COLOR: #000000">lpNewProc, </span>
														<span style="COLOR: #0000ff">sizeof</span>
														<span style="COLOR: #000000">(DWORD), NULL);<br /></span>
														<span style="COLOR: #008080"> 92</span>
														<span style="COLOR: #000000">
																<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
												</span>
												<span style="COLOR: #000000">
														<br />
												</span>
												<span style="COLOR: #008080"> 93</span>
												<span style="COLOR: #000000">
														<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
												</span>
												<span style="COLOR: #0000ff">else</span>
												<span style="COLOR: #000000">
														<br />
												</span>
												<span style="COLOR: #008080"> 94</span>
												<span style="COLOR: #000000">
														<img id="Codehighlighter1_2390_2425_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2390_2425_Open_Text.style.display='none'; Codehighlighter1_2390_2425_Closed_Image.style.display='inline'; Codehighlighter1_2390_2425_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
														<img id="Codehighlighter1_2390_2425_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2390_2425_Closed_Text.style.display='none'; Codehighlighter1_2390_2425_Open_Image.style.display='inline'; Codehighlighter1_2390_2425_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
												</span>
												<span id="Codehighlighter1_2390_2425_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
														<img src="http://www.cppblog.com/images/dot.gif" />
												</span>
												<span id="Codehighlighter1_2390_2425_Open_Text">
														<span style="COLOR: #000000">{<br /></span>
														<span style="COLOR: #008080"> 95</span>
														<span style="COLOR: #000000">
																<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />MessageBox(NULL,</span>
														<span style="COLOR: #000000">"</span>
														<span style="COLOR: #000000">Error!</span>
														<span style="COLOR: #000000">"</span>
														<span style="COLOR: #000000">,</span>
														<span style="COLOR: #000000">"</span>
														<span style="COLOR: #000000">a</span>
														<span style="COLOR: #000000">"</span>
														<span style="COLOR: #000000">,</span>
														<span style="COLOR: #000000">0</span>
														<span style="COLOR: #000000">);<br /></span>
														<span style="COLOR: #008080"> 96</span>
														<span style="COLOR: #000000">
																<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
												</span>
												<span style="COLOR: #000000">
														<br />
												</span>
												<span style="COLOR: #008080"> 97</span>
												<span style="COLOR: #000000">
														<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
												</span>
												<span style="COLOR: #0000ff">return</span>
												<span style="COLOR: #000000"> TRUE;<br /></span>
												<span style="COLOR: #008080"> 98</span>
												<span style="COLOR: #000000">
														<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
										</span>
										<span style="COLOR: #000000">
												<br />
										</span>
										<span style="COLOR: #008080"> 99</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />pThunk</span>
										<span style="COLOR: #000000">++</span>
										<span style="COLOR: #000000">;<br /></span>
										<span style="COLOR: #008080">100</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
								</span>
								<span style="COLOR: #000000">
										<br />
								</span>
								<span style="COLOR: #008080">101</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">102</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> FALSE;<br /></span>
						<span style="COLOR: #008080">103</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
		<p> </p>
		<p>
		</p>
		<p>有个郁闷的问题，在2003sp1下，不管是提升进程权限还是修改内存包含属性都成功！debug版本能成功！release就他娘的死不成功！郁闷死，遍寻高手无着落，暂时等着先。。。</p><img src ="http://www.cppblog.com/lapcca/aggbug/124400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-08-23 13:15 <a href="http://www.cppblog.com/lapcca/archive/2010/08/23/124400.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GINA.dll 各函数介绍</title><link>http://www.cppblog.com/lapcca/archive/2010/06/18/118184.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Fri, 18 Jun 2010 09:58:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/06/18/118184.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/118184.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/06/18/118184.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/118184.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/118184.html</trackback:ping><description><![CDATA[首先介绍一下Winlogon。Windows 2000/NT有三种系统状态：没有用户登录状态、用户成功登录状态以及工作站锁定状态。Winlogon是Windows 2000/NT操作系统提供交互式登录支持的组件。Winlogon有三个组成部分：可执行文件winlogon.exe，提供图形界面认证功能的动态库 Gina Dll，以及一些网络服务提供动态库Network Provider Dll。 <br /><br />   <br /><br /><clk></clk>winlogon.exe处理一些下层导出的接口函数，而认证策略是在Gina Dll中是<nobr style="COLOR: rgb(102,0,255); BORDER-BOTTOM: rgb(102,0,255) 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" target="_blank">独立</nobr>设 计的。在系统启动时，Gina Dll被winlogon.exe装载。Microsoft提供了一个默认的Gina Dll——Winnt\system32\msgina.dll，提供了标准的用户名、密码认证模式。Gina Dll是可替换的，用户可以设计自己的Gina Dll，以提供其他如智能卡、视网膜、指纹或其他一些认证机制。 <br />开发自定义的Gina Dll。必须实现并导出与winlogon.exe交互的18个标准函数接口： <br />l BOOL WINAPI WlxNegotiate(DWORD dwWinLogonVersion, PDWORD pdwDllVersion) <br />// Winlogon.exe调用的gina dll中的第一个函数 <br />// 使gina dll确认是否支持当前版本的Winlogon.exe <br />// 传递给winlogon.exe需要那个版本的接口函数 <br />l BOOL WINAPI WlxInitialize(LPWSTR lpWinsta, <br />HANDLE hWlx, <br />PVOID pvReserved, <br />PVOID pWinlogonFunctions, <br />PVOID * pWlxContext <br />) <br />// 初始化，winlogon.exe向gina dll传递需要版本的接口函数分配表 <br />l BOOL WINAPI WlxActivateUserShell(PVOID pWlxContext, <br />PWSTR pszDesktopName, <br />PWSTR pszMprLogonScript, <br />PVOID pEnvironment) <br />// 用户登陆成功后，Winlogon.exe调用该函数启动用户外壳程序 <br />l VOID WINAPI WlxDisplayLockedNotice(PVOID pWlxContext) <br />// 当系统处于锁定状态时，Winlogon.exe调用该函数 <br />// 显示一些信息，如锁定者、锁定时间等 <br />l VOID WINAPI WlxDisplaySASNotice(PVOID pWlxContext) <br />// 当没有任何用户登陆时，Winlogon.exe调用该函数显示一些提示信息 <br />// 可以根据用户的动作模拟SAS事件的发送 <br />l BOOL WINAPI WlxDisplayStatusMessage(PVOID pWlxContext, <br />HDESK hDesktop, <br />DWORD dwOptions, <br />PWSTR pTitle, <br />PWSTR pMessage) <br />// 当gina dll要显示一些信息时，Winlogon.exe调用该函数 <br />// 直接返回TRUE表示信息已经显示 <br />l BOOL WINAPI WlxGetStatusMessage(PVOID pWlxContext, <br />DWORD *pdwOptions, <br />PWSTR pMessage, <br />DWORD dwBufferSize) <br />// Winlogon.exe调用该函数得到gina dll显示的状态信息 <br />// 直接返回TRUE表示信息已经接收 <br />l BOOL WINAPI WlxIsLockOk(PVOID pWlxContext) <br />// 在试图锁定工作站之前Winlogon.exe调用该函数，判断是否可以锁定 <br />// 直接返回FALSE表示不能锁定 <br />l BOOL WINAPI WlxIsLogoffOk(PVOID pWlxContext) <br />// 在试图注销时Winlogon.exe调用该函数，判断能否注销 <br />// 直接返回FALSE表示不能注销 <br />l int WINAPI WlxLoggedOnSAS(PVOID pWlxContext, <br />DWORD dwSasType, <br />PVOID pReserved) <br />// 当系统处于登陆成功，没有锁定的状态下 <br />// Winlogon接收到SAS事件，于是调用该函数 <br />// 现屏蔽所有事件，直接返回 <br />l int WINAPI WlxLoggedOutSAS(PVOID pWlxContext, <br />DWORD dwSasType, <br />PLUID pAuthenticationId, <br />PSID pLogonSid, <br />PDWORD pdwOptions, <br />PHANDLE phToken, <br />PWLX_MPR_NOTIFY_INFO pMprNotifyInfo, <br />PVOID * pProfile) <br />// 在没有任何一个用户登陆的情况下，Winlogon.exe接收到SAS事件调//用该函数 <br />l VOID WINAPI WlxLogoff(PVOID pWlxContext) <br />// Winlogon.exe调用该函数，通知gina dll用户注销操作 <br />// 允许gina dll做出相应的处理 <br />l BOOL WINAPI WlxNetworkProviderLoad(PVOID pWlxContext, <br />PWLX_MPR_NOTIFY_INFO pNprNotifyInfo) <br />// Winlogon.exe调用该函数收集有效的认证信息 <br />// 返回TRUE表示用户被识别 <br />l BOOL WINAPI WlxRemoveStatusMessage(PVOID pWlxContext) <br />// Winlogon.exe调用该函数，告诉gina dll停止显示状态信息 <br />// 直接返回TRUE表示信息已经删除 <br />l BOOL WINAPI WlxScreenSaverNotify(PVOID pWlxContext, BOOL *pSecure) <br />// 在屏保程序启动前一瞬Winlogon.exe调用该函数，允许gina dll同屏 <br />//保程序交互 <br />// 返回FALSE表示屏保程序不能启动 <br />l VOID WINAPI WlxShutdown(PVOID pWlxContext, DWORD ShutdownType) <br />// 在系统关闭之前，Winlogon.exe调用该函数 <br />// 允许gina dll处理一些系统关闭前的处理 <br />l BOOL WINAPI WlxStartApplication(PVOID pWlxContext, <br />PWSTR pszDesktopName, <br />PVOID pEnvironment, <br />PWSTR pszCmdLine) <br />// 当系统要求在用户上下文中启动程序，Winlogon.exe调用该函数 <br />// 这种情况发生在：浏览器非正常关闭需要重启或需要启动扩展的任务// 管理器 <br />// 该接口gina dll可以选择性实现 <br />l int WINAPI WlxWkstaLockedSAS(PVOID pWlxContext, DWORD dwSasType) <br />// 在锁定状态下，Winlogon.exe接收到SAS事件调用该函数 <br /><br />其中WlxNegotiate是winlogon.exe调用的第一个接口函数，进行必要的版本判断，随后调用的是WlxInitialize，主要完成 winlogon.exe特定版本的函数分派表向Gina Dll的传递。最主要的是WlxLoggedOnSAS函数，这个函数主要的功能是，当winlogon在登录成功状态下，接收到SAS事件，于是调用这 个函数进行SAS事件的识别以及进行各事件的相应处理。 <br /><clk></clk>由于现在只需屏蔽按下Ctrl+Alt+Del时系统不再弹出“Widows<nobr style="COLOR: rgb(102,0,255); BORDER-BOTTOM: rgb(102,0,255) 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" target="_blank">安全</nobr>”对话框。并不需要改变用户名、密码这种标准的认证模式，所以可以仍然使用msgina.dll中导出的函数接口，而对WlxLoggedOnSAS函数的实现进行必要的改变。 <br />int WINAPI WlxLoggedOnSAS(PVOID pWlxContext, <br />DWORD dwSasType, <br />PVOID pReserved) <br />{ <br />if(bLock) //如果处于锁定状态，现屏蔽所有事件，直接返回 <br />return WLX_SAS_ACTION_NONE; <br />else <br />return theApp.MyWlxLoggedOnSAS(pWlxContext, dwSasType, pReserved); <br />//MyWlxLoggedOnSAS为默认gina dll(msgina dll)中的WlxLoggedOnSAS <br />} <br />自定义Gina Dll的使用。比如开发的Gina Dll文件名为MyGina.dll。将该文件放到以下路径：Winnt\system32。并修改注册表，如下： <br />Key Name: \HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ Winlogon <br />Value Name: GinaDLL <br />Value Type: [REG_SZ] <br />Value: MyGina.dll <br />重新启动计算机MyGina.dll即投入使用。<img src ="http://www.cppblog.com/lapcca/aggbug/118184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-06-18 17:58 <a href="http://www.cppblog.com/lapcca/archive/2010/06/18/118184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>堆和栈的区别</title><link>http://www.cppblog.com/lapcca/archive/2010/06/10/117528.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Thu, 10 Jun 2010 01:38:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/06/10/117528.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/117528.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/06/10/117528.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/117528.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/117528.html</trackback:ping><description><![CDATA[<p>一、预备知识—程序的内存分配  <br />  一个由C/C++编译的程序占用的内存分为以下几个部分  <br />  1、栈区（stack）—   由编译器自动分配释放   ，存放函数的参数值，局部变量的值等。其  <br />  操作方式类似于数据结构中的栈。  <br />  2、堆区（heap）   —   一般由程序员分配释放，   若程序员不释放，程序结束时可能由OS回  <br />  收   。注意它与数据结构中的堆是两回事，分配方式倒是类似于链表，呵呵。  <br />  3、全局区（静态区）（static）—，全局变量和静态变量的存储是放在一块的，初始化的  <br />  全局变量和静态变量在一块区域，   未初始化的全局变量和未初始化的静态变量在相邻的另  <br />  一块区域。   -   程序结束后由系统释放。  <br />  4、文字常量区   —常量字符串就是放在这里的。   程序结束后由系统释放  <br />  5、程序代码区—存放函数体的二进制代码。  <br />   <br />   <br />  二、例子程序    <br />  这是一个前辈写的，非常详细    <br />  //main.cpp    <br />  int   a   =   0;   全局初始化区    <br />  char   *p1;   全局未初始化区    <br />  main()    <br />  {    <br />  int   b;   栈    <br />  char   s[]   =   "abc";   栈    <br />  char   *p2;   栈    <br />  char   *p3   =   "123456";   123456\0在常量区，p3在栈上。    <br />  static   int   c   =0；   全局（静态）初始化区    <br />  p1   =   (char   *)malloc(10);    <br />  p2   =   (char   *)malloc(20);    <br />  分配得来得10和20字节的区域就在堆区。    <br />  strcpy(p1,   "123456");   123456\0放在常量区，编译器可能会将它与p3所指向的"123456"  <br />  优化成一个地方。    <br />  }    <br />   <br />   <br />  二、堆和栈的理论知识    <br />  2.1申请方式    <br />  stack:    <br />  由系统自动分配。   例如，声明在函数中一个局部变量   int   b;   系统自动在栈中为b开辟空  <br />  间    <br />  heap:    <br />  需要程序员自己申请，并指明大小，在c中malloc函数    <br />  如p1   =   (char   *)malloc(10);    <br />  在C++中用new运算符    <br />  如p2   =   new   char[10];    <br />  但是注意p1、p2本身是在栈中的。    <br />   <br />   <br />  2.2    <br />  申请后系统的响应    <br />  栈：只要栈的剩余空间大于所申请空间，系统将为程序提供内存，否则将报异常提示栈溢  <br />  出。    <br />  堆：首先应该知道操作系统有一个记录空闲内存地址的链表，当系统收到程序的申请时，  <br />  会遍历该链表，寻找第一个空间大于所申请空间的堆结点，然后将该结点从空闲结点链表  <br />  中删除，并将该结点的空间分配给程序，另外，对于大多数系统，会在这块内存空间中的  <br />  首地址处记录本次分配的大小，这样，代码中的delete语句才能正确的释放本内存空间。  <br />  另外，由于找到的堆结点的大小不一定正好等于申请的大小，系统会自动的将多余的那部  <br />  分重新放入空闲链表中。    <br />   <br />  2.3申请大小的限制    <br />  栈：在Windows下,栈是向低地址扩展的数据结构，是一块连续的内存的区域。这句话的意  <br />  思是栈顶的地址和栈的最大容量是系统预先规定好的，在WINDOWS下，栈的大小是2M（也有  <br />  的说是1M，总之是一个编译时就确定的常数），如果申请的空间超过栈的剩余空间时，将  <br />  提示overflow。因此，能从栈获得的空间较小。    <br />  堆：堆是向高地址扩展的数据结构，是不连续的内存区域。这是由于系统是用链表来存储  <br />  的空闲内存地址的，自然是不连续的，而链表的遍历方向是由低地址向高地址。堆的大小  <br />  受限于计算机系统中有效的虚拟内存。由此可见，堆获得的空间比较灵活，也比较大。    <br />   <br />   <br />   <br />  2.4申请效率的比较：    <br />  栈由系统自动分配，速度较快。但程序员是无法控制的。    <br />  堆是由new分配的内存，一般速度比较慢，而且容易产生内存碎片,不过用起来最方便.    <br />  另外，在WINDOWS下，最好的方式是用VirtualAlloc分配内存，他不是在堆，也不是在栈是  <br />  直接在进程的地址空间中保留一块内存，虽然用起来最不方便。但是速度快，也最灵活。  <br />     <br />   <br />  2.5堆和栈中的存储内容    <br />  栈：   在函数调用时，第一个进栈的是主函数中后的下一条指令（函数调用语句的下一条可  <br />  执行语句）的地址，然后是函数的各个参数，在大多数的C编译器中，参数是由右往左入栈  <br />  的，然后是函数中的局部变量。注意静态变量是不入栈的。    <br />  当本次函数调用结束后，局部变量先出栈，然后是参数，最后栈顶指针指向最开始存的地  <br />  址，也就是主函数中的下一条指令，程序由该点继续运行。    <br />  堆：一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。    <br />   <br />  2.6存取效率的比较    <br />   <br />  char   s1[]   =   "aaaaaaaaaaaaaaa";    <br />  char   *s2   =   "bbbbbbbbbbbbbbbbb";    <br />  aaaaaaaaaaa是在运行时刻赋值的；    <br />  而bbbbbbbbbbb是在编译时就确定的；    <br />  但是，在以后的存取中，在栈上的数组比指针所指向的字符串(例如堆)快。    <br />  比如：    <br />  #include    <br />  void   main()    <br />  {    <br />  char   a   =   1;    <br />  char   c[]   =   "1234567890";    <br />  char   *p   ="1234567890";    <br />  a   =   c[1];    <br />  a   =   p[1];    <br />  return;    <br />  }    <br />  对应的汇编代码    <br />  10:   a   =   c[1];    <br />  00401067   8A   4D   F1   mov   cl,byte   ptr   [ebp-0Fh]    <br />  0040106A   88   4D   FC   mov   byte   ptr   [ebp-4],cl    <br />  11:   a   =   p[1];    <br />  0040106D   8B   55   EC   mov   edx,dword   ptr   [ebp-14h]    <br />  00401070   8A   42   01   mov   al,byte   ptr   [edx+1]    <br />  00401073   88   45   FC   mov   byte   ptr   [ebp-4],al    <br />  第一种在读取时直接就把字符串中的元素读到寄存器cl中，而第二种则要先把指针值读到  <br />  edx中，再根据edx读取字符，显然慢了。    <br />   <br />   <br />  2.7小结：    <br />  堆和栈的区别可以用如下的比喻来看出：    <br />  使用栈就象我们去饭馆里吃饭，只管点菜（发出申请）、付钱、和吃（使用），吃饱了就  <br />  走，不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作，他的好处是快捷，但是自  <br />  由度小。    <br />  使用堆就象是自己动手做喜欢吃的菜肴，比较麻烦，但是比较符合自己的口味，而且自由  <br />  度大。   (经典！)  </p>
		<p>
				<br />
				<a href="http://blog.csdn.net/hairetz/archive/2009/04/30/4141043.aspx">
				</a> </p>
		<hr />
 在bbs上，堆与栈的区分问题，似乎是一个永恒的话题，由此可见，初学者对此往往是混淆不清的，所以我决定拿他第一个开刀。<br />      首先，我们举一个例子：<br />      void f() { int* p=new int[5]; } <br />      这条短短的一句话就包含了堆与栈，看到new，我们首先就应该想到，我们分配了一块堆内存，那么指针p呢？他分配的是一块栈内存，所以这句话的意思就是：在栈内存中存放了一个指向一块堆内存的指针p。在程序会先确定在堆中分配内存的大小，然后调用operator new分配内存，然后返回这块内存的首地址，放入栈中，他在VC6下的汇编代码如下：<br />      00401028     push          14h<br />      0040102A     call          operator new (00401060)<br />      0040102F     add           esp,4<br />      00401032     mov           dword ptr [ebp-8],eax<br />      00401035     mov           eax,dword ptr [ebp-8]<br />      00401038     mov           dword ptr [ebp-4],eax<br />      这里，我们为了简单并没有释放内存，那么该怎么去释放呢？是delete p么？澳，错了，应该是delete []p，这是为了告诉编译器：我删除的是一个数组，VC6就会根据相应的Cookie信息去进行释放内存的工作。<br />      好了，我们回到我们的主题：堆和栈究竟有什么区别？ <br />      主要的区别由以下几点：<br />      1、管理方式不同；<br />      2、空间大小不同；<br />      3、能否产生碎片不同；<br />      4、生长方向不同；<br />      5、分配方式不同；<br />      6、分配效率不同；<br />      管理方式：对于栈来讲，是由编译器自动管理，无需我们手工控制；对于堆来说，释放工作由程序员控制，容易产生memory leak。<br />      空间大小：一般来讲在32位系统下，堆内存可以达到4G的空间，从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲，一般都是有一定的空间大小的，例如，在VC6下面，默认的栈空间大小是1M（好像是，记不清楚了）。当然，我们可以修改：    <br />      打开工程，依次操作菜单如下：Project-&gt;Setting-&gt;Link，在Category 中选中Output，然后在Reserve中设定堆栈的最大值和commit。<br />注意：reserve最小值为4Byte；commit是保留在虚拟内存的页文件里面，它设置的较大会使栈开辟较大的值，可能增加内存的开销和启动时间。<br />      碎片问题：对于堆来讲，频繁的new/delete势必会造成内存空间的不连续，从而造成大量的碎片，使程序效率降低。对于栈来讲，则不会存在这个问题，因为栈是先进后出的队列，他们是如此的一一对应，以至于永远都不可能有一个内存块从栈中间弹出，在他弹出之前，在他上面的后进的栈内容已经被弹出，详细的可以参考数据结构，这里我们就不再一一讨论了。<br />      生长方向：对于堆来讲，生长方向是向上的，也就是向着内存地址增加的方向；对于栈来讲，它的生长方向是向下的，是向着内存地址减小的方向增长。<br />      分配方式：堆都是动态分配的，没有静态分配的堆。栈有2种分配方式：静态分配和动态分配。静态分配是编译器完成的，比如局部变量的分配。动态分配由alloca函数进行分配，但是栈的动态分配和堆是不同的，他的动态分配是由编译器进行释放，无需我们手工实现。<br />      分配效率：栈是机器系统提供的数据结构，计算机会在底层对栈提供支持：分配专门的寄存器存放栈的地址，压栈出栈都有专门的指令执行，这就决定了栈的效率比较高。堆则是C/C++函数库提供的，它的机制是很复杂的，例如为了分配一块内存，库函数会按照一定的算法（具体的算法可以参考数据结构/操作系统）在堆内存中搜索可用的足够大小的空间，如果没有足够大小的空间（可能是由于内存碎片太多），就有可能调用系统功能去增加程序数据段的内存空间，这样就有机会分到足够大小的内存，然后进行返回。显然，堆的效率比栈要低得多。<br />      从这里我们可以看到，堆和栈相比，由于大量new/delete的使用，容易造成大量的内存碎片；由于没有专门的系统支持，效率很低；由于可能引发用户态和核心态的切换，内存的申请，代价变得更加昂贵。所以栈在程序中是应用最广泛的，就算是函数的调用也利用栈去完成，函数调用过程中的参数，返回地址，EBP和局部变量都采用栈的方式存放。所以，我们推荐大家尽量用栈，而不是用堆。<br />      虽然栈有如此众多的好处，但是由于和堆相比不是那么灵活，有时候分配大量的内存空间，还是用堆好一些。<br />      无论是堆还是栈，都要防止越界现象的发生（除非你是故意使其越界），因为越界的结果要么是程序崩溃，要么是摧毁程序的堆、栈结构，产生以想不到的结果,就算是在你的程序运行过程中，没有发生上面的问题，你还是要小心，说不定什么时候就崩掉，那时候debug可是相当困难的：）<br />      对了，还有一件事，如果有人把堆栈合起来说，那它的意思是栈，可不是堆，呵呵，清楚了？<br /><img src ="http://www.cppblog.com/lapcca/aggbug/117528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-06-10 09:38 <a href="http://www.cppblog.com/lapcca/archive/2010/06/10/117528.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>进程间通信</title><link>http://www.cppblog.com/lapcca/archive/2010/06/10/117526.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Thu, 10 Jun 2010 01:27:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/06/10/117526.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/117526.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/06/10/117526.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/117526.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/117526.html</trackback:ping><description><![CDATA[<p>
				<font size="2">摘 要 随着人们对应用程序的要求越来越高，单进程应用在许多场合已不能满足人们的要求。编写多进程/多线程程序成为现代程序设计的一个重要特点，在多进程程序设计中，进程间的通信是不可避免的。Microsoft Win32 API提供了多种进程间通信的方法，全面地阐述了这些方法的特点，并加以比较和分析，希望能给读者选择通信方法提供参考。</font>
		</p>
		<p>
				<br />1 进程与进程通信 </p>
		<p>　　进程是装入内存并准备执行的程序，每个进程都有私有的虚拟地址空间，由代码、数据以及它可利用的系统资源(如文件、管道等)组成。多进程/多线程是Windows操作系统的一个基本特征。Microsoft Win32应用编程接口(Application Programming Interface, API)提供了大量支持应用程序间数据共享和交换的机制，这些机制行使的活动称为进程间通信(InterProcess Communication, IPC)，进程通信就是指不同进程间进行数据共享和数据交换。<br />　　正因为使用Win32 API进行进程通信方式有多种，如何选择恰当的通信方式就成为应用开发中的一个重要问题，下面本文将对Win32中进程通信的几种方法加以分析和比较。 </p>
		<p>2 进程通信方法 </p>
		<p>2.1 文件映射<br />　　文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待。因此，进程不必使用文件I/O操作，只需简单的指针操作就可读取和修改文件的内容。<br />　　Win32 API允许多个进程访问同一文件映射对象，各个进程在它自己的地址空间里接收内存的指针。通过使用这些指针，不同进程就可以读或修改文件的内容，实现了对文件中数据的共享。<br />　　应用程序有三种方法来使多个进程共享一个文件映射对象。<br />　　(1)继承：第一个进程建立文件映射对象，它的子进程继承该对象的句柄。<br />　　(2)命名文件映射：第一个进程在建立文件映射对象时可以给该对象指定一个名字(可与文件名不同)。第二个进程可通过这个名字打开此文件映射对象。另外，第一个进程也可以通过一些其它IPC机制(有名管道、邮件槽等)把名字传给第二个进程。<br />　　(3)句柄复制：第一个进程建立文件映射对象，然后通过其它IPC机制(有名管道、邮件槽等)把对象句柄传递给第二个进程。第二个进程复制该句柄就取得对该文件映射对象的访问权限。<br />　　文件映射是在多个进程间共享数据的非常有效方法，有较好的安全性。但文件映射只能用于本地机器的进程之间，不能用于网络中，而开发者还必须控制进程间的同步。<br />2.2 共享内存<br />　　Win32 API中共享内存(Shared Memory)实际就是文件映射的一种特殊情况。进程在创建文件映射对象时用0xFFFFFFFF来代替文件句柄(HANDLE)，就表示了对应的文件映射对象是从操作系统页面文件访问内存，其它进程打开该文件映射对象就可以访问该内存块。由于共享内存是用文件映射实现的，所以它也有较好的安全性，也只能运行于同一计算机上的进程之间。<br />2.3 匿名管道<br />　　管道(Pipe)是一种具有两个端点的通信通道：有一端句柄的进程可以和有另一端句柄的进程通信。管道可以是单向－一端是只读的，另一端点是只写的；也可以是双向的一管道的两端点既可读也可写。<br />　　匿名管道(Anonymous Pipe)是 在父进程和子进程之间，或同一父进程的两个子进程之间传输数据的无名字的单向管道。通常由父进程创建管道，然后由要通信的子进程继承通道的读端点句柄或写 端点句柄，然后实现通信。父进程还可以建立两个或更多个继承匿名管道读和写句柄的子进程。这些子进程可以使用管道直接通信，不需要通过父进程。<br />　　匿名管道是单机上实现子进程标准I/O重定向的有效方法，它不能在网上使用，也不能用于两个不相关的进程之间。<br />2.4 命名管道<br />　　命名管道(Named Pipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是命名管道可以在不相关的进程之间和不同计算机之间使用，服务器建立命名管道时给它指定一个名字，任何进程都可以通过该名字打开管道的另一端，根据给定的权限和服务器进程通信。<br />　　命名管道提供了相对简单的编程接口，使通过网络传输数据并不比同一计算机上两进程之间通信更困难，不过如果要同时和多个进程通信它就力不从心了。<br />2.5 邮件槽<br />　　邮件槽(Mailslots)提 供进程间单向通信能力，任何进程都能建立邮件槽成为邮件槽服务器。其它进程，称为邮件槽客户，可以通过邮件槽的名字给邮件槽服务器进程发送消息。进来的消 息一直放在邮件槽中，直到服务器进程读取它为止。一个进程既可以是邮件槽服务器也可以是邮件槽客户，因此可建立多个邮件槽实现进程间的双向通信。<br />　　通过邮件槽可以给本地计算机上的邮件槽、其它计算机上的邮件槽或指定网络区域中所有计算机上有同样名字的邮件槽发送消息。广播通信的消息长度不能超过400字节，非广播消息的长度则受邮件槽服务器指定的最大消息长度的限制。<br />　　邮件槽与命名管道相似，不过它传输数据是通过不可靠的数据报(如TCP/IP协议中的UDP包)完成的，一旦网络发生错误则无法保证消息正确地接收，而命名管道传输数据则是建立在可靠连接基础上的。不过邮件槽有简化的编程接口和给指定网络区域内的所有计算机广播消息的能力，所以邮件槽不失为应用程序发送和接收消息的另一种选择。<br />2.6 剪贴板<br />　　剪贴板(Clipped Board)实质是Win32 API中一组用来传输数据的函数和消息，为Windows应用程序之间进行数据共享提供了一个中介，Windows已建立的剪切(复制)－粘贴的机制为不同应用程序之间共享不同格式数据提供了一条捷径。当用户在应用程序中执行剪切或复制操作时，应用程序把选取的数据用一种或多种格式放在剪贴板上。然后任何其它应用程序都可以从剪贴板上拾取数据，从给定格式中选择适合自己的格式。<br />　　剪贴板是一个非常松散的交换媒介，可以支持任何数据格式，每一格式由一无符号整数标识，对标准(预定义)剪贴板格式，该值是Win32 API定义的常量；对非标准格式可以使用Register Clipboard Format函数注册为新的剪贴板格式。利用剪贴板进行交换的数据只需在数据格式上一致或都可以转化为某种格式就行。但剪贴板只能在基于Windows的程序中使用，不能在网络上使用。<br />2.7 动态数据交换<br />　　动态数据交换(DDE)是使用共享内存在应用程序之间进行数据交换的一种进程间通信形式。应用程序可以使用DDE进行一次性数据传输，也可以当出现新数据时，通过发送更新值在应用程序间动态交换数据。<br />　　DDE和剪贴板一样既支持标准数据格式(如文本、位图等)，又可以支持自己定义的数据格式。但它们的数据传输机制却不同，一个明显区别是剪贴板操作几乎总是用作对用户指定操作的一次性应答－如从菜单中选择Paste命令。尽管DDE也可以由用户启动，但它继续发挥作用一般不必用户进一步干预。DDE有三种数据交换方式：<br />　　(1) 冷链：数据交换是一次性数据传输，与剪贴板相同。<br />　　(2) 温链：当数据交换时服务器通知客户，然后客户必须请求新的数据。<br />　　(3) 热链：当数据交换时服务器自动给客户发送数据。<br />　　DDE交换可以发生在单机或网络中不同计算机的应用程序之间。开发者还可以定义定制的DDE数据格式进行应用程序之间特别目的IPC，它们有更紧密耦合的通信要求。大多数基于Windows的应用程序都支持DDE。<br />2.8 对象连接与嵌入<br />　　应用程序利用对象连接与嵌入(OLE)技术管理复合文档(由多种数据格式组成的文档)，OLE提供使某应用程序更容易调用其它应用程序进行数据编辑的服务。例如，OLE支持的字处理器可以嵌套电子表格，当用户要编辑电子表格时OLE库可自动启动电子表格编辑器。当用户退出电子表格编辑器时，该表格已在原始字处理器文档中得到更新。在这里电子表格编辑器变成了字处理器的扩展，而如果使用DDE，用户要显式地启动电子表格编辑器。<br />　　同DDE技术相同，大多数基于Windows的应用程序都支持OLE技术。<br />2.9 动态连接库<br />　　Win32动态连接库(DLL)中的全局数据可以被调用DLL的所有进程共享，这就又给进程间通信开辟了一条新的途径，当然访问时要注意同步问题。<br />　　虽然可以通过DLL进行进程间数据共享，但从数据安全的角度考虑，我们并不提倡这种方法，使用带有访问权限控制的共享内存的方法更好一些。<br />2.10 远程过程调用<br />　　Win32 API提供的远程过程调用(RPC)使应用程序可以使用远程调用函数，这使在网络上用RPC进行进程通信就像函数调用那样简单。RPC既可以在单机不同进程间使用也可以在网络中使用。<br />　　由于Win32 API提供的RPC服从OSF-DCE(Open Software Foundation Distributed Computing Environment)标准。所以通过Win32 API编写的RPC应用程序能与其它操作系统上支持DEC的RPC应用程序通信。使用RPC开发者可以建立高性能、紧密耦合的分布式应用程序。<br />2.11 NetBios函数<br />　　Win32 API提供NetBios函数用于处理低级网络控制，这主要是为IBM NetBios系统编写与Windows的接口。除非那些有特殊低级网络功能要求的应用程序，其它应用程序最好不要使用NetBios函数来进行进程间通信。<br />2.12 Sockets<br />　　Windows Sockets规范是以U.C.Berkeley大学BSD UNIX中流行的Socket接口为范例定义的一套Windows下的网络编程接口。除了Berkeley Socket原有的库函数以外，还扩展了一组针对Windows的函数，使程序员可以充分利用Windows的消息机制进行编程。<br />　　现在通过Sockets实现进程通信的网络应用越来越多，这主要的原因是Sockets的跨平台性要比其它IPC机制好得多，另外WinSock 2.0不仅支持TCP/IP协议，而且还支持其它协议(如IPX)。Sockets的唯一缺点是它支持的是底层通信操作，这使得在单机的进程间进行简单数据传递不太方便，这时使用下面将介绍的WM_COPYDATA消息将更合适些。<br />2.13 WM_COPYDATA消息<br />　　WM_COPYDATA是一种非常强大却鲜为人知的消息。当一个应用向另一个应用传送数据时，发送方只需使用调用SendMessage函数，参数是目的窗口的句柄、传递数据的起始地址、WM_COPYDATA消息。接收方只需像处理其它消息那样处理WM_COPY DATA消息，这样收发双方就实现了数据共享。<br />　　WM_COPYDATA是一种非常简单的方法，它在底层实际上是通过文件映射来实现的。它的缺点是灵活性不高，并且它只能用于Windows平台的单机环境下。 </p>
		<p>
				<a href="http://blog.csdn.net/xgbing/archive/2007/08/23/1756381.aspx">
				</a> </p><img src ="http://www.cppblog.com/lapcca/aggbug/117526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-06-10 09:27 <a href="http://www.cppblog.com/lapcca/archive/2010/06/10/117526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于破解photoshop cs4的自动联网检测序列号问题</title><link>http://www.cppblog.com/lapcca/archive/2010/05/26/116353.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Wed, 26 May 2010 01:16:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/05/26/116353.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/116353.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/05/26/116353.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/116353.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/116353.html</trackback:ping><description><![CDATA[<p>这款软件以前经常用，现在用flash居多。</p>
		<p> <wbr>说实话买正版的的确也没有那么多钱，今天才开始用photoshop的最新版本。</wbr></p>
		<p>在网上搜了几个序列号，安装的时候能安装但是当你再次启动软件的时候，他就已经和adob官网进行了连接自动检测，可想而知，序列号就无效了。</p>
		<p> <wbr> <wbr> 想用最新版怎么办，破解吧，在网上找到了好多种方法，什么关闭防火墙的cs4的联网，不过这个方法没有成功，可能是我的方法不对。不过下面的方法很实用。</wbr></wbr></p>
		<p> <wbr> 因为官方的软件权威性比较高所以要安装官方的不过超大800多兆。破解吧。也是借用别人的方法。</wbr></p>
		<p>
				<br />破解方法 <wbr></wbr></p>
		<p> <wbr>管用. 本人亲身试过的<br />以下为摘抄内容:</wbr></p>
		<p>序列号：<br />1330-1082-3503-2270-3738-6738<br />1330-1776-8671-6289-7706-2916<br />1330-1567-6599-8775-4155-3745</p>
		<p>绝对能用！！！！</p>
		<p>第一步：下载完软件，要先解压出来。</p>
		<p>第二步：安装，到了输入注册码界面时，选试用30天的选项，不要输入注册码。安装界面是全中文的，安装完软件是英文的。</p>
		<p>第三步：打开软件，会跳出输入注册码界面，使用上面的注册码，输入，点下一步，进软件。</p>
		<p>第四步：先退出软件，找到C:\WINDOWS\system32\drivers\etc里面的hosts文件,去掉其只读的属性，双击打开，选用记事本打开，</p>
		<p>输入127.0.0.1 activate.adobe.com（中间有个空格），保存，退出, 屏蔽adobe激活服务器。<br />还不放心，将下面全部网址添加进去.</p>
		<p>将下列网址加入HOSt<br />127.0.0.1 activate.adobe.com<br />127.0.0.1 practivate.adobe.com<br />127.0.0.1 ereg.adobe.com<br />127.0.0.1 activate.wip3.adobe.com<br />127.0.0.1 wip3.adobe.com<br />127.0.0.1 3dns-3.adobe.com<br />127.0.0.1 3dns-2.adobe.com<br />127.0.0.1 adobe-dns.adobe.com<br />127.0.0.1 adobe-dns-2.adobe.com<br />127.0.0.1 adobe-dns-3.adobe.com<br />127.0.0.1 ereg.wip3.adobe.com<br />127.0.0.1 activate-sea.adobe.com<br />127.0.0.1 wwis-dubc1-vip60.adobe.com<br />127.0.0.1 activate-sjc0.adobe.com<br />第五步：再打开软件，ok。（若不进行第四步，再启动软件时，又会跳出激活界面）。</p>
		<p>这个主要是为了屏蔽软件与官方服务器连接的啊，如果软件想连接的话就让它不要连接官方了，连接本机就可以了。避免再次出现激活界面的啊。</p>
		<p>再依次打开 窗口-&gt;扩展功能-&gt;连接-&gt;小三角形 连接及脱机选项设置不连接网络</p><img src ="http://www.cppblog.com/lapcca/aggbug/116353.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-05-26 09:16 <a href="http://www.cppblog.com/lapcca/archive/2010/05/26/116353.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC++的Unicode编程[转]</title><link>http://www.cppblog.com/lapcca/archive/2010/05/06/114684.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Thu, 06 May 2010 09:30:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/05/06/114684.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/114684.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/05/06/114684.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/114684.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/114684.html</trackback:ping><description><![CDATA[VC++的Unicode编程<br /><br />作者：韩耀旭 
<p></p><p><a href="/Files/lapcca/unicodepro.rar">下载源代码</a></p><p>一、什么是Unicode</p><p>　　先从ASCII说起，ASCII是用来表示英文字符的一种编码规范。每个ASCII字符占用1个字节，因此，ASCII编码可以表示的最大字符数是255（00H—FFH）。其实，英文字符并没有那么多，一般只用前128个（00H—7FH，最高位为0），其中包括了控制字符、数字、大小写字母和其它一些符号。而最高位为1的另128个字符（80H—FFH）被称为“扩展ASCII”，一般用来存放英文的制表符、部分音标字符等等的一些其它符号。<br />　　这种字符编码规则显然用来处理英文没有什么问题。但是面对中文、阿拉伯文等复杂的文字，255个字符显然不够用。<br />于是，各个国家纷纷制定了自己的文字编码规范，其中中文的文字编码规范叫做“GB2312—80”，它是和ASCII兼容的一种编码规范，其实就是利用扩展ASCII没有真正标准化这一点，把一个中文字符用两个扩展ASCII字符来表示，以区分ASCII码部分。<br />　　但是这个方法有问题，最大的问题就是中文的文字编码和扩展ASCII码有重叠。而很多软件利用扩展ASCII码的英文制表符来画表格，这样的软件用到中文系统中，这些表格就会被误认作中文字符，出现乱码。<br />　　另外，由于各国和各地区都有自己的文字编码规则，它们互相冲突，这给各国和各地区交换信息带来了很大的麻烦。<br />要真正解决这个问题，不能从扩展ASCII的角度入手，而必须有一个全新的编码系统，这个系统要可以将中文、法文、德文……等等所有的文字统一起来考虑，为每一个文字都分配一个单独的编码。</p><p>于是，Unicode诞生了。</p><p>　　Unicode也是一种字符编码方法，它占用两个字节（0000H—FFFFH）,容纳65536个字符，这完全可以容纳全世界所有语言文字的编码。<br />在Unicode里，所有的字符被一视同仁，汉字不再使用“两个扩展ASCII”，而是使用“1个Unicode”，也就是说，所有的文字都按一个字符来处理，它们都有一个唯一的Unicode码。</p><p>二、使用Unicode编码的好处</p><p>　　使用Unicode编码可以使您的工程同时支持多种语言，使您的工程国际化。<br />　　另外，Windows NT是使用Unicode进行开发的，整个系统都是基于Unicode的。如果调用一个API函数并给它传递一个ANSI（ASCII字符集以及由此派生并兼容的字符集，如：GB2312，通常称为ANSI字符集）字符串，那么系统首先要将字符串转换成Unicode，然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串，系统就会首先将Unicode字符串转换成ANSI字符串，然后将结果返回给您的应用程序。进行这些字符串的转换需要占用系统的时间和内存。如果用Unicode来开发应用程序，就能够使您的应用程序更加有效地运行。<br /><br />下面例举几个字符的编码以简单演示ANSI和Unicode的区别：</p><table id="table1" width="52%" border="1"><tbody><tr><td align="middle">字符</td><td align="middle"> A</td><td align="middle"> N</td><td align="middle"> 和</td></tr><tr><td align="middle">ANSI码</td><td align="middle"> 41H</td><td align="middle"> 4eH</td><td align="middle"> cdbaH</td></tr><tr><td align="middle" height="20">Unicode码</td><td align="middle" height="20"> 0041H</td><td align="middle" height="20"> 004eH</td><td align="middle" height="20"> 548cH</td></tr></tbody></table><p>三、使用C++进行Unicode编程</p><p>　　对宽字符的支持其实是ANSI C标准的一部分，用以支持多字节表示一个字符。宽字符和Unicode并不完全等同，Unicode只是宽字符的一种编码方式。</p><p>1、宽字符的定义</p><p>　　在ANSI中，一个字符（char）的长度为一个字节（Byte）。使用Unicode时，一个字符占据一个字，C++在wchar.h头文件中定义了最基本的宽字符类型wchar_t：</p><pre>typedef unsigned short wchar_t;</pre><p>从这里我们可以清楚地看到，所谓的宽字符就是无符号短整数。</p><p>2、常量宽字符串</p><p>　　对C++程序员而言，构造字符串常量是一项经常性的工作。那么，如何构造宽字符字符串常量呢？很简单，只要在字符串常量前加上一个大写的L就可以了，比如：</p><pre>wchar_t *str1=L" Hello";</pre><p>这个L非常重要，只有带上它，编译器才知道你要将字符串存成一个字符一个字。还要注意，在L和字符串之间不能有空格。</p><p>3、宽字符串库函数</p><p>为了操作宽字符串，C++专门定义了一套函数，比如求宽字符串长度的函数是</p><pre>size_t __cdel wchlen(const wchar_t*);</pre><p>　　为什么要专门定义这些函数呢？最根本的原因是，ANSI下的字符串都是以’\0’来标识字符串尾的（Unicode字符串以“\0\0”结束），许多字符串函数的正确操作均是以此为基础进行。而我们知道，在宽字符的情况下，一个字符在内存中要占据一个字的空间，这就会使操作ANSI字符的字符串函数无法正确操作。以”Hello”字符串为例，在宽字符下，它的五个字符是：<br />0x0048 0x0065 0x006c 0x006c 0x006f<br />在内存中，实际的排列是：</p><pre>48 00 65 00 6c 00 6c 00 6f 00</pre><p>　　于是，ANSI字符串函数，如strlen，在碰到第一个48后的00时，就会认为字符串到尾了，用strlen对宽字符串求长度的结果就永远会是1！</p><p>4、用宏实现对ANSI和Unicode通用的编程</p><p>　　可见，C++有一整套的数据类型和函数实现Unicode编程，也就是说，您完全可以使用C++实现Unicode编程。<br />如果我们想要我们的程序有两个版本：ANSI版本和Unicode版本。当然，编写两套代码分别实现ANSI版本和Unicode版本完全是行得通的。但是，针对ANSI字符和Unicode字符维护两套代码是非常麻烦的事情。为了减轻编程的负担，C++定义了一系列的宏，帮助您实现对ANSI和Unicode的通用编程。<br />　　C++宏实现ANSI和Unicode的通用编程的本质是根据”_UNICODE”（注意，有下划线）定义与否，这些宏展开为ANSI或Unicode字符（字符串）。</p><p>如下是tchar.h头文件中部分代码摘抄： </p><pre>#ifdef  _UNICODE
typedef wchar_t     TCHAR;
#define __T(x)      L##x
#define _T(x)       __T(x)
#else
#define __T(x)      x
typedef char            TCHAR;
#endif 
</pre>　　可见，这些宏根据”_UNICODE” 定义与否，分别展开为ANSI或Unicode字符。 tchar.h头文件中定义的宏可以分为两类： 
<p>A、实现字符和常量字符串定义的宏我们只列出两个最常用的宏： </p><table id="table2" width="52%" border="1"><tbody><tr><td align="middle" width="64">宏 </td><td align="middle">未定义_UNICODE(ANSI字符) </td><td align="middle">定义了_UNICODE(Unicode字符)</td></tr><tr><td align="middle" width="64">TCHAR</td><td align="middle"> char</td><td align="middle"> wchar_t</td></tr><tr><td align="middle" width="64" height="22">_T(x)</td><td align="middle" height="22"> x</td><td align="middle" height="22"> L##x</td></tr></tbody></table><p><b>注意：<br />　　</b>“##”是ANSI C标准的预处理语法，它叫做“粘贴符号”，表示将前面的L添加到宏参数上。也就是说，如果我们写_T(“Hello”)，展开后即为L“Hello”</p><p>B、实现字符串函数调用的宏</p><p>C++为字符串函数也定义了一系列宏，同样，我们只例举几个常用的宏：</p><table id="table3" width="56%" border="1"><tbody><tr><td align="middle" width="72">宏 </td><td align="middle">未定义_UNICODE(ANSI字符) </td><td align="middle">定义了_UNICODE(Unicode字符)</td></tr><tr><td align="middle" width="72">_tcschr</td><td align="middle"> strchr</td><td align="middle"> wcschr</td></tr><tr><td align="middle" width="72">_tcscmp</td><td align="middle"> strcmp</td><td align="middle"> wcscmp</td></tr><tr><td align="middle" width="72">_tcslen</td><td align="middle"> strlen</td><td align="middle"> wcslen</td></tr></tbody></table><p>四、使用Win32 API进行Unicode编程 </p><p>Win32 API中定义了一些自己的字符数据类型。这些数据类型的定义在winnt.h头文件中。例如： </p><pre>typedef char CHAR; 
typedef unsigned short WCHAR;    // wc,   16-bit UNICODE character 
typedef CONST CHAR *LPCSTR, *PCSTR; 
</pre>Win32 API在winnt.h头文件中定义了一些实现字符和常量字符串的宏进行ANSI/Unicode通用编程。同样，只例举几个最常用的： <pre>#ifdef  UNICODE 
typedef WCHAR TCHAR, *PTCHAR;
typedef LPWSTR LPTCH, PTCH;
typedef LPWSTR PTSTR, LPTSTR;
typedef LPCWSTR LPCTSTR;
#define __TEXT(quote) L##quote      // r_winnt
#else   /* UNICODE */               // r_winnt
typedef char TCHAR, *PTCHAR;
typedef LPSTR LPTCH, PTCH;
typedef LPSTR PTSTR, LPTSTR;
typedef LPCSTR LPCTSTR;
#define __TEXT(quote) quote         // r_winnt
#endif /* UNICODE */                // r_winnt
</pre>　　从以上头文件可以看出，winnt.h根据是否定义了UNICODE（没有下划线），进行条件编译。<br />　　 Win32 API也定义了一套字符串函数，它们根据是否定义了“UNICODE”分别展开为ANSI和Unicode字符串函数。如：lstrlen。API的字符串操作函数和C++的操作函数可以实现相同的功能，所以，如果需要的话，建议您尽可能使用C++的字符串函数，没必要去花太多精力再去学习API的这些东西。<br />　　也许您从来没有注意到，Win32 API实际上有两个版本。一个版本接受MBCS字符串，另一个接受Unicode字符串。例如：其实根本没有SetWindowText()这个API函数，相反，有SetWindowTextA()和SetWindowTextW()。后缀A表明这是MBCS函数，后缀W表示这是Unicode版本的函数。这些API函数的头文件在winuser.h中声明，下面例举winuser.h中的SetWindowText()函数的声明部分： <pre>#ifdef UNICODE
#define SetWindowText  SetWindowTextW
#else
#define SetWindowText  SetWindowTextA
#endif // !UNICODE
</pre>　　可见，API函数根据定义UNICODE与否决定指向Unicode版本还是MBCS版本。<br />　　细心的读者可能已经注意到了UNICODE和_UNICODE的区别，前者没有下划线，专门用于Windows头文件；后者有一个前缀下划线，专门用于C运行时头文件。换句话说，也就是在ANSI C++语言里面根据_UNICODE（有下划线）定义与否，各宏分别展开为Unicode或ANSI字符，在Windows里面根据UNICODE（无下划线）定义与否，各宏分别展开为Unicode或ANSI字符。<br />　　在后面我们将会看到，实际使用中我们不加严格区分，同时定义_UNICODE和UNICODE，以实现UNICODE版本编程。 
<p>五、VC++6.0中编写Unicode编码的应用程序 </p><p>　　VC++ 6.0支持Unicode编程，但默认的是ANSI，所以开发人员只需要稍微改变一下编写代码的习惯便可以轻松编写支持UNICODE的应用程序。<br />　　使用VC++ 6.0进行Unicode编程主要做以下几项工作：</p><p>1、为工程添加UNICODE和_UNICODE预处理选项。 </p><p>　　具体步骤：打开[工程]-&gt;[设置…]对话框，如图1所示，在C/C++标签对话框的“预处理程序定义”中去除_MBCS，加上_UNICODE,UNICODE。（注意中间用逗号隔开）改动后如图2：</p><p><img height="452" hspace="0" src="http://www.cppblog.com/images/cppblog_com/lapcca/13342/r_1.gif" width="676" border="0" /><br />图一</p><p><img height="454" hspace="0" src="http://www.cppblog.com/images/cppblog_com/lapcca/13342/r_2.gif" width="676" border="0" /><br />图二</p><p>　　在没有定义UNICODE和_UNICODE时，所有函数和类型都默认使用ANSI的版本；在定义了UNICODE和_UNICODE之后，所有的MFC类和Windows API都变成了宽字节版本了。<br /><br />2、设置程序入口点</p><p>　　因为MFC应用程序有针对Unicode专用的程序入口点，我们要设置entry point。否则就会出现连接错误。<br />　　设置entry point的方法是：打开[工程]-&gt;[设置…]对话框，在Link页的Output类别的Entry Point里填上wWinMainCRTStartup。</p><p><img height="450" hspace="0" src="http://www.cppblog.com/images/cppblog_com/lapcca/13342/r_3.gif" width="676" border="0" /><br />图三</p><p>3、使用ANSI/Unicode通用数据类型 </p><p>　　微软提供了一些ANSI和Unicode兼容的通用数据类型，我们最常用的数据类型有_T ，TCHAR，LPTSTR,LPCTSTR。<br />　　顺便说一下，LPCTSTR和const TCHAR*是完全等同的。其中L表示long指针，这是为了兼容Windows 3.1等16位操作系统遗留下来的，在Win32 中以及其它的32位操作系统中，long指针和near指针及far修饰符都是为了兼容的作用，没有实际意义。P（pointer）表示这是一个指针；C（const）表示是一个常量；T(_T宏)表示兼容ANSI和Unicode，STR（string）表示这个变量是一个字符串。综上可以看出，LPCTSTR表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。比如： </p><pre>TCHAR* szText=_T(“Hello!”);
TCHAR szText[]=_T(“I Love You”);
LPCTSTR lpszText=_T(“大家好！”);
</pre>使用函数中的参数最好也要有变化，比如：<pre>MessageBox(_T(“你好”));</pre><p>　　其实，在上面的语句中，即使您不加_T宏，MessageBox函数也会自动把“你好”字符串进行强制转换。但我还是推荐您使用_T宏，以表示您有Unicode编码意识。 </p><p>4、修改字符串运算问题</p><p>　　一些字符串操作函数需要获取字符串的字符数(sizeof(szBuffer)/sizeof(TCHAR))，而另一些函数可能需要获取字符串的字节数sizeof(szBuffer)。您应该注意该问题并仔细分析字符串操作函数，以确定能够得到正确的结果。<br />ANSI操作函数以str开头，如strcpy()，strcat()，strlen()；<br />Unicode操作函数以wcs开头，如wcscpy，wcscpy()，wcslen()；<br />ANSI/Unicode操作函数以_tcs开头 _tcscpy(C运行期库)；<br />ANSI/Unicode操作函数以lstr开头 lstrcpy(Windows函数)；<br />考虑ANSI和Unicode的兼容，我们需要使用以_tcs开头或lstr开头的通用字符串操作函数。</p><p>六、举个Unicode编程的例子</p><p>第一步：<br />　　打开VC++6.0，新建基于对话框的工程Unicode，主对话框IDD_UNICODE_DIALOG中加入一个按钮控件，双击该控件并添加该控件的响应函数：</p><pre>void CUnicodeDlg::OnButton1() 
{
	TCHAR* str1=_T("ANSI和UNICODE编码试验");
	m_disp=str1;
	UpdateData(FALSE);
}
</pre>　　添加静态文本框IDC_DISP，使用ClassWizard给该控件添加CString类型变量m_disp。使用默认ANSI编码环境编译该工程，生成Unicode.exe。 
<p>第二步：<br />　　打开“控制面板”，单击“日期、时间、语言和区域设置”选项，在“日期、时间、语言和区域设置”窗口中继续单击“区域和语言选项”选项，弹出“区域和语言选项”对话框。在该对话框中，单击“高级”标签，将“非Unicode的程序的语言”选项改为“日语”，单击“应用”按钮，如图四：</p><p><img height="446" hspace="0" src="http://www.cppblog.com/images/cppblog_com/lapcca/13342/r_4.gif" width="397" border="0" /><br />图四</p><p>弹出的对话框单击“是”，重新启动计算机使设置生效。<br />运行Unicode.exe程序并单击“Button1”按钮，看，静态文本框出现了乱码。</p><p>第三步：<br />　　改为Unicode编码环境编译该工程，生成Unicode.exe。再次运行Unicode.exe程序并单击“Button1”按钮。看到Unicode编码的优势了吧。</p><p>就说这些吧，祝您好运。</p><img src ="http://www.cppblog.com/lapcca/aggbug/114684.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-05-06 17:30 <a href="http://www.cppblog.com/lapcca/archive/2010/05/06/114684.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>谈谈Unicode编码，简要解释UCS、UTF、BMP、BOM等名词</title><link>http://www.cppblog.com/lapcca/archive/2010/05/06/114661.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Thu, 06 May 2010 08:39:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/05/06/114661.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/114661.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/05/06/114661.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/114661.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/114661.html</trackback:ping><description><![CDATA[<div class="cnt" id="blog_text">
				<br />这是一篇程序员写给程序员的趣味读物。所谓趣味是指可以比较轻松地了解一些原来不清楚的概念，增进知识，类似于打RPG游戏的升级。整理这篇文章的动机是两个问题：<br /><br />问题一：<br /><br />    使用Windows记事本的“另存为”，可以在GBK、Unicode、Unicode big endian和UTF-8这几种编码方式间相互转换。同样是txt文件，Windows是怎样识别编码方式的呢？<br /><br />    我很早前就发现Unicode、Unicode big endian和UTF-8编码的txt文件的开头会多出几个字节，分别是FF、FE（Unicode）,FE、FF（Unicode big endian）,EF、BB、BF（UTF-8）。但这些标记是基于什么标准呢？<br />问题二：<br />    最近在网上看到一个ConvertUTF.c，实现了UTF-32、UTF-16和UTF-8这三种编码方式的相互转换。对于Unicode(UCS2)、 GBK、UTF-8这些编码方式，我原来就了解。但这个程序让我有些糊涂，想不起来UTF-16和UCS2有什么关系。 <br /><br />查了查相关资料，总算将这些问题弄清楚了，顺带也了解了一些Unicode的细节。写成一篇文章，送给有过类似疑问的朋友。本文在写作时尽量做到通俗易懂，但要求读者知道什么是字节，什么是十六进制。<br />0、big endian和little endian<br /><br />big endian和little endian是CPU处理多字节数的不同方式。例如“汉”字的Unicode编码是6C49。那么写到文件里时，究竟是将6C写在前面，还是将49写在前面？如果将6C写在前面，就是big endian。还是将49写在前面，就是little endian。<br /><br />“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开，由此曾发生过六次叛乱，其中一个皇帝送了命，另一个丢了王位。<br /><br />我们一般将endian翻译成“字节序”，将big endian和little endian称作“大尾”和“小尾”。<br />1、字符编码、内码，顺带介绍汉字编码<br /><br />字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ASCII编码，为了处理汉字，程序员设计了用于简体中文的GB2312和用于繁体中文的big5。<br /><br />GB2312(1980年)一共收录了7445个字符，包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7，低字节从A1-FE，占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。<br /><br />GB2312 支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号，它分为汉字区和图形符号区。汉字区包括21003个字符。2000年的 GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字，同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。现在的PC平台必须支持GB18030，对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。<br /><br />从ASCII、 GB2312、GBK到GB18030，这些编码方法是向下兼容的，即同一个字符在这些方案中总是有相同的编码，后面的标准支持更多的字符。在这些编码中，英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼，GB2312、GBK到GB18030都属于双字节字符集 (DBCS)。<br /><br />有的中文Windows的缺省内码还是GBK，可以通过GB18030升级包升级到GB18030。不过GB18030相对GBK增加的字符，普通人是很难用到的，通常我们还是用GBK指代中文Windows内码。<br /><br />这里还有一些细节：<br /><br />    *<br /><br />      GB2312的原文还是区位码，从区位码到内码，需要在高字节和低字节上分别加上A0。<br />    *<br /><br />      在DBCS中，GB内码的存储格式始终是big endian，即高位在前。<br />    *<br /><br />      GB2312 的两个字节的最高位都是1。但符合这个条件的码位只有128*128=16384个。所以GBK和GB18030的低字节最高位都可能不是1。不过这不影响DBCS字符流的解析：在读取DBCS字符流时，只要遇到高位为1的字节，就可以将下两个字节作为一个双字节编码，而不用管低字节的高位是什么。<br /><br />2、Unicode、UCS和UTF<br /><br />前面提到从ASCII、GB2312、GBK到GB18030的编码方法是向下兼容的。而Unicode只与ASCII兼容（更准确地说，是与ISO-8859-1兼容），与GB码不兼容。例如“汉”字的Unicode编码是6C49，而GB码是BABA。<br /><br />Unicode 也是一种字符编码方法，不过它是由国际组织设计，可以容纳全世界所有语言文字的编码方案。Unicode的学名是"Universal Multiple-Octet Coded Character Set"，简称为UCS。UCS可以看作是"Unicode Character Set"的缩写。<br /><br />根据维基百科全书(http: //zh.wikipedia.org/wiki/)的记载：历史上存在两个试图独立设计Unicode的组织，即国际标准化组织（ISO）和一个软件制造商的协会（unicode.org）。ISO开发了ISO 10646项目，Unicode协会开发了Unicode项目。<br /><br />在1991年前后，双方都认识到世界不需要两个不兼容的字符集。于是它们开始合并双方的工作成果，并为创立一个单一编码表而协同工作。从Unicode2.0开始，Unicode项目采用了与ISO 10646-1相同的字库和字码。<br /><br />目前两个项目仍都存在，并独立地公布各自的标准。Unicode协会现在的最新版本是2005年的Unicode 4.1.0。ISO的最新标准是10646-3:2003。<br /><br />UCS规定了怎么用多个字节表示各种文字。怎样传输这些编码，是由UTF(UCS Transformation Format)规范规定的，常见的UTF规范包括UTF-8、UTF-7、UTF-16。<br /><br />IETF 的RFC2781和RFC3629以RFC的一贯风格，清晰、明快又不失严谨地描述了UTF-16和UTF-8的编码方法。我总是记不得IETF是 Internet Engineering Task Force的缩写。但IETF负责维护的RFC是Internet上一切规范的基础。<br />3、UCS-2、UCS-4、BMP<br /><br /><br /><br />UCS有两种格式：UCS-2和UCS-4。顾名思义，UCS-2就是用两个字节编码，UCS-4就是用4个字节（实际上只用了31位，最高位必须为0）编码。下面让我们做一些简单的数学游戏：<br /><br />UCS-2有2^16=65536个码位，UCS-4有2^31=2147483648个码位。<br /><br />UCS -4根据最高位为0的最高字节分成2^7=128个group。每个group再根据次高字节分为256个plane。每个plane根据第3个字节分为 256行 (rows)，每行包含256个cells。当然同一行的cells只是最后一个字节不同，其余都相同。<br /><br />group 0的plane 0被称作Basic Multilingual Plane, 即BMP。或者说UCS-4中，高两个字节为0的码位被称作BMP。<br /><br />将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。在UCS-2的两个字节前加上两个零字节，就得到了UCS-4的BMP。而目前的UCS-4规范中还没有任何字符被分配在BMP之外。<br />4、UTF编码<br /><br /><br /><br />UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下：<br />UCS-2编码(16进制)     UTF-8 字节流(二进制)<br />0000 - 007F     0xxxxxxx<br />0080 - 07FF     110xxxxx 10xxxxxx<br />0800 - FFFF     1110xxxx 10xxxxxx 10xxxxxx<br /><br />例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间，所以肯定要用3字节模板了：1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是：0110 110001 001001， 用这个比特流依次代替模板中的x，得到：11100110 10110001 10001001，即E6 B1 89。<br /><br />读者可以用记事本测试一下我们的编码是否正确。<br /><br />UTF -16以16位为单元对UCS进行编码。对于小于0x10000的UCS码，UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于 0x10000的UCS码，定义了一个算法。不过由于实际使用的UCS2，或者UCS4的BMP必然小于0x10000，所以就目前而言，可以认为UTF -16和UCS-2基本相同。但UCS-2只是一个编码方案，UTF-16却要用于实际的传输，所以就不得不考虑字节序的问题。<br />5、UTF的字节序和BOM<br /><br />UTF -8以字节为编码单元，没有字节序的问题。UTF-16以两个字节为编码单元，在解释一个UTF-16文本前，首先要弄清楚每个编码单元的字节序。例如收到一个“奎”的Unicode编码是594E，“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”，那么这是“奎”还是 “乙”？<br /><br />Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表，而是Byte Order Mark。BOM是一个有点小聪明的想法：<br /><br />在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符，它的编码是FEFF。而FFFE在UCS中是不存在的字符，所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前，先传输字符"ZERO WIDTH NO-BREAK SPACE"。<br /><br />这样如果接收者收到FEFF，就表明这个字节流是Big-Endian的；如果收到FFFE，就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。<br /><br />UTF -8不需要BOM来表明字节顺序，但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF（读者可以用我们前面介绍的编码方法验证一下）。所以如果接收者收到以EF BB BF开头的字节流，就知道这是UTF-8编码了。<br /><br />Windows就是使用BOM来标记文本文件的编码方式的。<br />6、进一步的参考资料<br /><br />本文主要参考的资料是 "Short overview of ISO-IEC 10646 and Unicode" (http://www.nada.kth.se/i18n/ucs/unicode-iso10646-oview.html)。<br /><br />我还找了两篇看上去不错的资料，不过因为我开始的疑问都找到了答案，所以就没有看：<br /><br />   1. "Understanding Unicode A general introduction to the Unicode Standard" (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&amp;item_id=IWS-Chapter04a)<br />   2. "Character set encoding basics Understanding character set encodings and legacy encodings" (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&amp;item_id=IWS-Chapter03) <br /><br />我写过UTF-8、UCS-2、GBK相互转换的软件包，包括使用Windows API和不使用Windows API的版本。以后有时间的话，我会整理一下放到我的个人主页上(http://www.fmddlmyy.cn)。<br /><br />我是想清楚所有问题后才开始写这篇文章的，原以为一会儿就能写好。没想到考虑措辞和查证细节花费了很长时间，竟然从下午1:30写到9:00。希望有读者能从中受益。</div><img src ="http://www.cppblog.com/lapcca/aggbug/114661.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-05-06 16:39 <a href="http://www.cppblog.com/lapcca/archive/2010/05/06/114661.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UNICODE与ANSI的区别</title><link>http://www.cppblog.com/lapcca/archive/2010/05/06/114649.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Thu, 06 May 2010 08:09:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/05/06/114649.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/114649.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/05/06/114649.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/114649.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/114649.html</trackback:ping><description><![CDATA[什么是ANSI，什么又是UNICODE呢？其实这是两种不同的编码方式标准，ANSI中的字符采用8bit，而UNICODE中的字符采用16bit。（对于字符来说ANSI以单字节存放英文字符，以双字节存放中文等字符,而Unicode下，英文和中文的字符都以双字节存放）Unicode码也是一种国际标准编码，采用二个字节编码，与ANSI码不兼容。目前，在网络、Windows系统和很多大型软件中得到应用。8bit的ANSI编码只能表示256种字符，表示26个英文字母是绰绰有余的，但是表示汉字，韩国语等有着成千上万个字符的非西方字符肯定就不够了，正是如此才引入了UNICODE标准。   <br />     在软件开发中，特别是使用C语言的一些有关字符串处理的函数，ANSI和UNICODE是区分是用的，那么ANSI类型的字符和UNICODE类型的字符如何定义，如何使用呢？ANSI和UNICODE又如何转换呢？   <br />   一．定义部分：  <br />   ANSI：char    str[1024]; 可用字符串处理函数：strcpy( ),    strcat( ),   strlen( )等等。<br />UNICODE：wchar_t    str[1024]；可用字符串处理函数   <br />二．可用函数： <br />   ANSI：即char，可用字符串处理函数：strcat(    ),strcpy(    ),    strlen(    )等以str打头的函数。   <br />   UNICODE：即wchar_t 可用字符串处理函数：wcscat(),wcscpy(),wcslen()等以wcs打头的函数。   <br />   三．系统支持  <br />      Windows    98    ：只支持ANSI。   <br />      Windows    2k    ：既支持ANSI又支持UNICODE。   <br />      Windows    CE    ：只支持UNICODE。   <br />      说明   <br />      1 在COM里面只支持UNICODE。   <br />      2．Windows   2000整个OS系统都是基于UNICODE的，为此在windows 2000 下使用ANSI是需要付出代价的，虽然在编码上不用任何的转换，但是这种转化是隐藏的，是占用系统资源的（CPU，内存）。   <br />      3 在Windows 98下必须使用UNICODE，则需要自己手动的编码切换。   <br />    四．如何区分：   <br />    在我们软件开发中往往需要即支持ANSI又支持UNICODE，不可能在要求类型转换的时候，重新改变字符串的类型，和使用于字符串上的操作函数。为此, 标准C运行期库和Windows 提供了宏定义的方式。   <br />    在C语言里面提供了 _UNICODE宏（有下划线），在Windows里面提供了UNICODE宏（无下划线），只要定了_UNICODE宏和UNICODE宏，系统就会自动切换到UNICODE版本，否则，系统按照ANSI的方式进行编译和运行。   <br />    只定义了宏并不能实现自动的转换，他还需要一系列的字符定义支持。   <br />   1. TCHAR   <br />   如果定义了UNICODE宏则TCHAR被定义为wchar_t。   <br />    typedef    wchar_t    TCHAR;   <br />    否则TCHAR被定义为char   <br />    typedef    char   TCHAR;   <br />   2．LPTSTR   <br />如果定义了UNICODE宏则LPTSTR被定义为LPWSTR。（以前一直不知道LPWSTR是什么东东，终于明白了）   <br />   typedef    LPTSTR   LPWSTR;   <br />   否则TCHAR被定义为char   <br />   typedef    LPTSTR   LPSTR;  <br />补充一下：<br />UTF-8是可以用于真正的流式传输的，Unicode是一种编码方案   <br />    我的理解是UTF-8是Unicode的一种具体实现。类似的实现还有UTF－16等等。
<p><br />ANSI/Unicode字符和字符串 <br />TChar.h是String.h的修改，用于创建ANSI/Unicode通用字符串。</p><p>Unicode字符串的每个字符都是16位的。</p><p>Win9x只支持ANSI；Win2000/XP/2003支持ANSI/Unicode；WinCE只支持Unicode<br />       附：有部分Unicode函数也可以在Win9X中使用，但可能会出现意想不到错误。</p><p>wchar_t是Unicode字符的数据类型。</p><p>所有的Unicode函数均以wcs开头，ANSI函数均以str开头；ANSI C规定C运行期库支持ANSI和Unicode<br />                                 ANSI                                                                              Unicode<br />       char   *strcat(char   *,   const   char   *)                           wchar_t   *wcscat(wchar_t   *,   const   wchar_t   *) <br />       char   *strchr(const   char * , int)                                   wchar_t    *wcschr(const   wchar_t   * , int) <br />       int   strcmp(const   char   *,    const   char   *)                int    wcscmp(const   wchar_t   *, const   wchar_t *)<br />       char *strcpy(char   *,   const   char   *)                           wchar_t   *wcscpy(wchar_t    *,   const   wchar_t    *)<br />       size_t   strlen(const   char   *)                                        wchar_t    wcslen(const   wchar_t   *)</p><p>L" wash " : 用于将ANSI字符串转换为Unicode字符串；<br />        _TEXT(" wash ")根据是否定义Unicode或_Unicode进行转换。<br />       附：_Unicode用于C运行库；Unicode用于Windows头文件。</p><p>ANSI/Unicode通用数据类型<br />                        Both（ANSI/Unicode）                    ANSI                       Unicode<br />                               LPCTSTR                                 LPCSTR                   LPCWSTR<br />                               LPTSTR                                    LPSTR                      LPWSTR<br />                               PCTSTR                                   PCSTR                      PCWSTR<br />                               PTSTR                                      PSTR                         PWSTR<br />                               TBYTE(TCHAR)                      CHAR                         WCHAR</p><p>在设计dll时最好提供ANSI和Unicode函数，ANSI函数只用于分配内存，将字符转换为Unicode字符，然后调用Unicode函数。</p><p>最好使用操作系统函数，少使用或不实用C运行期函数<br />        eg：操作系统字符串函数（shlWApi.h）<br />                StrCat(), StrChr(), StrCmp(), StrCpy()等<br />                注意它们区分大小写，也区分ANSI和Unicode版本<br />        附：ANSI版函数在原函数后加大写字母A<br />                Unicode函数在原函数后加大写字母W</p><p>成为符合ANSI和Unicode的函数<br />        • 将文本串视为字符数组，而不是c h a r s数组或字节数组。<br />        • 将通用数据类型（如T C H A R和P T S T R）用于文本字符和字符串。<br />        • 将显式数据类型（如B Y T E和P B Y T E）用于字节、字节指针和数据缓存。<br />        • 将T E X T宏用于原义字符和字符串。<br />        • 修改字符串运算问题 。<br />          如：sizeof(szBuffer) -&gt; sizeof(szBuffer) / sizeof(TCHAR)<br />                  malloc(charNum) -&gt; malloc(charNum * sizeof(TCHAR))    </p><p>对Unicode字符操作的函数还有：（也有ANSI和Unicode版本）<br />       lstrcat() , lstrcmp() / lstrcmpi()[ 它们在内部调用CompareString() ], lstrcpy(), lstrlen()<br />       这些是作为宏实现的。</p><p>          C运行期函数                                       windows函数<br />                  tolower()                                  PTSTR   CharLower(PTSTR   pszString)<br />                  toupper()                                 PTSTR   CharUpper(PTSTR   pszString)<br />                  isalpha()                                  BOOL   IsCharAlpha(TCHAR   ch)<br />                                                                   BOOL   ISCharAlphaNumeric(TCHAR   ch)<br />                  islower()                                  BOOL   IsCharLower(TCHAR   ch)<br />                  isupper()                                 BOOL   IsCharUpper(TCHAR   ch)<br />                  print()                                       wsprintf()<br />       转换Buffer：DWORD   CharLowerBuffer(PTSTR   pszString , DWORD cchString)<br />                              DWORD CharUpperBuffer(PTSTR   pszString , DWORD   cchString)<br />       也可转换单个字符，如：TCHAR   cLowerCaseChar = CharLower((PTSTR)szString[0])</p><p>确定字符是ANSI或Unicode<br />        BOOL   IsTextUnicode(<br />                     const   VOID   * pBuffer,   //input   buffer   to be   examined<br />                     int   cb,                               //size of input   buffer<br />                     LPINT   lpi                         //options<br />        )<br />       附：此函数在Win9x系统中，没有实现代码，始终返回FALSE</p><p>Unicode与ANSI之间的转换<br />        char   szA[40];<br />        wchar   szW[40];<br />        // Normal   sprintf : all   string   are   ANSI<br />        sprintf( szA , " %s " , " ANSI   str ");<br />        // Convert   Unicode   string   to ANSI<br />        sprintf(   szA,   " %S " ,   L" Unicode   str ");<br />        // Normal   swprintf : all string are unicode<br />        swprinf( szW , "%s" , L" Unicode   str ");<br />        // Convert   ANSI   String to Unicode<br />        swprinf( szW, L"%S" , "ANSI str");</p><p>        int   MultiByteToWideChar(<br />              UINT   uCodePage,                   //code page,   0<br />              DWORD   dwFlags,                   //character-type   options,   0<br />              PCSTR   pMultiByte,                  //source   string   Addr<br />              int   cchMultiByte,                       //source   string   byte length<br />              PWSTR   pWideCharStr,          //Dest string   Addr<br />              int   cchWideChar                      //Dest   string char   Nums<br />         )<br />        u C o d e P a g e参数用于标识一个与多字节字符串相关的代码页号。d w F l a g s参数用于设定另一个控件，它可以用重音符号之类的区分标记来影响字符。这些标志通常并不使用，在d w F l a g s参数中传递0。p M u l t i B y t e S t r参数用于设定要转换的字符串， c c h M u l t i B y t e参数用于指明该字符串的长度（按字节计算）。如果为c c h M u l t i B y t e参数传递- 1，那么该函数用于确定源字符串的长度。转换后产生的U n i c o d e版本字符串将被写入内存中的缓存，其地址由p Wi d e C h a r S t r参数指定。必须在c c h Wi d e C h a r参数中设定该缓存的最大值（以字符为计量单位）。如果调用M u l t i B y t e To Wi d e C h a r，给c c h Wi d e C h a r参数传递0，那么该参数将不执行字符串的转换，而是返回为使转换取得成功所需要的缓存的值。</p><p>     可以通过下列步骤将多字节字符串转换成U n i c o d e等价字符串：<br />     1) 调用M u l t i B y t e To Wi d e C h a r函数，为p Wi d e C h a r S t r参数传递N U L L，为c c h Wi d e C h a r参数传递0。<br />     2) 分配足够的内存块，用于存放转换后的U n i c o d e字符串。该内存块的大小由前面对M u l t B y t e To Wi d e C h a r的调用返回。<br />     3) 再次调用M u l t i B y t e To Wi d e C h a r，这次将缓存的地址作为p Wi d e C h a r S t r参数来传递，并传递第一次调用M u l t i B y t e To Wi d e C h a r时返回的缓存大小，作为c c h Wi d e c h a r参数。<br />     4) 使用转换后的字符串。<br />     5) 释放U n i c o d e字符串占用的内存块。</p><p>    int WideCharToMultiByte(<br />          UINT CodePage,                        // code page<br />          DWORD dwFlags,                      // performance and mapping flags<br />          LPCWSTR lpWideCharStr,      // wide-character string<br />          int cchWideChar,                       // number of chars in string<br />          LPSTR lpMultiByteStr,               // buffer for new string<br />          int cbMultiByte,                           // size of buffer<br />          LPCSTR lpDefaultChar,            // default for unmappable chars<br />          LPBOOL lpUsedDefaultChar   // set when default char used<br />     )</p><img src ="http://www.cppblog.com/lapcca/aggbug/114649.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-05-06 16:09 <a href="http://www.cppblog.com/lapcca/archive/2010/05/06/114649.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ice与CORBA的差异</title><link>http://www.cppblog.com/lapcca/archive/2010/05/06/114595.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Thu, 06 May 2010 04:38:00 GMT</pubDate><guid>http://www.cppblog.com/lapcca/archive/2010/05/06/114595.html</guid><wfw:comment>http://www.cppblog.com/lapcca/comments/114595.html</wfw:comment><comments>http://www.cppblog.com/lapcca/archive/2010/05/06/114595.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lapcca/comments/commentRss/114595.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lapcca/services/trackbacks/114595.html</trackback:ping><description><![CDATA[<p>首先声明,我们既不想引起一场"CORBA vs Ice"的争论，也不想怀疑CORBA。相反，我们认为CORBA在它的时代是一个很大的成就，而且，Ice也明显借用了CORBA的很多思想。</p>
		<p>我们决定写这篇比较文章是因为我们期望更多的人能正确地询问我们为何他们要用Ice代替CORBA。对这个问题，我们通常的回答是：为什么不先自己试试使用 Ice呢？我们敢肯定，一旦你使用了Ice有一段时间，你就永远不会再想用回CORBA。请相信我们，很容易会喜欢上Ice，因为它优雅、简单，它的结构一致性，而且最后一点：至少它没有大量的特性和工具。</p>
		<p>对于没有时间去试验Ice来了解它的人，这里有一些原因让我们相信Ice优于CORBA：</p>
		<p>1、Completeness(完备性)<br />当我们说到完备性时，我们的意思是实际产品的完备性，而不是从来未被实现的标准的完备性。我们相信Ice比市场上任何单个CORBA更完备。你可以自己做一个检查：市场上有哪个CORBA产品提供了跟Ice可比较的特性？</p>
		<p>2、Performance(性能)<br />由于具有CORBA所没有的结构优点，Ice具有突出的性能。Ice高效的协议、请求批量化、高效的事件分发都意味着Ice比CORBA ORB运行得更快，同时消耗更少的线路带宽。</p>
		<p>3、No "Design by Committee"(非“委员会设计”)<br />Ice由一群专业的资深专家所设计。Ice没有设计成适合所有人的“万金油”。而CORBA则充斥着被具有特权的制定者加进到标准里的众多不切实际的特性，却又没有真正考虑到这些特性是否会被真正地实现。</p>
		<p>通常，为了就CORBA标准达成一致的唯一方法就是将之前大量实现的特性放在一起，生硬地塞进标准里。这导致了标准越来越大，也越来越复杂，超出了实际的需要。这也意味着平台更大更慢，也因为复杂的API导致了难以使用。Ice提供的API集小得多，也更高效，比CORBA的API易于学习使用，并且功能并不少。</p>
		<p>4、Slice<br />Slice，Ice的规范定义语言，比CORBA IDL更小、更简洁、更强大。Slice具有更少的语言结构，但却更灵活。例如，一个内建的字典类型提供直接快速访问数据结构，异常的继承允许更清晰地影射到支持异常处理的语言。同时，Slice抛弃了CORBA IDL不需要的复杂性，例如属性，inout参数，上下文和传值对象(Objects-by-Value)的复杂性。</p>
		<p>5、Language Mappings(语言影射)<br />Ice支持到C++、Java、Python、PHP、C#和Visual Basic的语言影射。我们知道任何一个CORBA实现提供商都没有提供那么多的语言影射选择。</p>
		<p>实际上大多数的CORBA提供商只提供C++和Java的影射，如果你想使用其它语言影射，你就要切换到不同的提供商的产品或使用没有实验支持的CORBA实现。</p>
		<p>6、Persistence(持久性)<br />Slice并不单单是一个接口定义语言。它也可以用来描述Ice对象进行持久的属性，使得很容易写出支持对象持久的服务器端程序。</p>
		<p>7、Metadata(元数据)<br />Slice支持可扩展的元数据设施，它允许Slice为实现应用程序相关的某些目的而使用元数据的标记。例如元数据可以用于定制不同于标准Java影射方式的影射来满足某些特定程序的要求。</p>
		<p>8、No any Type(没有any数据类型)<br />Ice 没有CORBA里Any类型的等价数据类型。这对于CORBA用户来说可能感到很惊讶，因为Any数据类型在CORBA标准里被广泛地使用。但是，Any 数据类型是多余的：程序语言象Java和C++并没有Any数据类型，而且Any数据类型对分布式系统来说也不是属于一个良好的设计。Any数据类型通常用在两种情况下：一种是需要在系统的中介部分对接收到的数据直接进行传递，而不用关心数据的真实类型，例如CORBA的Event服务，另一种是用来作为 union(联合结构体)的一个等价物。</p>
		<p>Ice可以通过发送和接收"blobs"的请求来满足第一种情况，Slice的类继承可以满足第二种情况。任何一种情况，Ice的程序都更高效，更加具有类型安全，更加容易设计和实现，而不会遇到使用CORBA Any数据类型时所具有的复杂性。</p>
		<p>9、Ice Core(Ice的核心)<br />虽着时间的演化，CORBA的核心变得异常的复杂。一个初级的例子要在POA(CORBA的对象适配器)里面正确使用都需要很专业的知识，即使你只想支持一小部分的技术特性。Ice的对象适配器，在另一方面来说，更加简单、直观、也跟POA一样的功能强大：定义良好的API使得比POA开发一个可扩展的程序项目需要更少的工作。</p>
		<p>10、Ice Protocol(Ice协议)<br />IIOP是CORBA的弱点之一，具有太多的设计缺陷。例如，没有缺少请求的封装来防止消息的分发。低效的对齐规则导致了多余的数据拷贝。数据的编码规则复杂，却没有带来相应的性能的提高，对象引用的编码异常复杂，妨碍了有效的的编码和在内存共享的执行。代码集的协商是在标准下达成，会遭遇到很多冲突。所有这些复杂性意味着IIOP很难实现，带来了互操作性和性能上的问题。Ice的协议是简单并且更加有效，它提供了一些IIOP没有提供的特性，例如数据压缩和批请求批量化。</p>
		<p>11、Security(安全性)<br />安全性是CORBA的最大的一个难题。OMG已经通过了多个标准，但很多都没有被广泛地实现，CORBA的客户依然没有一个可工作的安全的ORBs。当设计 Ice时，和CORBA相比，安全性被认为是基本的特性。这就是Ice提供一个真正能运作的SSL实现的安全的防火墙的原因。</p>
		<p>12、C++ Mapping(C++映射)<br />用 C++来使用CORBA非常困难。即使你是很有经验的C++开发者。CORBA的C++映射在内存管理和异常安全方面有很多的陷阱和缺陷。相较之下，Ice的C++映射非常简单和直观。它不会有因为错误而导致内存的泄漏。要记住的映射规则的数目比CORBA的C++映射少得多，而且Ice的C++ 映射是基于工业标准的STL。</p>
		<p>14、Scalability(可伸缩性)<br />当你是一个专家时，CORBA是一种可伸缩性很好的技术。但采用Ice，任何人都可以写出高可伸缩性的应用。例如，Ice实现了一个持久化的逐出器，你可以使用它来很容易地处理上百万的对象，你所做的仅仅是在 Slice的定义里指定对象的数据，剩下的工作Ice一手包办：Ice运行库使用高速的数据库来自动加载和保存对象。</p>
		<p>15、Versioning(版本化)<br />CORBA没有任何机制来支持对象状态的版本化。Freeze是Ice的持久服务，它允许持久数据在Slice的定义中改变时，很容易地进行数据库的移植。</p>
		<p>16、Software Updates(软件更新)<br />IcePatch是一个允许你更行客户端软件的工具。它使用压缩来提高数据的传输，并使用校验值来保证一致性。CORBA完全没有提供一个在分布式环境来进行软件更新的机制。</p>
		<p>17、Typed Event Service(类型化的事件服务)<br />CORBA有一个标准来提供类型化的事件服务，但很少甚至没有被实现。类型化的事件服务也有很多已知的问题，事实上它在真正环境的部署是不可用的。Ice从一开始就提供了类型化事件的服务。IceStorm是一个高效、类型化事件服务的实现，它支持事件联盟。</p>
		<p>18、Facets(多接口)<br />CORBA支持继承，DCOM支持聚合。在过去，有很多关于那一种是更好的方法的争论。Ice以接口继承加上以多接口形式的聚合来同时支持这两种方式。Facets允许你在运行的时候用动态的聚合来扩展类型来替代静态的继承。</p>
		<p>19、Asynchronous Messages(异步消息)<br />CORBA 支持异步消息调用(AMI)，但很少CORBA产品实现了AMI。Ice一开始就以简单和有效的方式支持AMI。Ice也支持异步消息分发(AMD)，这是CORBA里完全没有的东西。AMD等价于客户端的AMI，不过AMD是用在服务器端的。使用AMI，你可以发送了一个请求，然后在以后的一个事件收到服务器的结果时调用一个回调函数来处理返回的结果。而使用AMD，你可以将分发线程归还给Ice，并在结果已经准备好发送到客户端时再次调用分发线程。 AMI和AMD都能被连接起来，这允许你只消耗很少的资源就能构建高效的路由程序。</p>
		<p>AMI和AMD对客户端和服务器端来说都是透明的。也就是，一个服务器程序不知道一个请求是否通过AMI调用发出的还是同步地调用发出的，客户端程序也不知道一个操作的调用在服务器端是通过AMD分发处理的还是同步地处理的。当需要使用AMI和AMD时，不用修改Slice。</p>
		<p>结束语：</p>
		<p>我们希望上面的解释能另你激发你对Ice的兴趣。如果你有任何的问题或解释，我们会邀请你加入我们的邮件列表。我们的目标是不断地改进Ice，因此你的反馈对我们来说是很有价值的。</p>
		<p>                                                                                    gigaboy翻译完成于2005/7/4 3:02</p>
		<p> </p><img src ="http://www.cppblog.com/lapcca/aggbug/114595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lapcca/" target="_blank">阿π</a> 2010-05-06 12:38 <a href="http://www.cppblog.com/lapcca/archive/2010/05/06/114595.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>