﻿<?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++博客-Kisser Leon-随笔分类-IT</title><link>http://www.cppblog.com/jacky2019/category/3694.html</link><description>这个kisser不太冷</description><language>zh-cn</language><lastBuildDate>Thu, 08 Apr 2010 22:05:13 GMT</lastBuildDate><pubDate>Thu, 08 Apr 2010 22:05:13 GMT</pubDate><ttl>60</ttl><item><title>dxtrans.h missing in Microsoft DirectX SDK (November 2007)</title><link>http://www.cppblog.com/jacky2019/archive/2010/04/08/111974.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Thu, 08 Apr 2010 08:31:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2010/04/08/111974.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/111974.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2010/04/08/111974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/111974.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/111974.html</trackback:ping><description><![CDATA[<p><font style="BACKGROUND-COLOR: #c0c0c0">解决办法（来自 <a href="http://social.msdn.microsoft.com/forums/en-US/windowssdk/thread/ed097d2c-3d68-4f48-8448-277eaaf68252/"><u><font color=#0000ff>http://social.msdn.microsoft.com/forums/en-US/windowssdk/thread/ed097d2c-3d68-4f48-8448-277eaaf68252/</font></u></a>）<br><br><span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span>1.使用&nbsp;<span style="LINE-HEIGHT: 16px; FONT-FAMILY: 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif; COLOR: rgb(51,51,51); FONT-SIZE: 13px" class=Apple-style-span><a style="BORDER-BOTTOM-STYLE: none; PADDING-BOTTOM: 0px; BORDER-RIGHT-STYLE: none; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: 0px; OUTLINE-WIDTH: 0px; PADDING-RIGHT: 0px; FONT-FAMILY: inherit; BORDER-TOP-STYLE: none; COLOR: rgb(0,102,221); BORDER-LEFT-STYLE: none; CURSOR: pointer; TEXT-DECORATION: none; PADDING-TOP: 0px" title=http://www.microsoft.com/downloads/details.aspx?familyid=529F03BE-1339-48C4-BD5A-8506E5ACF571&amp;displaylang=en href="http://www.microsoft.com/downloads/details.aspx?familyid=529F03BE-1339-48C4-BD5A-8506E5ACF571&amp;displaylang=en"><font style="PADDING-BOTTOM: 0px; BORDER-RIGHT-WIDTH: 0px; MARGIN: 0px; PADDING-LEFT: 0px; OUTLINE-WIDTH: 0px; PADDING-RIGHT: 0px; FONT-FAMILY: inherit; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px" face=Verdana>August 2007 DirectX SDK</font></a><font style="PADDING-BOTTOM: 0px; BORDER-RIGHT-WIDTH: 0px; MARGIN: 0px; PADDING-LEFT: 0px; OUTLINE-WIDTH: 0px; PADDING-RIGHT: 0px; FONT-FAMILY: inherit; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; PADDING-TOP: 0px" face=Verdana>.<br><br>2. <span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 16px Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="TEXT-ALIGN: left; LINE-HEIGHT: 16px; FONT-FAMILY: 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif; COLOR: rgb(51,51,51); FONT-SIZE: 13px" class=Apple-style-span>移除所有和dxtrans.h有关的<br><br>Remove anything to do with "dxtrans.h" and "IDXEffect" .<br><br>Say, for file "qedit.h"<br><br>//#include "dxtrans.h" -- Line 498<span class=Apple-converted-space>&nbsp;</span><br><br>// IDxtCompositor //: public IDXEffect -- Line 837<br>// IDxtAlphaSetter //: public IDXEffect -- Line 1151<br>// IDxtJpeg //: public IDXEffect -- Line 1345<br>// IDxtKey //: public IDXEffect -- Line 1735<br></span></span><br><br><br></font></span></span><br></font></p>
<img src ="http://www.cppblog.com/jacky2019/aggbug/111974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2010-04-08 16:31 <a href="http://www.cppblog.com/jacky2019/archive/2010/04/08/111974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>存储过程 stored procedure</title><link>http://www.cppblog.com/jacky2019/archive/2007/11/06/35937.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Tue, 06 Nov 2007 02:37:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/11/06/35937.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/35937.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/11/06/35937.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/35937.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/35937.html</trackback:ping><description><![CDATA[<span style="COLOR: red">&nbsp;
<p><font color=#000000><font size=3><strong>定义：<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将常用的或很复杂的工作，预先用SQL语句写好并用一个指定的名称存储起来,&nbsp;&nbsp; 那么以后要叫<a onclick="javascript:tagshow(event, '%CA%FD%BE%DD%BF%E2');" href="javascript:;" target=_self><u><strong><font color=#800080>数据库</font></strong></u></a>提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 讲到这里,可能有人要问：这么说存储过程就是一堆SQL语句而已啊？<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Microsoft公司为什么还要添加这个技术呢?<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 那么存储过程与一般的SQL语句有什么区别呢?</font></font></p>
<p><font color=#000000 size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color=#000000><font size=3><strong>存储过程的优点：<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.存储过程只在创造时进行编译，以后每次执行存储过程都不需再重新编译，而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时），可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.存储过程可以重复使用,可减少数据库开发人员的工作量<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>存储过程的种类：</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.系统存储过程：以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如&nbsp;&nbsp; sp_help就是取得指定对象的相关信息<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.扩展存储过程&nbsp;&nbsp; 以XP_开头,用来调用操作系统提供的功能<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exec&nbsp;&nbsp; master..xp_cmdshell&nbsp;&nbsp; 'ping&nbsp;&nbsp; 10.8.16.1'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.用户自定义的存储过程,这是我们所指的存储过程<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 常用格式<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Create&nbsp;&nbsp; procedure&nbsp;&nbsp; procedue_name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [@parameter&nbsp;&nbsp; data_type][output]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [with]{recompile|encryption}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sql_statement<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解释:&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output：表示此参数是可传回的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; with&nbsp;&nbsp; {recompile|encryption}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; recompile:表示每次执行此存储过程时都重新编译一次<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; encryption:所创建的存储过程的内容会被加密<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表book的内容如下<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编号&nbsp;&nbsp; 书名&nbsp;&nbsp; 价格<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 001&nbsp;&nbsp; C语言入门&nbsp;&nbsp; $30<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 002&nbsp;&nbsp; PowerBuilder报表开发&nbsp;&nbsp; $52<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实例1:查询表Book的内容的存储过程<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create&nbsp;&nbsp; proc&nbsp;&nbsp; query_book<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select&nbsp;&nbsp; *&nbsp;&nbsp; from&nbsp;&nbsp; book<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; go<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exec&nbsp;&nbsp; query_book<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实例2:加入一笔记录到表book,并查询此表中所有书籍的总金额<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Create&nbsp;&nbsp; proc&nbsp;&nbsp; insert_book<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @param1&nbsp;&nbsp; char(10),@param2&nbsp;&nbsp; varchar(20),@param3&nbsp;&nbsp; money,@param4&nbsp;&nbsp; money&nbsp;&nbsp; output<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; with&nbsp;&nbsp; encryption&nbsp;&nbsp; ---------加密<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert&nbsp;&nbsp; book(编号,书名，价格）&nbsp;&nbsp; Values(@param1,@param2,@param3)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select&nbsp;&nbsp; @param4=sum(价格)&nbsp;&nbsp; from&nbsp;&nbsp; book<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; go<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 执行例子:&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare&nbsp;&nbsp; @total_price&nbsp;&nbsp; money&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exec&nbsp;&nbsp; insert_book&nbsp;&nbsp; '003','Delphi&nbsp;&nbsp; 控件开发指南',$100,@total_price<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print&nbsp;&nbsp; '总金额为'+convert(varchar,@total_price)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; go<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font><font color=#000000><font size=3><strong>存储过程的3种传回值:<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.以Return传回整数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.以output格式传回参数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.Recordset<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 传回值的区别:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实例3：设有两个表为Product,Order,其表内容如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Product<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 产品编号&nbsp;&nbsp; 产品名称&nbsp;&nbsp; 客户订数&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 001&nbsp;&nbsp; 钢笔&nbsp;&nbsp; 30&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 002&nbsp;&nbsp; 毛笔&nbsp;&nbsp; 50&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 003&nbsp;&nbsp; 铅笔&nbsp;&nbsp; 100&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Order&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 产品编号&nbsp;&nbsp; 客户名&nbsp;&nbsp; 客户订金<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 001&nbsp;&nbsp; 南山区&nbsp;&nbsp; $30<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 002&nbsp;&nbsp; 罗湖区&nbsp;&nbsp; $50<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 003&nbsp;&nbsp; 宝安区&nbsp;&nbsp; $4<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 请实现按编号为连接条件,将两个表连接成一个临时表,该表只含编号.产品名.客户名.订金.总金额,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总金额=订金*订数,临时表放在存储过程中<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 代码如下:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Create&nbsp;&nbsp; proc&nbsp;&nbsp; temp_sale<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select&nbsp;&nbsp; a.产品编号,a.产品名称,b.客户名,b.客户订金,a.客户订数*&nbsp;&nbsp; b.客户订金&nbsp;&nbsp; as总金额<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; into&nbsp;&nbsp; #temptable&nbsp;&nbsp; from&nbsp;&nbsp; Product&nbsp;&nbsp; a&nbsp;&nbsp; inner&nbsp;&nbsp; join&nbsp;&nbsp; Order&nbsp;&nbsp; b&nbsp;&nbsp; on&nbsp;&nbsp; a.产品编号=b.产品编号<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;&nbsp; @@error=0&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print&nbsp;&nbsp; 'Good'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print&nbsp;&nbsp; 'Fail'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; go </font></font></p>
<p><font color=#000000 size=3>--------------------------------------------------------------------------------------------------------------------</font></p>
<p dir=ltr><font color=#000000><font size=3><strong>存储过程介绍</strong>&nbsp;&nbsp; </font></font></p>
<blockquote dir=ltr style="MARGIN-RIGHT: 0px">
<p><font color=#000000><font size=3><strong>一、先介绍一下什么是存储过程&nbsp;&nbsp; <br></strong>存储过程是利用SQL&nbsp;&nbsp; Server所提供的Tranact-SQL语言所编写的程序。Tranact-SQL语言是SQL&nbsp;&nbsp; Server提供专为设计数据库应用程序的语言，它是应用程序和SQL&nbsp;&nbsp; Server数据库间的主要程序式设计界面。它好比Oracle数据库系统中的Pro-SQL和Informix的数据库系统能够中的Informix-4GL语言一样。这类语言主要提供以下功能，让用户可以设计出符合引用需求的程序：&nbsp;&nbsp; <br>1)、变量说明&nbsp;&nbsp; <br>2)、ANSI兼容的SQL命令(如Select,Update&#8230;.)&nbsp;&nbsp; <br>3)、一般流程控制命令(if&#8230;else&#8230;、while&#8230;.)&nbsp;&nbsp; <br>4)、内部函数&nbsp;&nbsp; </font></font></p>
<p><strong><font color=#000000 size=3>二、存储过程的书写格式&nbsp;&nbsp; </font></strong></p>
<p><font color=#000000 size=3>CREATE&nbsp;&nbsp; PROCEDURE&nbsp;&nbsp; [拥有者.]存储过程名[;程序编号]&nbsp;&nbsp; <br>[(参数#1,&#8230;参数#1024)]&nbsp;&nbsp; <br>[WITH&nbsp;&nbsp; <br>{RECOMPILE&nbsp;&nbsp; |&nbsp;&nbsp; ENCRYPTION&nbsp;&nbsp; |&nbsp;&nbsp; RECOMPILE,&nbsp;&nbsp; ENCRYPTION}&nbsp;&nbsp; <br>]&nbsp;&nbsp; <br>[FOR&nbsp;&nbsp; REPLICATION]&nbsp;&nbsp; <br>AS&nbsp;&nbsp; 程序行&nbsp;&nbsp; </font></p>
<p><font color=#000000 size=3>其中存储过程名不能超过128个字。每个存储过程中最多设定1024个参数&nbsp;&nbsp; <br>(SQL&nbsp;&nbsp; Server&nbsp;&nbsp; 7.0以上版本),参数的使用方法如下:&nbsp;&nbsp; </font></p>
<p><font color=#000000 size=3>@参数名&nbsp;&nbsp; 数据类型&nbsp;&nbsp; [VARYING]&nbsp;&nbsp; [=内定值]&nbsp;&nbsp; [OUTPUT]&nbsp;&nbsp; </font></p>
<p><font color=#000000 size=3>每个参数名前要有一个&#8220;@&#8221;符号,每一个存储过程的参数仅为该程序内部使用,参数的类型除了IMAGE外，其他SQL&nbsp;&nbsp; Server所支持的数据类型都可使用。&nbsp;&nbsp; <br>[=内定值]相当于我们在建立数据库时设定一个字段的默认值，这里是为这个参数设定默认值。[OUTPUT]是用来指定该参数是既有输入又有输出值的，也就是在调用了这个存储过程时，如果所指定的参数值是我们需要输入的参数，同时也需要在结果中输出的，则该项必须为OUTPUT，而如果只是做输出参数用，可以用CURSOR，同时在使用该参数时，必须指定VARYING和OUTPUT这两个语句。&nbsp;&nbsp; </font></p>
<p><font color=#000000 size=3>例子:&nbsp;&nbsp; <br>CREATE&nbsp;&nbsp; PROCEDURE&nbsp;&nbsp; order_tot_amt&nbsp;&nbsp; @o_id&nbsp;&nbsp; int,@p_tot&nbsp;&nbsp; int&nbsp;&nbsp; output&nbsp;&nbsp; AS&nbsp;&nbsp; <br>SELECT&nbsp;&nbsp; @p_tot&nbsp;&nbsp; =&nbsp;&nbsp; sum(Unitprice*Quantity)&nbsp;&nbsp; <br>FROM&nbsp;&nbsp; orderdetails&nbsp;&nbsp; <br>WHERE&nbsp;&nbsp; ōrdered=@o_id&nbsp;&nbsp; </font></p>
<p><font color=#000000 size=3>例子说明:&nbsp;&nbsp; <br>该例子是建立一个简单的存储过程order_tot_amt,这个存储过程根据用户输入的定单ID号码(@o_id),由定单明细表(orderdetails)中计算该定单销售总额[单价(Unitprice)*数量(Quantity)],这一金额通过@p_tot这一参数输出给调用这一存储过程的程序&nbsp;&nbsp; </font></p>
<p><font color=#000000><font size=3><strong>三、在SQL&nbsp;&nbsp; Server中执行存储过程</strong>&nbsp;&nbsp; </font></font></p>
<p><font color=#000000 size=3>在SQL&nbsp;&nbsp; Server的查询分析器中，输入以下代码:&nbsp;&nbsp; <br>declare&nbsp;&nbsp; @tot_amt&nbsp;&nbsp; int&nbsp;&nbsp; <br>execute&nbsp;&nbsp; order_tot_amt&nbsp;&nbsp; 1,@tot_amt&nbsp;&nbsp; output&nbsp;&nbsp; <br>select&nbsp;&nbsp; @tot_amt&nbsp;&nbsp; </font></p>
<p><font color=#000000 size=3>以上代码是执行order_tot_amt这一存储过程，以计算出定单编号为1的定单销售金额，我们定义@tot_amt为输出参数，用来承接我们所要的结果 </font></p>
</blockquote></span>
<img src ="http://www.cppblog.com/jacky2019/aggbug/35937.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-11-06 10:37 <a href="http://www.cppblog.com/jacky2019/archive/2007/11/06/35937.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>汉字编码问题</title><link>http://www.cppblog.com/jacky2019/archive/2007/11/01/35693.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Thu, 01 Nov 2007 06:53:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/11/01/35693.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/35693.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/11/01/35693.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/35693.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/35693.html</trackback:ping><description><![CDATA[<font face=宋体><a href="http://www.css8.cn/css8_document/gb2312.htm">http://www.css8.cn/css8_document/gb2312.htm</a><br><br>由于常常要和汉字处理打交道，因此，我常常受到汉字编码问题的困扰。在不断的打击与坚持中，也积累了一点汉字编码方面的经验，想和大家一起分享。</font>
<p class=MsoNormal><span style="COLOR: black; FONT-FAMILY: 宋体">一、汉字编码的种类</span></p>
<p class=MsoNormal><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: black; FONT-FAMILY: 宋体">汉字编码中现在主要用到的有三类，包括<span lang=EN-US>GBK</span>，<span lang=EN-US>GB2312</span>和<span lang=EN-US>Big5</span>。</span></p>
<p class=MsoNormal><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp; 1</span><span style="COLOR: black; FONT-FAMILY: 宋体">、<span lang=EN-US>GB2312</span>又称国标码，</span><span style="FONT-FAMILY: 宋体">由国家标准总局发布，</span><span lang=EN-US>1981</span><span style="FONT-FAMILY: 宋体">年</span><span lang=EN-US>5</span><span style="FONT-FAMILY: 宋体">月</span><span lang=EN-US>1</span><span style="FONT-FAMILY: 宋体">日实施，通行于大陆。新加坡等地也使用此编码。它是一个简化字的编码规范，当然也包括其他的符号、字母、日文假名等，共</span><span lang=EN-US>7445</span><span style="FONT-FAMILY: 宋体">个图形字符，其中汉字占</span><span lang=EN-US>6763</span><span style="FONT-FAMILY: 宋体">个。我们平时说</span><span lang=EN-US>6768</span><span style="FONT-FAMILY: 宋体">个汉字，实际上里边有</span><span lang=EN-US>5</span><span style="FONT-FAMILY: 宋体">个编码为空白，所以总共有</span><span lang=EN-US>6763</span><span style="FONT-FAMILY: 宋体">个汉字。</span></p>
<p class=MsoNormal><span lang=EN-US>&nbsp; &nbsp;&nbsp;&nbsp; GB2312</span><span style="FONT-FAMILY: 宋体">规定&#8220;对任意一个图形字符都采用两个字节表示，每个字节均采用七位编码表示&#8221;，习惯上称第一个字节为&#8220;高字节&#8221;，第二个字节为&#8220;低字节&#8221;。</span><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体">GB2312</span><span style="COLOR: black; FONT-FAMILY: 宋体">中汉字的编码范围为，第一字节<span lang=EN-US>0xB0-0xF7(</span>对应十进制为<span lang=EN-US>176-247)</span>，第二个字节<span lang=EN-US>0xA0-0xFE</span>（对应十进制为<span lang=EN-US>160-254</span>）。</span></p>
<p class=MsoNormal><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp; </span><span lang=EN-US>GB2312</span><span style="FONT-FAMILY: 宋体">将代码表分为</span><span lang=EN-US>94</span><span style="FONT-FAMILY: 宋体">个区，对应第一字节（</span><span lang=EN-US style="FONT-FAMILY: 宋体">0xa1-0xfe</span><span style="FONT-FAMILY: 宋体">）；每个区</span><span lang=EN-US>94</span><span style="FONT-FAMILY: 宋体">个位（</span><span lang=EN-US style="FONT-FAMILY: 宋体">0xa1-0xfe</span><span style="FONT-FAMILY: 宋体">），对应第二字节，两个字节的值分别为区号值和位号值加</span><span lang=EN-US>32</span><span style="FONT-FAMILY: 宋体">（</span><span lang=EN-US>2OH</span><span style="FONT-FAMILY: 宋体">），因此也称为区位码。</span><span lang=EN-US>01-09</span><span style="FONT-FAMILY: 宋体">区为符号、数字区，</span><span lang=EN-US>16-87</span><span style="FONT-FAMILY: 宋体">区为汉字区（</span><span lang=EN-US style="FONT-FAMILY: 宋体">0xb0-0xf7</span><span style="FONT-FAMILY: 宋体">），</span><span lang=EN-US>10-15</span><span style="FONT-FAMILY: 宋体">区、</span><span lang=EN-US>88-94</span><span style="FONT-FAMILY: 宋体">区是有待进一步标准化的空白区。</span></p>
<p class=MsoNormal><span lang=EN-US></span>&nbsp;</p>
<p class=MsoNormal><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2</span><span style="FONT-FAMILY: 宋体">、</span><span lang=EN-US>Big5</span><span style="FONT-FAMILY: 宋体">又称大五码，主要为香港与台湾使用，即是一个繁体字编码。</span><span style="COLOR: black; FONT-FAMILY: 宋体">每个汉字由两个字节构成，第一个字节的范围从</span><span lang=EN-US style="COLOR: black; FONT-FAMILY: Arial">0X81</span><span style="COLOR: black; FONT-FAMILY: 宋体">－</span><span lang=EN-US style="COLOR: black; FONT-FAMILY: Arial">0XFE</span><span style="COLOR: black; FONT-FAMILY: 宋体">（即</span><span lang=EN-US style="COLOR: black; FONT-FAMILY: Arial">129-255</span><span style="COLOR: black; FONT-FAMILY: 宋体">），共</span><span lang=EN-US style="COLOR: black; FONT-FAMILY: Arial">126</span><span style="COLOR: black; FONT-FAMILY: 宋体">种。第二个字节的范围不连续，分别为</span><span lang=EN-US style="COLOR: black; FONT-FAMILY: Arial">0X40</span><span style="COLOR: black; FONT-FAMILY: 宋体">－</span><span lang=EN-US style="COLOR: black; FONT-FAMILY: Arial">0X7E</span><span style="COLOR: black; FONT-FAMILY: 宋体">（即</span><span lang=EN-US style="COLOR: black; FONT-FAMILY: Arial">64-126</span><span style="COLOR: black; FONT-FAMILY: 宋体">），</span><span lang=EN-US style="COLOR: black; FONT-FAMILY: Arial">0XA1</span><span style="COLOR: black; FONT-FAMILY: 宋体">－</span><span lang=EN-US style="COLOR: black; FONT-FAMILY: Arial">0XFE</span><span style="COLOR: black; FONT-FAMILY: 宋体">（即</span><span lang=EN-US style="COLOR: black; FONT-FAMILY: Arial">161-254</span><span style="COLOR: black; FONT-FAMILY: 宋体">），共</span><span lang=EN-US style="COLOR: black; FONT-FAMILY: Arial">157</span><span style="COLOR: black; FONT-FAMILY: 宋体">种。</span></p>
<p class=MsoNormal><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体"></span>&nbsp;</p>
<p class=MsoNormal><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp; 3</span><span style="COLOR: black; FONT-FAMILY: 宋体">、<span lang=EN-US>GBK</span>是<span lang=EN-US>GB2312</span>的扩展，是向上兼容的，因此<span lang=EN-US>GB2312</span>中的汉字的编码与<span lang=EN-US>GBK</span>中汉字的相同。另外，<span lang=EN-US>GBK</span>中还包含繁体字的编码，它与<span lang=EN-US>Big5</span>编码之间的关系我还没有弄明白，好像是不一致的。<span lang=EN-US>GBK</span>中每个汉字仍然包含两个字节，第一个字节的范围是<span lang=EN-US>0x81-0xFE</span>（即<span lang=EN-US>129-254</span>），第二个字节的范围是<span lang=EN-US>0x40-0xFE</span>（即<span lang=EN-US>64-254</span>）。<span lang=EN-US>GBK</span>中有码位<span lang=EN-US>23940</span>个，包含汉字<span lang=EN-US>21003</span>个。</span></p>
<p class=MsoNormal><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p class=MsoNormal><span lang=en-us style="FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: black; FONT-FAMILY: 宋体">表<span lang=EN-US>1 </span>汉字编码范围</span></p>
<table class=MsoTableGrid id=table1 style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN-LEFT: 50.4pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 81pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" vAlign=top width=108>
            <p class=MsoNormal><span style="COLOR: black; FONT-FAMILY: 宋体">名称</span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 144pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" vAlign=top width=192>
            <p class=MsoNormal><span style="COLOR: black; FONT-FAMILY: 宋体">第一字节</span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 153pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" vAlign=top width=204>
            <p class=MsoNormal><span style="COLOR: black; FONT-FAMILY: 宋体">第二字节</span></p>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 81pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" vAlign=top width=108>
            <p class=MsoNormal><span lang=EN-US style="COLOR: black">GB2312</span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 144pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" vAlign=top width=192>
            <p class=MsoNormal><span lang=EN-US style="COLOR: black">0xB0-0xF7(176-247) </span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 153pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" vAlign=top width=204>
            <p class=MsoNormal><span lang=EN-US style="COLOR: black">0xA0-0xFE</span><span style="COLOR: black; FONT-FAMILY: 宋体">（</span><span lang=EN-US style="COLOR: black">160-254</span><span style="COLOR: black; FONT-FAMILY: 宋体">）</span></p>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 81pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" vAlign=top width=108>
            <p class=MsoNormal><span lang=EN-US style="COLOR: black">GBK</span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 144pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" vAlign=top width=192>
            <p class=MsoNormal><span lang=EN-US style="COLOR: black">0x81-0xFE</span><span style="COLOR: black; FONT-FAMILY: 宋体">（</span><span lang=EN-US style="COLOR: black">129-254</span><span style="COLOR: black; FONT-FAMILY: 宋体">）</span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 153pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" vAlign=top width=204>
            <p class=MsoNormal><span lang=EN-US style="COLOR: black">0x40-0xFE</span><span style="COLOR: black; FONT-FAMILY: 宋体">（</span><span lang=EN-US style="COLOR: black">64-254</span><span style="COLOR: black; FONT-FAMILY: 宋体">）</span></p>
            </td>
        </tr>
        <tr>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 81pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" vAlign=top width=108>
            <p class=MsoNormal><span lang=EN-US style="COLOR: black">Big5</span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 144pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" vAlign=top width=192>
            <p class=MsoNormal><span lang=EN-US style="COLOR: black">0x81-0xFE</span><span style="COLOR: black; FONT-FAMILY: 宋体">（</span><span lang=EN-US style="COLOR: black">129-255</span><span style="COLOR: black; FONT-FAMILY: 宋体">）</span></p>
            </td>
            <td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 153pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" vAlign=top width=204>
            <p class=MsoNormal><span lang=EN-US style="COLOR: black">0x40-0x7E</span><span style="COLOR: black; FONT-FAMILY: 宋体">（</span><span lang=EN-US style="COLOR: black">64-126</span><span style="COLOR: black; FONT-FAMILY: 宋体">）</span></p>
            <p class=MsoNormal><span lang=EN-US style="COLOR: black">0xA1</span><span style="COLOR: black; FONT-FAMILY: 宋体">－</span><span lang=EN-US style="COLOR: black">0xFE</span><span style="COLOR: black; FONT-FAMILY: 宋体">（</span><span lang=EN-US style="COLOR: black">161-254</span><span style="COLOR: black; FONT-FAMILY: 宋体">）</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p class=MsoNormal><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体"></span>&nbsp;</p>
<p class=MsoNormal><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体"></span>&nbsp;</p>
<p class=MsoNormal><span style="COLOR: black; FONT-FAMILY: 宋体">二、对汉字进行<span lang=EN-US>hash</span></span></p>
<p class=MsoNormal><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: black; FONT-FAMILY: 宋体">为了处理汉字的方便，在查找汉字的时候，我们通常会用到<span lang=EN-US>hash</span>的方法，那怎么来确定一个汉字位置呢？这就和每种编码的排列有关了，这里主要给出一种<span lang=EN-US>hash</span>函数的策略。</span></p>
<p class=MsoNormal><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: black; FONT-FAMILY: 宋体">对于<span lang=EN-US>GB2312</span>编码，设输入的汉字为<span lang=EN-US>GBword</span>，我们可以采用公式<span lang=EN-US>(C1-176)*94 + (C2-161)</span>确定<span lang=EN-US>GBindex</span>。其中，<span lang=EN-US>C1</span>表示第一字节，<span lang=EN-US>C2</span>表示第二字节。具体如下：</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="COLOR: #3700c8; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp; GBindex = ((unsigned char)GBword.at(0)-176)*94 + (unsigned char)GBword.at(1) - 161;</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="FONT-FAMILY: 宋体">之所以用<span lang=EN-US>unsigned char</span>类型，是因为<span lang=EN-US>char</span>是一个字节，如果用<span lang=EN-US>unsigend int</span>，因为<span lang=EN-US>int</span>是<span lang=EN-US>4</span>个字节的，所以会造成扩展，导致错误。</span></p>
<p class=MsoNormal style="MARGIN-LEFT: 18.05pt; TEXT-INDENT: -35.9pt; TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="FONT-FAMILY: 宋体">对于<span lang=EN-US>GBK</span>编码，设输入的汉字为<span lang=EN-US>GBKword</span>，则可以采用公式<span lang=EN-US>&nbsp;&nbsp; </span></span><span lang=EN-US style="FONT-FAMILY: 宋体">index=(ch1-0x81)*190+(ch2-0x40)-(ch2/128)</span><span style="FONT-FAMILY: 宋体">，其中<span lang=EN-US>ch1</span>是第一字节，<span lang=EN-US>ch2</span>是第二字节。</span></p>
<p class=MsoNormal><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: black; FONT-FAMILY: 宋体">具体的，</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #3700c8; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp; GBKindex = ((unsigned char)GBKword[0]-129)*190 +</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #3700c8; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((unsigned char)GBKword[1]-64) - (unsigned char)GBKword[1]/128;</span></p>
<p class=MsoNormal><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体"></span>&nbsp;</p>
<p class=MsoNormal><span style="COLOR: black; FONT-FAMILY: 宋体">三、怎样判断一个汉字的是什么编码</span></p>
<p class=MsoNormal><span style="COLOR: black; FONT-FAMILY: 宋体">直接根据汉字的编码范围判断，对于<span lang=EN-US>GB2312</span>和<span lang=EN-US>GBK</span>可用下面两个程序实现。</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体">1</span><span style="COLOR: black; FONT-FAMILY: 宋体">、判断是否是<span lang=EN-US>GB2312</span></span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">bool isGBCode(const string&amp; strIn)</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">{</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp; unsigned char ch1;</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp; unsigned char ch2;</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp; </span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp; if (strIn.size() &gt;= 2)</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp; {</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch1 = (unsigned char)strIn.at(0);</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch2 = (unsigned char)strIn.at(1);</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ch1&gt;=176 &amp;&amp; ch1&lt;=247 &amp;&amp; ch2&gt;=160 &amp;&amp; ch2&lt;=254)</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else return false;</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp; }</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp; else return false;</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Fixedsys">}</span></p>
<p class=MsoNormal><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体">2</span><span style="COLOR: black; FONT-FAMILY: 宋体">、判断是否是<span lang=EN-US>GBK</span>编码</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">bool isGBKCode(const string&amp; strIn)</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">{</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp; unsigned char ch1;</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp; unsigned char ch2;</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp; </span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">if (strIn.size() &gt;= 2)</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp; {</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">ch1 = (unsigned char)strIn.at(0);</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch2 = (unsigned char)strIn.at(1);</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ch1&gt;=129 &amp;&amp; ch1&lt;=254 &amp;&amp; ch2&gt;=64 &amp;&amp; ch2&lt;=254)</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else return false;</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp; }</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">&nbsp;&nbsp;&nbsp; else return false;</span></p>
<p class=MsoNormal style="TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Fixedsys">}</span></p>
<p class=MsoNormal><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体"></span>&nbsp;</p>
<p class=MsoNormal><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体">3</span><span style="COLOR: black; FONT-FAMILY: 宋体">、对于<span lang=EN-US>Big5</span></span></p>
<p class=MsoPlainText><span lang=EN-US>&nbsp;&nbsp;&nbsp; </span>它的范围为：高字节从<span lang=EN-US>0xA0</span>到<span lang=EN-US>0xFE</span>，低字节从<span lang=EN-US>0x40</span>到<span lang=EN-US>0x7E</span>，和<span lang=EN-US>0xA1</span>到<span lang=EN-US>0xFE</span>两部分。判断一个汉字是否是<span lang=EN-US>BIG5</span>编码，可以如上对字符的编码范围判断即可。如何定位呢？那么也想象所有编码排列为一个二维坐标，纵坐标是高字节，横坐标是低字节。这样一行上的汉字个数：<span lang=EN-US>(0x7E-0x40+1)+(0xFE-0xA1+1)</span>＝<span lang=EN-US>157</span>。那么定位算法分两块，为<span lang=EN-US>: &nbsp;</span></p>
<p class=MsoPlainText><span lang=EN-US>&nbsp;&nbsp;&nbsp; if 0x40&lt;=ch2&lt;=0x7E: #is big5 char </span></p>
<p class=MsoPlainText>&nbsp;&nbsp;&nbsp; <span lang=PT-BR>index=((ch1-0xA1)*157+(ch2-0x40))*2 </span></p>
<p class=MsoPlainText><span lang=EN-US>&nbsp;&nbsp;&nbsp; elif 0xA1&lt;=ch2&lt;=0xFE: #is big5 char </span></p>
<p class=MsoPlainText>&nbsp;&nbsp;&nbsp; <span lang=PT-BR>index=((ch1-0xA1)*157+(ch2-0xA1+63))*2 </span></p>
<p class=MsoPlainText><span lang=PT-BR></span>&nbsp;</p>
<p class=MsoNormal><span style="FONT-FAMILY: 宋体">对于第二块，计算偏移量时因为有两块数值，所以在计算后面一段值时，不要忘了前面还有一段值。<span lang=EN-US>0x7E-0x40+1=63</span>。</span></p>
<p class=MsoNormal><span lang=EN-US style="FONT-FAMILY: 宋体"></span>&nbsp;</p>
<p class=MsoNormal><span style="FONT-FAMILY: 宋体">四、如果判断一个字符是西文字符还是中文字符</span></p>
<p class=MsoNormal><span lang=EN-US style="FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="FONT-FAMILY: 宋体">大家知道西文字符主要是指</span><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体">ASCII</span><span style="COLOR: black; FONT-FAMILY: 宋体">码，它用一个字节表示。且这个字符转换成数字之后，该数字是大于<span lang=EN-US>0</span>的，而汉字是两个字节的，第一个字节的转化为数字之后应该是小于<span lang=EN-US>0</span>的，因此可以根据每个字节转化为数字之后是否小于<span lang=EN-US>0</span>，判断它是否是汉字。</span></p>
<p class=MsoNormal><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: black; FONT-FAMILY: 宋体">例如，设输入字为<span lang=EN-US>strin</span>，则，</span></p>
<p class=MsoNormal><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; If (strin.at(0) &lt; 0)</span></p>
<p class=MsoNormal><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; &#8221;</span><span style="COLOR: black; FONT-FAMILY: 宋体">是汉字<span lang=EN-US>&#8221; &lt;&lt; endl;</span></span></p>
<p class=MsoNormal><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; else cout &lt;&lt; &#8221;</span><span style="COLOR: black; FONT-FAMILY: 宋体">不是汉字<span lang=EN-US>&#8221; &lt;&lt; endl;</span></span></p>
<img src ="http://www.cppblog.com/jacky2019/aggbug/35693.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-11-01 14:53 <a href="http://www.cppblog.com/jacky2019/archive/2007/11/01/35693.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用数据类型使用转换详解</title><link>http://www.cppblog.com/jacky2019/archive/2007/11/01/35657.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Thu, 01 Nov 2007 01:30:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/11/01/35657.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/35657.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/11/01/35657.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/35657.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/35657.html</trackback:ping><description><![CDATA[<p><font style="BACKGROUND-COLOR: #ffffff" color=#009900><a href="http://www.vckbase.com/study/article/data_convert.htm">http://www.vckbase.com/study/article/data_convert.htm</a></font><font color=#009900></p>
<p align=left><br><br><br><strong>常用数据类型使用转换详解<br></strong></font>作者：程佩君</p>
<hr noShade SIZE=1>
<table class=big height=2155 cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td vAlign=top height=2418>
            <p>读者层次：<font color=#006699>初学</font><br><br>刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解，本文将介绍一些常用数据类型的使用。<br><br>我们先定义一些常见类型变量借以说明</p>
            <p>int i = 100;<br>long l = 2001;<br>float f=300.2;<br>double d=12345.119;<br>char username[]="程佩君";<br>char temp[200];<br>char *buf;<br>CString str;<br>_variant_t v1;<br>_bstr_t v2;<br><br><font color=#6699ff><strong>一、其它数据类型转换为字符串</strong></font><br></p>
            <ul>
                <li><font color=#6699ff>短整型(int)</font><br>itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制<br>itoa(i,temp,2); ///按二进制方式转换
                <li><font color=#6699ff>长整型(long)</font><br>ltoa(l,temp,10);
                <li><font color=#6699ff>浮点数(float,double)</font><br>用fcvt可以完成转换,这是MSDN中的例子:<br>int decimal, sign; <br>char *buffer; <br>double source = 3.1415926535; <br>buffer = _fcvt( source, 7, &amp;decimal, &amp;sign ); <br>运行结果:source: 3.1415926535 buffer: '31415927' decimal: 1 sign: 0<br>decimal表示小数点的位置,sign表示符号:0为正数，1为负数
                <li><font color=#6699ff>CString变量</font><br>str = "2008北京奥运";<br>buf = (LPSTR)(LPCTSTR)str;
                <li><font color=#6699ff>BSTR变量</font><br>BSTR bstrValue = ::SysAllocString(L"程序员"); <br>char * buf = _com_util::ConvertBSTRToString(bstrValue); <br>SysFreeString(bstrValue); <br>AfxMessageBox(buf); <br>delete(buf);
                <li><font color=#6699ff>CComBSTR变量</font><br>CComBSTR bstrVar("test"); <br>char *buf = _com_util::ConvertBSTRToString(bstrVar.m_str); <br>AfxMessageBox(buf); <br>delete(buf); <br>
                <li><font color=#6699ff>_bstr_t变量</font><br>_bstr_t类型是对BSTR的封装，因为已经重载了=操作符，所以很容易使用<br>_bstr_t bstrVar("test"); <br>const char *buf = bstrVar;///不要修改buf中的内容 <br>AfxMessageBox(buf); <br><br>
                <li><font color=#6699ff>通用方法(针对非COM数据类型)</font><br>用sprintf完成转换<br>
                <pre>char  buffer[200];
                char  c = '1';
                int   i = 35;
                long  j = 1000;
                float f = 1.7320534f;
                sprintf( buffer, "%c",c);
                sprintf( buffer, "%d",i);
                sprintf( buffer, "%d",j);
                sprintf( buffer, "%f",f);
                </pre>
                </li>
            </ul>
            <p><strong><font color=#6699ff>二、字符串转换为其它数据类型</font></strong><br>strcpy(temp,"123"); </p>
            <ul>
                <li><font color=#6699ff>短整型(int)</font><br>i = atoi(temp);
                <li><font color=#6699ff>长整型(long)</font><br>l = atol(temp);
                <li><font color=#6699ff>浮点(double)</font><br>d = atof(temp);
                <li><font color=#6699ff>CString变量</font><br>CString name = temp;
                <li><font color=#6699ff>BSTR变量</font> <br>BSTR bstrValue = ::SysAllocString(L"程序员"); <br>...///完成对bstrValue的使用<br>SysFreeString(bstrValue); <br>
                <li><font color=#6699ff>CComBSTR变量</font><br>CComBSTR类型变量可以直接赋值<br>CComBSTR bstrVar1("test");<br>CComBSTR bstrVar2(temp);<br>
                <li><font color=#6699ff>_bstr_t变量</font><br>_bstr_t类型的变量可以直接赋值<br>_bstr_t bstrVar1("test"); <br>_bstr_t bstrVar2(temp); <br><br></li>
            </ul>
            <p><strong><font color=#6699ff>三、其它数据类型转换到CString</font></strong><br>使用CString的成员函数Format来转换,例如:<br></p>
            <ul>
                <li>整数(int)<br>str.Format("%d",i);
                <li>浮点数(float)<br>str.Format("%f",i);
                <li>字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值<br>str = username;
                <li>对于Format所不支持的数据类型，可以通过上面所说的关于其它数据类型转化到char *的方法先转到char *，然后赋值给CString变量。<br></li>
            </ul>
            <p><strong><font color=#6699ff>四、BSTR、_bstr_t与CComBSTR</font></strong><br></p>
            <ul>
                <li>CComBSTR 是ATL对BSTR的封装，_bstr_t是C++对BSTR的封装,BSTR是32位指针,但并不直接指向字串的缓冲区。<br>char *转换到BSTR可以这样: <br>BSTR b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上comutil.h和comsupp.lib<br>SysFreeString(bstrValue); <br>反之可以使用<br>char *p=_com_util::ConvertBSTRToString(b);<br>delete p;<br>具体可以参考一，二段落里的具体说明。<br><br>CComBSTR与_bstr_t对大量的操作符进行了重载，可以直接进行=,!=,==等操作，所以使用非常方便。<br>特别是_bstr_t,建议大家使用它。<br></li>
            </ul>
            <p>&#160;</p>
            <p><strong><font color=#6699ff>五、VARIANT 、_variant_t 与 COleVariant</font></strong><br></p>
            <ul>
                <li>VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。<br>对于VARIANT变量的赋值：首先给vt成员赋值，指明数据类型，再对联合结构中相同数据类型的变量赋值，举个例子：<br>VARIANT va;<br>int a=2001;<br>va.vt=VT_I4;///指明整型数据<br>va.lVal=a; ///赋值<br><br>对于不马上赋值的VARIANT，最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:<br><br>
                <table cellSpacing=1 cellPadding=0 width=792 bgColor=#333333 border=0>
                    <tbody>
                        <tr bgColor=#ffffff>
                            <td width=442>Byte bVal; </td>
                            <td width=338>// VT_UI1.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>Short iVal; </td>
                            <td width=338>// VT_I2.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>long lVal; </td>
                            <td width=338>// VT_I4.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>float fltVal; </td>
                            <td width=338>// VT_R4.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>double dblVal; </td>
                            <td width=338>// VT_R8.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>VARIANT_BOOL boolVal; </td>
                            <td width=338>// VT_BOOL.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>SCODE scode; </td>
                            <td width=338>// VT_ERROR.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>CY cyVal; </td>
                            <td width=338>// VT_CY.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>DATE date; </td>
                            <td width=338>// VT_DATE.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>BSTR bstrVal; </td>
                            <td width=338>// VT_BSTR.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>DECIMAL FAR* pdecVal </td>
                            <td width=338>// VT_BYREF|VT_DECIMAL.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>IUnknown FAR* punkVal; </td>
                            <td width=338>// VT_UNKNOWN.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>IDispatch FAR* pdispVal; </td>
                            <td width=338>// VT_DISPATCH.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>SAFEARRAY FAR* parray; </td>
                            <td width=338>// VT_ARRAY|*.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>Byte FAR* pbVal; </td>
                            <td width=338>// VT_BYREF|VT_UI1.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>short FAR* piVal; </td>
                            <td width=338>// VT_BYREF|VT_I2.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>long FAR* plVal; </td>
                            <td width=338>// VT_BYREF|VT_I4.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>float FAR* pfltVal; </td>
                            <td width=338>// VT_BYREF|VT_R4.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>double FAR* pdblVal; </td>
                            <td width=338>// VT_BYREF|VT_R8.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>VARIANT_BOOL FAR* pboolVal; </td>
                            <td width=338>// VT_BYREF|VT_BOOL.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>SCODE FAR* pscode; </td>
                            <td width=338>// VT_BYREF|VT_ERROR.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>CY FAR* pcyVal; </td>
                            <td width=338>// VT_BYREF|VT_CY.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>DATE FAR* pdate; </td>
                            <td width=338>// VT_BYREF|VT_DATE.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>BSTR FAR* pbstrVal; </td>
                            <td width=338>// VT_BYREF|VT_BSTR.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>IUnknown FAR* FAR* ppunkVal; </td>
                            <td width=338>// VT_BYREF|VT_UNKNOWN.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>IDispatch FAR* FAR* ppdispVal; </td>
                            <td width=338>// VT_BYREF|VT_DISPATCH.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>SAFEARRAY FAR* FAR* pparray; </td>
                            <td width=338>// VT_ARRAY|*.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>VARIANT FAR* pvarVal; </td>
                            <td width=338>// VT_BYREF|VT_VARIANT.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>void FAR* byref; </td>
                            <td width=338>// Generic ByRef.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>char cVal; </td>
                            <td width=338>// VT_I1.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>unsigned short uiVal; </td>
                            <td width=338>// VT_UI2.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>unsigned long ulVal; </td>
                            <td width=338>// VT_UI4.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>int intVal; </td>
                            <td width=338>// VT_INT.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>unsigned int uintVal; </td>
                            <td width=338>// VT_UINT.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>char FAR * pcVal; </td>
                            <td width=338>// VT_BYREF|VT_I1.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>unsigned short FAR * puiVal; </td>
                            <td width=338>// VT_BYREF|VT_UI2.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>unsigned long FAR * pulVal; </td>
                            <td width=338>// VT_BYREF|VT_UI4.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>int FAR * pintVal; </td>
                            <td width=338>// VT_BYREF|VT_INT.</td>
                        </tr>
                        <tr bgColor=#ffffff>
                            <td width=442>unsigned int FAR * puintVal; </td>
                            <td width=338>//VT_BYREF|VT_UINT.</td>
                        </tr>
                    </tbody>
                </table>
                <br>
                <li>_variant_t是VARIANT的封装类，其赋值可以使用强制类型转换，其构造函数会自动处理这些数据类型。<br>使用时需加上#include &lt;comdef.h&gt;<br>例如：<br>long l=222;<br>ing i=100;<br>_variant_t lVal(l);<br>lVal = (long)i;<br><br>
                <li>COleVariant的使用与_variant_t的方法基本一样，请参考如下例子：<br>COleVariant v3 = "字符串", v4 = (long)1999;<br>CString str =(BSTR)v3.pbstrVal;<br>long i = v4.lVal;<br><br></li>
            </ul>
            <p><font color=#6699ff><strong>六、其它一些COM数据类型</strong></font></p>
            <ul>
                <li>根据ProgID得到CLSID<br>HRESULT CLSIDFromProgID( LPCOLESTR lpszProgID,LPCLSID pclsid);<br>CLSID clsid;<br>CLSIDFromProgID( L"MAPI.Folder",&amp;clsid);<br>
                <li>根据CLSID得到ProgID<br>WINOLEAPI ProgIDFromCLSID( REFCLSID clsid,LPOLESTR * lplpszProgID); <br>例如我们已经定义了 CLSID_IApplication,下面的代码得到ProgID<br>LPOLESTR pProgID = 0;<br>ProgIDFromCLSID( CLSID_IApplication,&amp;pProgID);<br>...///可以使用pProgID <br>CoTaskMemFree(pProgID);//不要忘记释放 <br></li>
            </ul>
            <p><font color=#6699ff><strong>七、ANSI与Unicode<br></strong></font>Unicode称为宽字符型字串,COM里使用的都是Unicode字符串。</p>
            <ul>
                <li>将ANSI转换到Unicode<br>(1)通过L这个宏来实现，例如: CLSIDFromProgID( L"MAPI.Folder",&amp;clsid);<br>(2)通过MultiByteToWideChar函数实现转换,例如:<br>char *szProgID = "MAPI.Folder";<br>WCHAR szWideProgID[128];<br>CLSID clsid;<br>long lLen = MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));<br>szWideProgID[lLen] = '\0'; <br>(3)通过A2W宏来实现,例如: <br>USES_CONVERSION; <br>CLSIDFromProgID( A2W(szProgID),&amp;clsid);
                <li>将Unicode转换到ANSI<br>(1)使用WideCharToMultiByte,例如:<br>// 假设已经有了一个Unicode 串 wszSomeString... <br>char szANSIString [MAX_PATH]; <br>WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL ); <br>(2)使用W2A宏来实现,例如:<br>USES_CONVERSION;<br>pTemp=W2A(wszSomeString); </li>
            </ul>
            <p><font color=#6699ff><strong>八、其它</strong></font></p>
            <ul>
                <li>对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据（DWORD)分解成两个16位数据（WORD),例如：<br>LPARAM lParam;<br>WORD loValue = LOWORD(lParam);///取低16位<br>WORD hiValue = HIWORD(lParam);///取高16位<br><br>
                <li>对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:<br>WORD wValue;<br>BYTE loValue = LOBYTE(wValue);///取低8位<br>BYTE hiValue = HIBYTE(wValue);///取高8位<br><br>
                <li>两个16位数据（WORD）合成32位数据(DWORD,LRESULT,LPARAM,或WPARAM)<br>LONG MAKELONG( WORD wLow, WORD wHigh );<br>WPARAM MAKEWPARAM( WORD wLow, WORD wHigh ); <br>LPARAM MAKELPARAM( WORD wLow, WORD wHigh );<br>LRESULT MAKELRESULT( WORD wLow, WORD wHigh ); <br><br>
                <li>两个8位的数据(BYTE)合成16位的数据(WORD)<br>WORD MAKEWORD( BYTE bLow, BYTE bHigh ); <br><br>
                <li>从R(red),G(green),B(blue)三色得到COLORREF类型的颜色值<br>COLORREF RGB( BYTE byRed,BYTE byGreen,BYTE byBlue );<br>例如COLORREF bkcolor = RGB(0x22,0x98,0x34);<br><br>
                <li>从COLORREF类型的颜色值得到RGB三个颜色值<br>BYTE Red = GetRValue(bkcolor); ///得到红颜色<br>BYTE Green = GetGValue(bkcolor); ///得到绿颜色<br>BYTE Blue = GetBValue(bkcolor); ///得到兰颜色<br></li>
            </ul>
            <p><font color=#6699ff><strong>九、注意事项</strong></font><br>假如需要使用到ConvertBSTRToString此类函数,需要加上头文件comutil.h,并在setting中加入comsupp.lib或者直接加上#pragma comment( lib, "comsupp.lib" )</p>
            <p>后记：本文匆匆写成，错误之处在所难免，欢迎指正.</p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cppblog.com/jacky2019/aggbug/35657.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-11-01 09:30 <a href="http://www.cppblog.com/jacky2019/archive/2007/11/01/35657.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>The difference between GetDC  and GetWindowDC</title><link>http://www.cppblog.com/jacky2019/archive/2007/04/21/22467.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Sat, 21 Apr 2007 04:54:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/04/21/22467.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/22467.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/04/21/22467.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/22467.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/22467.html</trackback:ping><description><![CDATA[<p><span>GetDC</span></p>
<p>The GetDC function retrieves a handle of a display device context (DC) for the client area of the specified window. The display device context can be used in subsequent GDI functions to draw in the client area of the window. </p>
<p>This function retrieves a common, class, or private device context depending on the class style specified for the specified window. For common device contexts, GetDC assigns default attributes to the device context each time it is retrieved. For class and private device contexts, GetDC leaves the previously assigned attributes unchanged. </p>
<p>HDC GetDC(</p>
<p><span>&nbsp;&nbsp;&nbsp; </span>HWND hWnd <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// handle of window&nbsp;</p>
<p><span>&nbsp;&nbsp; </span>);<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p>Parameters</p>
<p>hWnd</p>
<p>Identifies the window whose device context is to be retrieved.</p>
<p>&nbsp;</p>
<p><span>GetWindowDC</span></p>
<p>The GetWindowDC function retrieves the device context (DC) for the entire window, including title bar, menus, and scroll bars. A window device context permits painting anywhere in a window, because the origin of the device context is the upper-left corner of the window instead of the client area. </p>
<p>GetWindowDC assigns default attributes to the window device context each time it retrieves the device context. Previous attributes are lost. </p>
<p>HDC GetWindowDC(</p>
<p><span>&nbsp;&nbsp;&nbsp; </span>HWND hWnd <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// handle of window&nbsp;</p>
<p><span>&nbsp;&nbsp; </span>);<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p>Parameters</p>
<p>hWnd</p>
<p>Identifies the window with a device context that is to be retrieved.</p>
<img src ="http://www.cppblog.com/jacky2019/aggbug/22467.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-04-21 12:54 <a href="http://www.cppblog.com/jacky2019/archive/2007/04/21/22467.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动态语言</title><link>http://www.cppblog.com/jacky2019/archive/2007/04/16/22034.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Mon, 16 Apr 2007 10:15:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/04/16/22034.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/22034.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/04/16/22034.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/22034.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/22034.html</trackback:ping><description><![CDATA[<p><span>所谓动态语言，也叫脚本语言，就是说<strong>一种在执行期间才去发现数据类型的程序设计语言，主要创建一些需要</strong></span><strong><span>经常更新的动态系统。</span></strong><span>常见的有</span><span>Python, Lua, Perl, PHP<span>等。</span><strong></strong></span></p>
<p><span>以往，我们所使用的语言，比如</span><span>C<span>，</span>C++<span>等等，都称为静态语言。什么是静态语言呢？就是说，在使用数据之前，我们必须首先定义数据类型，这些数据类型包括</span>int, float, double<span>等等。就相当于在使用它们之前，首先要为它们分配好内存空间；而动态语言就刚刚是相反的，它是在得到数据类型之后，再为它分配内存空间。</span></span></p>
<p><span>&#8220;脚本语言除了接近口语化的设计外，另加上简化后的语法。（除了内建的命令外，通常仅需简单的逻辑判断与数值计算即可胜任）因此用脚本语言制作游戏，不再是非程序员不可的工作（除了系统本身的修订），企画人员也可以很快地进入状态。另外，如果将来需要将游戏移植到其他平台时，比起程序与资料的盘根错节的设计，利用脚本语言来开发的游戏，只需要修改系统本身，脚本语言部分本身毋须更动，相形之下出现问题的机会与范围就缩小了很多。</span></p>
<img src ="http://www.cppblog.com/jacky2019/aggbug/22034.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-04-16 18:15 <a href="http://www.cppblog.com/jacky2019/archive/2007/04/16/22034.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Intel.VTune.Performance.Analyzer.v8.0.014.ISO下载</title><link>http://www.cppblog.com/jacky2019/archive/2007/04/13/21797.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Fri, 13 Apr 2007 08:07:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/04/13/21797.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/21797.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/04/13/21797.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/21797.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/21797.html</trackback:ping><description><![CDATA[<a href="http://down.gogobox.com.tw/kisser/7ir3">http://down.gogobox.com.tw/kisser/7ir3</a><br>下载的时候要安装一个ActiveX插件的。<br>
<img src ="http://www.cppblog.com/jacky2019/aggbug/21797.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-04-13 16:07 <a href="http://www.cppblog.com/jacky2019/archive/2007/04/13/21797.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Finding crash information using the MAP file 2</title><link>http://www.cppblog.com/jacky2019/archive/2007/04/10/21584.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Tue, 10 Apr 2007 03:27:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/04/10/21584.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/21584.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/04/10/21584.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/21584.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/21584.html</trackback:ping><description><![CDATA[很奇怪，cppblog居然不能发表评论了，哭。。。所以就在发一篇了哦，呵呵。<br><a id=_4f0e0710e665_HomePageDays_DaysList_ctl01_DayItem_DayList_ctl03_TitleUrl href="http://www.cppblog.com/jacky2019/archive/2007/04/09/21527.html"><u><font color=#810081>Finding crash information using the MAP file</font></u></a><br><a href="http://www.cppblog.com/jacky2019/archive/2007/04/09/21527.html">http://www.cppblog.com/jacky2019/archive/2007/04/09/21527.html</a><br><span>上文中的关于小说明的第</span><span>2<span>点是有问题的</span></span>
<p><span>偶又试了一次，发现</span><span>lines number<span>可能是有问题的，而且也不是我的那种算法。不过函数名肯定是对的<br><br>在vckbase中又发现一篇好文，所以就又贴过来了。不过可惜的是，还是没能解决dll的地址映射问题，无法track到dll内的信息，可惜了。<br><br></p>
<p align=center><strong>对&#8220;仅通过崩溃地址找出源代码的出错行&#8221;一文的补充与改进</strong><br><br>作者：<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#120;&#113;&#99;&#52;&#64;&#115;&#111;&#104;&#117;&#46;&#99;&#111;&#109;"><font color=#0000ff><u>上海伟功通信 roc</u></font></a></p>
<p><a href="http://www.vckbase.com/code/downcode.asp?id=2691"><u><font color=#0000ff>下载源代码</font></u></a><br><br>　　读了老罗的&#8220;<a href="http://www.vckbase.com/document/viewdoc/?id=908" target=_blank><u><font color=#810081>仅通过崩溃地址找出源代码的出错行</font></u></a>&#8221;(下称"罗文")一文后，感觉该文还是可以学到不少东西的。不过文中尚存在有些说法不妥，以及有些操作太繁琐的地方 。为此，本人在学习了此文后，在多次实验实践基础上，把该文中的一些内容进行补充与改进，希望对大家调试程序，尤其是release版本的程序有帮助 。欢迎各位朋友批评指正。<br><br><br><strong>一、该方法适用的范围</strong><br>　　在windows程序中造成程序崩溃的原因很多，而文中所述的方法仅适用与:由一条语句当即引起的程序崩溃。如原文中举的除数为零的崩溃例子。而笔者在实际工作中碰到更多的情况是:指针指向一非法地址 ，然后对指针的内容进行了，读或写的操作。例如：<br></p>
<pre>void Crash1()
{
char * p =(char*)100;
*p=100;
}<br></pre>
<p>　　这些原因造成的崩溃，无论是debug版本，还是release版本的程序，使用该方法都可找到造成崩溃的函数或子程序中的语句行，具体方法的下面还会补充说明。 另外，实践中另一种常见的造成程序崩溃的原因:函数或子程序中局部变量数组越界付值，造成函数或子程序返回地址遭覆盖，从而造成函数或子程序返回时崩溃。例如:<br></p>
<pre>#include <string.h>
void Crash2();
int main(int argc,char* argv[])
{
Crash2();
return 0;
}
void Crash2()
{
char p[1];
strcpy(p,"0123456789");
}<br></pre>
<p>在vc中编译运行此程序的release版本，会跳出如下的出错提示框。 <br><br><img height=139 src="http://www.vckbase.com/document/journal/vckbase42/images/crashimg1.jpg" width=434 border=0><br>图一 上面例子运行结果<br><br>　　这里显示的崩溃地址为:0x34333231。这种由前面语句造成的崩溃根源，在后续程序中方才显现出来的情况，显然用该文所述的方法就无能为力了。不过在此例中多少还有些蛛丝马迹可寻找到崩溃的原因:函数Crash2中的局部数组p只有一个字节大小 ，显然拷贝"0123456789"这个字符串会把超出长度的字符串拷贝到数组p的后面，即*(p+1)=''1''，*(p+2)=''2''，*(p+3)=''3''，*(p+4)=4。。。。。。而字符''1''的ASC码的值为0x31，''2''为0x32，''3''为0x33，''4''为0x34。。。。。，由于intel的cpu中int型数据是低字节保存在低地址中 ，所以保存字符串''1234''的内存，显示为一个4字节的int型数时就是0x34333231。显然拷贝"0123456789"这个字符串时，"1234"这几个字符把函数Crash2的返回地址给覆盖 ，从而造成程序崩溃。对于类似的这种造成程序崩溃的错误朋友们还有其他方法排错的话，欢迎一起交流讨论。<br><br><br><strong>二、设置编译产生map文件的方法</strong><br>　　该文中产生map文件的方法是手工添加编译参数来产生map文件。其实在vc6的IDE中有产生map文件的配置选项的。操作如下:先点击菜单"Project"-&gt;"Settings。。。"，弹出的属性页中选中"Link"页 ，确保在"category"中选中"General"，最后选中"Generate mapfile"的可选项。若要在在map文件中显示Line numbers的信息的话 ，还需在project options 中加入/mapinfo:lines 。Line numbers信息对于"罗文"所用的方法来定位出错源代码行很重要 ，但笔者后面会介绍更加好的方法来定位出错代码行，那种方法不需要Line numbers信息。 <br><br><img height=446 src="http://www.vckbase.com/document/journal/vckbase42/images/crashimg3.JPG" width=677 border=0><br>图二 设置产生MAP文件 <br><br><br><strong>三、定位崩溃语句位置的方法</strong><br>　　"罗文"所述的定位方法中，找到产生崩溃的函数位置的方法是正确的，即在map文件列出的每个函数的起始地址中，最近的且不大于崩溃地址的地址即为包含崩溃语句的函数的地址 。但之后的再进一步的定位出错语句行的方法不是最妥当，因为那种方法前提是，假设基地址的值是 0x00400000 ，以及一般的 PE 文件的代码段都是从 0x1000偏移开始的 。虽然这种情况很普遍，但在vc中还是可以基地址设置为其他数，比如设置为0x00500000，这时仍旧套用<br></p>
<pre> 崩溃行偏移 = 崩溃地址 - 0x00400000 - 0x1000 </pre>
<p>的公式显然无法找到崩溃行偏移。 其实上述公式若改为<br></p>
<pre>崩溃行偏移 = 崩溃地址 - 崩溃函数绝对地址 + 函数相对偏移</pre>
<p>即可通用了。仍以"罗文"中的例子为例:"罗文"中提到的在其崩溃程序的对应map文件中，崩溃函数的编译结果为<br></p>
<pre>0001:00000020 ?Crash@@YAXXZ 00401020 f CrashDemo。obj </pre>
<p>对与上述结果，在使用我的公式时 ，"崩溃函数绝对地址"指00401020， 函数相对偏移指 00000020， 当崩溃地址= 0x0040104a时， 则 崩溃行偏移 = 崩溃地址 - 崩溃函数起始地址+ 函数相对偏移 = 0x0040104a - 0x00401020 + 0x00000020= 0x4a，结果与"罗文"计算结果相同 。但这个公式更通用。<br><br><br><strong>四、更好的定位崩溃语句位置的方法。</strong><br>　　其实除了依靠map文件中的Line numbers信息最终定位出错语句行外，在vc6中我们还可以通过编译程序产生的对应的汇编语句，二进制码，以及对应c/c++语句为一体的"cod"文件来定位出错语句行 。先介绍一下产生这种包含了三种信息的"cod"文件的设置方法:先点击菜单"Project"-&gt;"Settings。。。"，弹出的属性页中选中"C/C++"页 ，然后在"Category"中选则"Listing Files"，再在"Listing file type"的组合框中选择"Assembly，Machine code， and source"。接下去再通过一个具体的例子来说明这种方法的具体操作。 <br><br><img height=446 src="http://www.vckbase.com/document/journal/vckbase42/images/crashimg4.JPG" width=677 border=0><br>图三 设置产生"cod"文件 <br><br>准备步骤1)产生崩溃的程序如下:<br></p>
<pre>01 //****************************************************************
02 //文件名称：crash。cpp
03 //作用:    演示通过崩溃地址找出源代码的出错行新方法
04 //作者：   伟功通信 roc
05 //日期：   2005-5-16
06//****************************************************************
07 void Crash1();
08 int main(int argc,char* argv[])
09 {
10 Crash1();
11 return 0;
12 }
13
14 void Crash1()
15 {
16  char * p =(char*)100;
17  *p=100;
18 }
</pre>
<p>准备步骤2)按本文所述设置产生map文件(不需要产生Line numbers信息)。<br>准备步骤3)按本文所述设置产生cod文件。<br>准备步骤4)编译。这里以debug版本为例(若是release版本需要将编译选项改为不进行任何优化的选项，否则上述代码会因为优化时看作废代码而不被编译，从而看不到崩溃的结果)，编译后产生一个"exe"文件 ，一个"map"文件，一个"cod"文件。 <br>运行此程序，产生如下如下崩溃提示: <br><br><img height=139 src="http://www.vckbase.com/document/journal/vckbase42/images/crashimg2.JPG" width=434 border=0><br>图四 上面例子运行结果 <br><br>排错步骤1)定位崩溃函数。可以查询map文件获得。我的机器编译产生的map文件的部分如下:<br></p>
<pre> Crash
Timestamp is 42881a01 (Mon May 16 11:56:49 2005)
Preferred load address is 00400000
Start Length Name Class
0001:00000000 0000ddf1H .text CODE
0001:0000ddf1 0001000fH .textbss CODE
0002:00000000 00001346H .rdata DATA
0002:00001346 00000000H .edata DATA
0003:00000000 00000104H .CRT$XCA DATA
0003:00000104 00000104H .CRT$XCZ DATA
0003:00000208 00000104H .CRT$XIA DATA
0003:0000030c 00000109H .CRT$XIC DATA
0003:00000418 00000104H .CRT$XIZ DATA
0003:0000051c 00000104H .CRT$XPA DATA
0003:00000620 00000104H .CRT$XPX DATA
0003:00000724 00000104H .CRT$XPZ DATA
0003:00000828 00000104H .CRT$XTA DATA
0003:0000092c 00000104H .CRT$XTZ DATA
0003:00000a30 00000b93H .data DATA
0003:000015c4 00001974H .bss DATA
0004:00000000 00000014H .idata$2 DATA
0004:00000014 00000014H .idata$3 DATA
0004:00000028 00000110H .idata$4 DATA
0004:00000138 00000110H .idata$5 DATA
0004:00000248 000004afH .idata$6 DATA
Address Publics by Value Rva+Base Lib:Object
0001:00000020 _main 00401020 f Crash.obj
0001:00000060 ?Crash1@@YAXXZ 00401060 f Crash.obj
0001:000000a0 __chkesp 004010a0 f LIBCD:chkesp.obj
0001:000000e0 _mainCRTStartup 004010e0 f LIBCD:crt0.obj
0001:00000210 __amsg_exit 00401210 f LIBCD:crt0.obj
0001:00000270 __CrtDbgBreak 00401270 f LIBCD:dbgrpt.obj
...
</pre>
<p>对于崩溃地址0x00401082而言，小于此地址中最接近的地址(Rva+Base中的地址)为00401060，其对应的函数名为?Crash1@@YAXXZ，由于所有以问号开头的函数名称都是 C++ 修饰的名称 ，"@@YAXXZ"则为区别重载函数而加的后缀，所以?Crash1@@YAXXZ就是我们的源程序中，Crash1() 这个函数。<br>排错步骤2)定位出错行。打开编译生成的"cod"文件，我机器上生成的文件内容如下:<br></p>
<pre> TITLE E:\Crash\Crash。cpp
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC ''CODE''
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC ''DATA''
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC ''CONST''
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC ''BSS''
_BSS ENDS
$$SYMBOLS SEGMENT BYTE USE32 ''DEBSYM''
$$SYMBOLS ENDS
$$TYPES SEGMENT BYTE USE32 ''DEBTYP''
$$TYPES ENDS
_TLS SEGMENT DWORD USE32 PUBLIC ''TLS''
_TLS ENDS
; COMDAT _main
_TEXT SEGMENT PARA USE32 PUBLIC ''CODE''
_TEXT ENDS
; COMDAT ?Crash1@@YAXXZ
_TEXT SEGMENT PARA USE32 PUBLIC ''CODE''
_TEXT ENDS
FLAT GROUP _DATA， CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC ?Crash1@@YAXXZ     ; Crash1
PUBLIC _main
EXTRN __chkesp:NEAR
; COMDAT _main
_TEXT SEGMENT
_main PROC NEAR     ; COMDAT
; 9    : {
00000 55   push  ebp
00001 8b ec   mov  ebp， esp
00003 83 ec 40  sub  esp, 64   ; 00000040H
00006 53   push  ebx
00007 56   push  esi
00008 57   push  edi
00009 8d 7d c0  lea  edi, DWORD PTR [ebp-64]
0000c b9 10 00 00 00  mov  ecx， 16   ; 00000010H
00011 b8 cc cc cc cc  mov  eax， -858993460  ; ccccccccH
00016 f3 ab   rep stosd
; 10   :  Crash1();
00018 e8 00 00 00 00  call  ?Crash1@@YAXXZ  ; Crash1
; 11   :  return 0;
0001d 33 c0   xor  eax， eax
; 12   : }
0001f 5f   pop  edi
00020 5e   pop  esi
00021 5b   pop  ebx
00022 83 c4 40  add  esp, 64   ; 00000040H
00025 3b ec   cmp  ebp, esp
00027 e8 00 00 00 00  call  __chkesp
0002c 8b e5   mov  esp, ebp
0002e 5d   pop  ebp
0002f c3   ret  0
_main ENDP
_TEXT ENDS
; COMDAT ?Crash1@@YAXXZ
_TEXT SEGMENT
_p$ = -4
?Crash1@@YAXXZ PROC NEAR    ; Crash1, COMDAT
; 15   : {
00000 55   push  ebp
00001 8b ec   mov  ebp, esp
00003 83 ec 44  sub  esp, 68   ; 00000044H
00006 53   push  ebx
00007 56   push  esi
00008 57   push  edi
00009 8d 7d bc  lea  edi, DWORD PTR [ebp-68]
0000c b9 11 00 00 00  mov  ecx, 17   ; 00000011H
00011 b8 cc cc cc cc  mov  eax, -858993460  ; ccccccccH
00016 f3 ab   rep stosd
; 16   :  char * p =(char*)100;
00018 c7 45 fc 64 00
00 00   mov  DWORD PTR _p$[ebp], 100 ; 00000064H
; 17   :  *p=100;
0001f 8b 45 fc  mov  eax, DWORD PTR _p$[ebp]
00022 c6 00 64  mov  BYTE PTR [eax], 100 ; 00000064H
; 18   : }
00025 5f   pop  edi
00026 5e   pop  esi
00027 5b   pop  ebx
00028 8b e5   mov  esp, ebp
0002a 5d   pop  ebp
0002b c3   ret  0
?Crash1@@YAXXZ ENDP     ; Crash1
_TEXT ENDS
END
</pre>
<p>其中<br></p>
<pre>?Crash1@@YAXXZ PROC NEAR    ; Crash1, COMDAT</pre>
<p>为Crash1汇编代码的起始行。产生崩溃的代码便在其后的某个位置。接下去的一行为: <br></p>
<pre>; 15   : {</pre>
<p>冒号后的"{"表示源文件中的语句，冒号前的"15"表示该语句在源文件中的行数。 这之后显示该语句汇编后的偏移地址，二进制码，汇编代码。如 <br></p>
<pre>00000 55   push  ebp</pre>
<p>其中"0000"表示相对于函数开始地址后的偏移，"55"为编译后的机器代码，" push ebp"为汇编代码。从"cod"文件中我们可以看出，一条(c/c++)语句通常需要编译成数条汇编语句 。此外有些汇编语句太长则会分两行显示如: <br></p>
<pre>00018 c7 45 fc 64 00
00 00   mov  DWORD PTR _p$[ebp], 100 ; 00000064H</pre>
<p>其中"0018"表示相对偏移，在debug版本中，这个数据为相对于函数起始地址的偏移(此时每个函数第一条语句相对偏移为0000)；release版本中为相对于代码段第一条语句的偏移(即代码段第一条语句相对偏移为0000，而以后的每个函数第一条语句相对偏移就不为0000了)。"c7 45 fc 64 00 00 00 "为编译后的机器代码 ，"mov DWORD PTR _p$[ebp]， 100"为汇编代码， 汇编语言中";"后的内容为注释，所以";00000064H"，是个注释这里用来说明100转换成16进制时为"00000064H"。<br>接下去，我们开始来定位产生崩溃的语句。<br>第一步，计算崩溃地址相对于崩溃函数的偏移，在本例中已经知道了崩溃语句的地址(0x00401082)，和对应函数的起始地址(0x00401060)，所以崩溃地址相对函数起始地址的偏移就很容易计算了: <br></p>
<pre>  崩溃偏移地址 = 崩溃语句地址 - 崩溃函数的起始地址 = 0x00401082 - 0x00401060 = 0x22。</pre>
<p>第二步，计算出错的汇编语句在cod文件中的相对偏移。我们可以看到函数Crash1()在cod文件中的相对偏移地址为0000，则 <br></p>
<pre>崩溃语句在cod文件中的相对偏移 =  崩溃函数在cod文件中相对偏移 + 崩溃偏移地址 = 0x0000 + 0x22 = 0x22</pre>
<p>第三步，我们看Crash1函数偏移0x22除的代码是什么?结果如下 <br></p>
<pre> 00022 c6 00 64  mov  BYTE PTR [eax], 100 ; 00000064H</pre>
<p>这句汇编语句表示将100这个数保存到寄存器eax所指的内存单元中去，保存空间大小为1个字节(byte)。程序正是执行这条命令时产生了崩溃，显然这里eax中的为一个非法地址 ，所以程序崩溃了!<br>第四步，再查看该汇编语句在其前面几行的其对应的源代码，结果如下: <br></p>
<pre>; 17   :  *p=100;</pre>
<p>其中17表示该语句位于源文件中第17行，而&#8220;*p=100;&#8221;这正是源文件中产生崩溃的语句。<br>至此我们仅从崩溃地址就查找出了造成崩溃的源代码语句和该语句所在源文件中的确切位置，甚至查找到了造成崩溃的编译后的确切汇编代码!<br>怎么样，是不是感觉更爽啊?<br><br><br><strong>五、小节</strong><br><br>1、新方法同样要注意可以适用的范围，即程序由一条语句当即引起的崩溃。另外我不知道除了VC6外，是否还有其他的编译器能够产生类似的"cod"文件。<br>2、我们可以通过比较 新方法产生的debug和releae版本的"cod"文件，查找那些仅release版本(或debug版本)有另一个版本没有的bug(或其他性状)。例如"罗文"中所举的那个用例 ，只要打开release版本的"cod"文件，就明白了为啥debug版本会产生崩溃而release版本却没有:原来release版本中产生崩溃的语句其实根本都没有编译 。同样本例中的release版本要看到崩溃的效果，需要将编译选项改为为不优化的配置。</p><img src ="http://www.cppblog.com/jacky2019/aggbug/21584.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-04-10 11:27 <a href="http://www.cppblog.com/jacky2019/archive/2007/04/10/21584.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DeinoMPI</title><link>http://www.cppblog.com/jacky2019/archive/2007/04/10/21578.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Tue, 10 Apr 2007 02:57:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/04/10/21578.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/21578.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/04/10/21578.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/21578.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/21578.html</trackback:ping><description><![CDATA[<p>DeinoMPI is an implementation of MPI-2 for Microsoft Windows.&nbsp;</p>
<p>DeinoMPI<span>是微软</span>windows<span>下</span>MPI-2<span>的一个实现。</span></p>
<p><span>注：</span>MPI-2<span>是</span>Message Passing Interface, <a href="http://www.mpi-forum.org/">http://www.mpi-forum.org/</a><span>。</span>What is MPI? MPI is a library of functions and macros which is intended for use in programs that exploit the existence of multiple processors by message-passing. <span>也就是说，</span>MPI<span>是一套规范，定义了一些函数和宏，它被用来在程序中通过消息传递来发挥多处理器的处理能力。</span></p>
<p>DeinoMPI is an implementation of the MPI-2 standard for parallel computing or more generally it is system level middle-ware for high performance parallel computing on Microsoft Windows systems. It supports Win32 and Win64 machines.</p>
<p>DeinoMPI<span>是</span>MPI-2<span>的一个实现，</span>MPI-2<span>是</span>for<span>并行计算的。更通用地说，</span>DeinoMPI<span>是</span>windows<span>系统上的一个高性能并行计算的系统</span>level<span>中间件。它有两个版本，分别是</span>for win32<span>和</span>for win64<span>的。</span></p>
<p>1) DeinoMPI provides the libraries necessary for software developers to write parallel applications that conform to the <a href="http://www.mpi-forum.org/">MPI-2</a> standard for parallel computing.&nbsp; Software developers who wish to develop new parallel applications or wish to add parallel capabilities to existing software would benefit from using DeinoMPI.&nbsp; The libraries provided support a wide range of C, C++ and Fortran compilers.</p>
<p>2) DeinoMPI also provides a process manager used to start processes on multiple machines in a cluster remotely.&nbsp; Microsoft Windows does not provide native capability to start user applications on remote machines.&nbsp; DeinoMPI provides a secure mechanism to do just that.&nbsp; The primary purpose of the DeinoMPI process manager is to set up the environment and launch processes used in MPI jobs but it is not restricted to this functionality.&nbsp; It can launch any application remotely on behalf of the user.</p>
<p>The following users will benefit from DeinoMPI: Businesses that develop software and wish to add parallel capabilities to increase the performance of their software.&nbsp; Research institutions that have parallel software codes that they want to run on their Windows machines.&nbsp; Universities or other educational institutions that teach courses on parallel computing.&nbsp; University or research labs that run computationally intensive software and wish to use parallel versions of their software to better utilize their computer resources.&nbsp; Students or hobbyists that wish to write parallel programs.</p>
<p>&nbsp;</p><img src ="http://www.cppblog.com/jacky2019/aggbug/21578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-04-10 10:57 <a href="http://www.cppblog.com/jacky2019/archive/2007/04/10/21578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>可变参数研究</title><link>http://www.cppblog.com/jacky2019/archive/2007/04/10/21577.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Tue, 10 Apr 2007 02:38:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/04/10/21577.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/21577.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/04/10/21577.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/21577.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/21577.html</trackback:ping><description><![CDATA[<p><span>一．</span><span> </span><span>何谓可变参数</span><br>int printf( const char* format, ...); <br><span>这是使用过</span>C<span>语言的人所再熟悉不过的</span>printf<span>函数原型，它的参数中就有固定参数</span>format<span>和可变参数（用</span>&#8221;&#8230;&#8221;<span>表示）</span>. <span>而我们又可以用各种方式来调用</span>printf,<span>如</span>:<br>printf("%d",value); <br>printf("%s",str); <br>printf("the number is %d ,string is:%s", value, str);<br><span>二</span><span>.</span><span>实现原理</span><br>C <span>语言用宏来处理这些可变参数。这些宏看起来很复杂，其实原理挺简单，就是根据参数入栈的特点从最靠近第一个可变参数的固定参数开始，依次获取每个可变参数</span><span> </span><span>的地址。下面我们来分析这些宏。在</span>VC<span>中的</span>stdarg.h<span>头文件中，针对不同平台有不同的宏定义，我们选取</span>X86<span>平台下的宏定义：</span><br>typedef char *va_list; <br>/*<span>把</span>va_list<span>被定义成</span>char*<span>，这是因为在我们目前所用的</span>PC<span>机上，字符指针类型可以用来存储内存单元地址。而在有的机器上</span>va_list<span>是被定义成</span>void*<span>的</span>*/<br>#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) &amp; ~(sizeof(int) - 1) )<br>/*_INTSIZEOF (n)<span>宏是为了考虑那些内存地址需要对齐的系统，从宏的名字来应该是跟</span>sizeof(int)<span>对齐。一般的</span>sizeof(int)=4<span>，也就是参数在内存</span><span> </span><span>中的地址都为</span>4<span>的倍数。比如，如果</span>sizeof(n)<span>在</span>1<span>－</span>4<span>之间，那么</span>_INTSIZEOF(n)<span>＝</span>4<span>；如果</span>sizeof(n)<span>在</span>5<span>－</span>8<span>之间，那么</span> _INTSIZEOF(n)=8<span>。</span>*/<br>#define va_start(ap,v)( ap = (va_list)&amp;v + _INTSIZEOF(v) )<br>/*va_start <span>的定义为</span> &amp;v+_INTSIZEOF(v) ,<span>这里</span>&amp;v<span>是最后一个固定参数的起始地址，再加上其实际占用大小后，就得到了第一个可变参数的起始内存地址。所以我们运行</span>va_start (ap, v)<span>以后</span>,ap<span>指向第一个可变参数在的内存地址</span>*/<br>#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )<br>/*<span>这个宏做了两个事情，</span><br><span>①用用户输入的类型名对参数地址进行强制类型转换，得到用户所需要的值</span><br><span>②计算出本参数的实际大小，将指针调到本参数的结尾，也就是下一个参数的首地址，以便后续处理。</span>*/<br><span>　　</span>#define va_end(ap) ( ap = (va_list)0 ) <br>/*x86 <span>平台定义为</span>ap=(char*)0;<span>使</span>ap<span>不再</span><span> </span><span>指向堆栈</span>,<span>而是跟</span>NULL<span>一样</span>.<span>有些直接定义为</span>((void*)0),<span>这样编译器不会为</span>va_end<span>产生代码</span>,<span>例如</span>gcc<span>在</span>linux<span>的</span>x86<span>平台就是这</span><span> </span><span>样定义的</span>. <span>在这里大家要注意一个问题</span>:<span>由于参数的地址用于</span>va_start<span>宏</span>,<span>所以参数不能声明为寄存器变量或作为函数或数组类型</span>. */</p>
<p><span>以下再用图来表示</span>:</p>
<p><span>在</span>VC<span>等绝大多数</span>C<span>编译器中，默认情况下，参数进栈的顺序是由右向左的，因此，参数进栈以后的内存模型如下图所示：最后一个固定参数的地址位于第一个可变参数之下，并且是连续存储的。</span><br>|——————————————————————————|<br>|<span>最后一个可变参数</span> | -&gt;<span>高内存地址处</span><br>|——————————————————————————|<br>...................<br>|——————————————————————————|<br>|<span>第</span>N<span>个可变参数</span> | -&gt;va_arg(arg_ptr,int)<span>后</span>arg_ptr<span>所指的地方</span>,<br>| | <span>即第</span>N<span>个可变参数的地址。</span><br>|——————————————— | <br>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.<br>|——————————————————————————|<br>|<span>第一个可变参数</span> | -&gt;va_start(arg_ptr,start)<span>后</span>arg_ptr<span>所指的地方</span><br>| | <span>即第一个可变参数的地址</span><br>|——————————————— | <br>|———————————————————————— ——|<br>| |<br>|<span>最后一个固定参数</span> | -&gt; start<span>的起始地址</span><br>|—————————————— —| .................<br>|—————————————————————————— |<br>| |<br>|——————————————— |-&gt; <span>低内存地址处</span></p>
<p><span>三</span><span>.printf</span><span>研究</span></p>
<p><span>下面是一个简单的</span>printf<span>函数的实现，参考了中的</span>156<span>页的例子，读者可以结合书上的代码与本文参照。</span><br>#include "stdio.h"<br>#include "stdlib.h"<br>void myprintf(char* fmt, ...) //<span>一个简单的类似于</span>printf<span>的实现，</span>//<span>参数必须都是</span>int <span>类型</span><br>{ <br>char* pArg=NULL; //<span>等价于原来的</span>va_list <br>char c;</p>
<p>pArg = (char*) &amp;fmt; //<span>注意不要写成</span>p = fmt !!<span>因为这里要对</span>//<span>参数取址，而不是取值</span><br>pArg += sizeof(fmt); //<span>等价于原来的</span>va_start </p>
<p>do<br>{<br>c =*fmt;<br>if (c != '%')<br>{<br>putchar(c); //<span>照原样输出字符</span><br>}<br>else<br>{<br>//<span>按格式字符输出数据</span><br>switch(*++fmt) <br>{<br>case 'd':<br>printf("%d",*((int*)pArg)); <br>break;<br>case 'x':<br>printf("%#x",*((int*)pArg));<br>break;<br>default:<br>break;<br>} <br>pArg += sizeof(int); //<span>等价于原来的</span>va_arg<br>}<br>++fmt;<br>}while (*fmt != '\0'); <br>pArg = NULL; //<span>等价于</span>va_end<br>return; <br>}<br>int main(int argc, char* argv[])<br>{<br>int i = 1234;<br>int j = 5678;</p>
<p>myprintf("the first test:i=%d",i,j); <br>myprintf("the secend test:i=%d; %x;j=%d;",i,0xabcd,j); <br>system("pause");<br>return 0;<br>}<br><span>在</span>intel+win2k+vc6<span>的机器执行结果如下：</span><br>the first test:i=1234<br>the secend test:i=1234; 0xabcd;j=5678;</p>
<p><span>四</span><span>.</span><span>应用</span><span><br></span><span>求最大值</span>:<br>#include //<span>不定数目参数需要的宏</span><br>int max(int n,int num,...)<br>{<br>va_list x;//<span>说明变量</span>x<br>va_start(x,num);//x<span>被初始化为指向</span>num<span>后的第一个参数</span><br>int m=num;<br>for(int i=1;i {<br>//<span>将变量</span>x<span>所指向的</span>int<span>类型的值赋给</span>y,<span>同时使</span>x<span>指向下一个参数</span><br>int y=va_arg(x,int);<br>if(y&gt;m)m=y;<br>}<br>va_end(x);//<span>清除变量</span>x<br>return m;<br>}<br>main()<br>{<br>printf("%d,%d",max(3,5,56),max(6,0,4,32,45,533));<br>}</p>
<p>&nbsp;</p>
<p><span>本文转载自网上，本来是要注明出处的，结果别人也都是转载的，呵呵。不过此文讲的很不错，很清楚，特别是把可变参数实现的那几个宏！偶也是冲着这几个宏去的。</span></p>
<p><span>#define _INT</span>SIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) &amp; ~(sizeof(int) - 1) )<br><span>这个宏，一开始我就是想不明白！不知道是老了，还是笨了，或者是生锈了。想了好一会还是没搞明白，不过看了一下本文的分析，一下子就明白了，那是相当的恍然大悟啊。</span></p>
<p><span>#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )</span></p>
<p><span>这个宏，一开始也是没有明白。多看了好几遍才发现了奥秘所在啊，为什么要加一个，然后再减一个呢？因为第一个加直接加到</span><span>ap</span><span>上去了，而后一个减只是减了一下括号内的值，也就是当前值了。</span></p>
<p><span>宏真是厉害啊！或者说它应用真广！这不禁让我想起以前看过的宏，怎么判断是</span><span>win</span><span>还是</span><span>linux</span><span>平台的，怎么判断是</span><span>32</span><span>位的还是</span><span>64</span><span>位的。宏是一门学问啊。</span></p>
<p><span>本文的另一大优点是，有非常简单的例子，看了就懂。恩。看了保管你就会用了。不过这年头指针也是个好东西啊，需要什么，传个指针就是传了一切想要的东西啊，只要让指针指向你需要的东西，可以是任意多的参数（不过这样子的话，具体到哪个参数结束就要我们自己来定了，不像这里，所有的参数都已经压栈了，编译器可以帮我们决定具体有多少个参数，到什么时候结束）。</span></p>
<p><span>Have fun.</span></p><img src ="http://www.cppblog.com/jacky2019/aggbug/21577.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-04-10 10:38 <a href="http://www.cppblog.com/jacky2019/archive/2007/04/10/21577.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Rational Rose 2003下载地址</title><link>http://www.cppblog.com/jacky2019/archive/2007/04/10/21573.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Tue, 10 Apr 2007 01:22:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/04/10/21573.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/21573.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/04/10/21573.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/21573.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/21573.html</trackback:ping><description><![CDATA[<a href="http://www.21php.com/Rational">http://www.21php.com/Rational</a> Rose 2003.rar<br><br>昨晚下的，速度100K左右
<img src ="http://www.cppblog.com/jacky2019/aggbug/21573.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-04-10 09:22 <a href="http://www.cppblog.com/jacky2019/archive/2007/04/10/21573.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>谈谈面向对象</title><link>http://www.cppblog.com/jacky2019/archive/2007/04/09/21550.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Mon, 09 Apr 2007 12:52:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/04/09/21550.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/21550.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/04/09/21550.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/21550.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/21550.html</trackback:ping><description><![CDATA[<p><span>面向对象是当前计算机界关心的重点，它是</span>90<span>年代软件开发方法的主流。面向对象的概念和应用已超越了程序设计和软件开发，扩展到很宽的范围。如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、</span>CAD<span>技术、人工智能等领域。</span></p>
<p><span>不过我想上面说的应该是国外吧！不知道国内的</span>90<span>年代</span>OO<span>是否风靡啊。偶是</span>21<span>世纪才开始接触电脑的。记得那时候老师在给我们上</span>C++<span>课的时候，拼命说什么</span>C++<span>好啊，面向对象啊，大说了一通。总之，给我的感觉是，</span>OO<span>才开始风靡。后来，学校里又开了一门课，叫着面向对象&#215;&#215;&#215;什么什么的，忘了，反正就是在讲面向对象。老师也是一个劲的给我们灌输</span>OO<span>思想，叫我们区别好</span>OO<span>与</span>OP<span>的差别。不知道为什么会有这么一段，可能想说国内的技术比国外的慢太多了。很多时候，其实，语言也是一种原因！毕竟国内好的翻译太少了！而且不能总是等侯杰大叔叔来翻译啊。记得以前在论坛上看到一句&#8220;名言&#8221;啊：不要看国内作者写的书，不要看国内译者翻译的书，括弧（侯杰除外）。看起来似乎有点偏激，不过却不无道理啊！很多的作者和译者都是垃圾啊！！！！偶深受其害，因为偶很爱买书（看书就。。。呵呵）。记得我去年看重构的时候，我觉得这个名词还是很新的啊，看了那本书之后才发现原来这本书写于上个世纪，昏迷啊，国内的技术太落后了。偶的</span>e<span>文也太落后了！要多关注关注国外的新技术。</span></p>
<p><span>扯远了。回来再谈</span>OO<span>。</span></p>
<p>OO<span>，很早就已经学过了，很早以前就以为自己懂了，今天突然发现自己还不懂什么是</span>OO<span>，为什么要</span>OO<span>？以前的想法可能太简单了一点，认为只要是全都是对象就是</span>OO<span>了。</span></p>
<p><span>没错，在</span>OO<span>的思想中，所有一切东西都是</span>O<span>！但是，我发现在实际编程中，我连这一点都无法保证！而且，我也无法做到理论联系实际，把理论应用到实际。在实际运用中，几乎没有考虑过</span>O<span>的问题。更多的时候是在考虑什么模块怎么划分，一个模块应该有几个类阿，每个类都有些什么功能阿。但是我没有把那个类作为一个对象来考虑，或者说没有把那个类作为一类抽象的对象来考虑。需要什么东西就直接往里面加。不管加的东西跟那个类有没有关系，都往里面塞！行为相当恶劣。简直就是</span>OP<span>啊，每个类都成了一组</span>function<span>的</span>wrapper<span>了，相当悲哀！不管</span>function<span>是否应该属于该类（或者说该对象）。搞不好什么时候就设计出个：一个人有爬的行为！（结果肯定会被一群人狂揍哦）。</span></p>
<p><strong><span>OO</span></strong><strong><span>有什么优点呢？为什么要</span></strong><strong><span>OO</span></strong><strong><span>？</span></strong><strong></strong></p>
<p>OO<span>使人们得变成与实际的世界更加接近，所有的对象被赋予属性和方法，结果编程就更加富有人性化。</span></p>
<p><strong><span>维护简单</span></strong><span>，</span><span>模块化是面向对象编程中的一个特征。实体被表示为类和同一名字空间中具有相同功能的类，我们可以在名字空间中添加一个类而不会影响该名字空间的其他成员。</span></p>
<p><strong><span>可扩充性</span></strong><span>，</span><span>面向对象编程从本质上支持扩充性。如果有一个具有某种功能的类，就可以很快地扩充这个类，创建一个具有扩充的功能的类。</span></p>
<p><strong><span>代码重用</span></strong><span>，由于功能是被封装在类中的，并且类是作为一个独立实体而存在的，提供一个类库就非常简单了。事实上，任何一个</span><span>.NET Framework</span><span>编程语言的程序员都可以使用</span><span>.NET Framework</span><span>类库，</span><span>.NET Framework</span><span>类库提供了很多的功能。更令人高兴的是，我们可以通过提供符合需求的类来扩充这些功能。</span><span> </span></p>
<p><span>在实际的编程中你有考虑过这些问题吗？</span><span>Sorry<span>，偶是没有考虑过。基本上是，维护很难！扩充相对较容易，因为直接拷贝过来，在修改（这有算是</span>OO<span>吗？显然否）。这种根本就是没有利用到面向对象中的重用性。扩充起来也不容易，需要什么功能就胡乱继承一通，搞得类的层次太多了，无形之中给后人维护带来了极大的困难。出现这些情况的原因是什么呢？前面的代码设计的不够好。面向对象的三大特点：封装，继承和多态有没有都考虑进来？</span></span><strong><span>面向对象是一种思想，是我们考虑事情的方法，通常表现为我们是将问题的解决按照过程方式来解决呢，还是将问题抽象为一个对象来解决它。</span></strong><span>很多情况下，我们会不知不觉的按照过程方式来解决它，而不是考虑将要解决问题抽象为对象去解决它。有些人打着面向对象的幌子，干着过程编程的勾当。</span></p>
<p><strong><span>OOA<span>呢？</span>OO<span>对</span>A<span>有什么帮助呢？</span></span></strong></p>
<p><span>OOA<span>的主要优点</span></span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>加强了对问题域和系统责任的理解；</span></strong><strong></strong></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>改进与分析有关的各类人员之间的交流；</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>对需求的变化具有较强的适应性；</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>支持软件复用。</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>贯穿软件生命周期全过程的一致性。</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>实用性；</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>有利于用户参与。</span></p>
<p><strong><span>OOA<span>方法的基本步骤</span></span></strong><span><br>&nbsp;<br></span><span>在用</span><span>OOA</span><span>具体地分析一个事物时，大致上遵循如下五个基本步骤：</span><span><br></span><span>第一步，确定对象和类。这里所说的对象是对数据及其处理方式的抽象，它反映了系统保存和处理现实世界中某些事物的信息的能力。类是多个对象的共同属性和方法集合的描述，它包括如何在一个类中建立一个新对象的描述。</span></p>
<p><span>第二步，确定结构（</span><span>structure</span><span>）。结构是指问题域的复杂性和<strong>连接关系</strong>。类成员结构反映了泛化</span><span>-</span><span>特化关系，整体</span><span>-</span><span>部分结构反映整体和局部之间的关系。</span></p>
<p><span>第三步，确定主题（</span><span>subject</span><span>）。主题是指事物的总体概貌和总体分析模型。</span></p>
<p><span>第四步，确定属性（</span><span>attribute</span><span>）。属性就是数据元素，可用来描述对象或分类结构的实例，可在图中给出，并在对象的存储中指定。</span></p>
<p><span>第五步，确定方法（</span><span>method</span><span>）。方法是在收到消息后必须进行的一些处理方法：方法要在图中定义，并在对象的存储中指定。对于每个对象和结构来说，那些用来增加、修改、删除和选择一个方法本身都是隐含的（虽然它们是要在对象的存储中定义的，但并不在图上给出），而有些则是显示的</span><span>。</span></p>
<p>&nbsp;</p>
<p><span>OO<span>是个好东西啊。要理解</span>OO<span>的思想，并能够在实际中运用它。不过</span>OO<span>现在已经不是最热的了，在现在</span>web2.0<span>的年代，基于网页上的应用会更火啊。你开发个软件，如果是单机版的，你都不好意思说！如果是</span>C/S<span>架构的，你也是会被</span>BS<span>的。呵呵。现在什么</span>SOA<span>，</span>AJAX<span>那个火 啊！</span>SOA<span>是</span>service oriented architecture<span>，</span>AJAX<span>是什么东东？中间件、</span>CRP<span>、</span>CPM<span>等等，现在也是牛一</span>B<span>啊。学无止尽，学不能晒网啊；跟上时代的脚步，对新技术保持必要的触觉。恩。</span></span></p>
<p><span>以上纯属胡言乱语，部分摘自网上。如果有兴趣，偶欢迎大家一起来讨论啊。</span></p><img src ="http://www.cppblog.com/jacky2019/aggbug/21550.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-04-09 20:52 <a href="http://www.cppblog.com/jacky2019/archive/2007/04/09/21550.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Finding crash information using the MAP file</title><link>http://www.cppblog.com/jacky2019/archive/2007/04/09/21527.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Mon, 09 Apr 2007 05:45:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/04/09/21527.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/21527.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/04/09/21527.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/21527.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/21527.html</trackback:ping><description><![CDATA[<h2>非常好的一篇文章，from: <a href="http://www.codeproject.com/debug/mapfile.asp">http://www.codeproject.com/debug/mapfile.asp</a>, by <a href="http://www.codeproject.com/script/Articles/list_articles.asp?userid=4750">Wouter Dhondt</a></h2>
<p>几点小说明<br>1、该文是针对vc6.0的，不过vs2003同样适用<br>&nbsp;In the C/C++ tab, select "Line Numbers Only" for Debug Info<br>&nbsp;对应于 Release--&gt;C/C++ tab--&gt;调试信息格式--&gt;仅限行号(/Zd)<br>&nbsp;<br>&nbsp;type the switches /MAPINFO:LINES and /MAPINFO:EXPORTS in the Project Options edit box.<br>&nbsp;对应于 Release--&gt;链接器--&gt;命令行--&gt;附加选项(D): /MAPINFO:LINES /MAPINFO:EXPORTS</p>
<p>2、 该文举的例子在查找行号的时候正好有一个与之对应的<br>&nbsp;119 0001:000001a1<br>&nbsp;不过我在试的时候，没有一个地址正好一致的。比如说我要找的是00000049，但是上面的信息只有<br>&nbsp;25 0001:00000042<br>&nbsp;27 0001:0000004a<br>&nbsp;是第25行呢？还是第27行？结果都不对，正确的似乎是49-42+25=32(32正好是源代码中出错的那一行，不知是不是巧合，未严格验证过！)<br>&nbsp;<br>3、Line numbers信息有很多<br>&nbsp;Line numbers for .\release\main.obj(d:\main.cpp) segment .text<br>&nbsp;Line numbers for C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\lib\LIBC.lib(F:\VS70Builds\3077\vc\crtbld\crt\src\intel\strncpy.asm) segment .text<br>&nbsp;...<br>&nbsp;不过地址都是不一样的了（这个我也未严格验证）<br>&nbsp;<br>4、既然都是可以算出来的，那是不是可以写一个软件来自动算出crash在哪一行呢？有现成的吗？有空研究一下。恩。</p>
<p>Have fun.<br></p>
<h2>Introduction</h2>
<p>Programming neat applications is one thing. But when a user informs you your software has crashed, you know it's best to fix this before adding other features. If you're lucky enough, the user will have a crash address. This will go a long way in solving the problem. But how can you determine what went wrong, using this crash address?</p>
<h2>Creating a MAP file</h2>
<p>Well first of all, you'll need a MAP file. If you don't have one, it will be nearly impossible to find where your application crashed using the crash address. So first, I'll show you how to create a good MAP file. For this, I will create a new project (MAPFILE). You can do the same, or adjust your own project. I create a new project using the Win32 Application option in VC++ 6.0, selecting the 'typical "Hello Word!" application' to keep the size of the MAP file reasonable for explanation.</p>
<p>Once created we need to adjust the project settings for the release version. In the C/C++ tab, select "Line Numbers Only" for Debug Info. </p>
<center><img src="http://www.codeproject.com/debug/mapfile/mapc.jpg"></center>
<p>Many people forget this, but you'll need this option if you want a good MAP file. This will not affect your release in any way. Next is the Link tab. Here you need to select the "Generate mapfile" option. Also, type the switches <code>/MAPINFO:LINES </code>and <code>/MAPINFO:EXPORTS </code>in the Project Options edit box.</p>
<center><img src="http://www.codeproject.com/debug/mapfile/maplink.jpg"></center>
<p>Now, you're ready to compile and link your project. After linking, you will find a .map file in your intermediate directory (together with your exe).</p>
<h2>Reading the MAP file</h2>
<p>After all this dull work, now comes the neat part: how to read the MAP file. We'll do this by using a crash example. So first: how to crash your application. I did this by adding these two lines at the end of the <code>InitInstance() </code>function:</p>
<pre><span class=cpp-keyword>char</span>* pEmpty = NULL;
*pEmpty = 'x'; <span class=cpp-comment>// This is line 119</span></pre>
<p>I'm sure you can find other instructions which will crash your application. Now recompile and link. If you start the application, it will crash and you'll get a message like this: 'The instruction at "0x004011a1" referenced memory at "0x00000000". The memory could not be "Written".' .</p>
<p>Now, it's time to open the MAP file with notepad or something similar. You MAP file will look like this:</p>
<p>The top of the MAP file contains the module name, the timestamp indicating the link of the project, and the preferred load address (which will probably be <code><span class=cpp-literal>0x00400000</span></code> unless you're using a dll). After the header comes the section information that shows which sections the linker brought in from the various OBJ and LIB files.</p>
<div class=precollapse id=premain1 style="WIDTH: 100%"><img id=preimg1 style="CURSOR: hand" height=9 src="http://www.codeproject.com/images/minus.gif" width=9 preid="1"><span id=precollapse1 style="MARGIN-BOTTOM: 0px; CURSOR: hand" preid="1"> Collapse</span></div>
<pre lang=text id=pre1 style="MARGIN-TOP: 0px">MAPFILE
Timestamp is 3df6394d (Tue Dec 10 19:58:21 2002)
Preferred load address is 00400000
Start         Length     Name                   Class
0001:00000000 000038feH .text                   CODE
0002:00000000 000000f4H .idata$5                DATA
0002:000000f8 00000394H .rdata                  DATA
0002:0000048c 00000028H .idata$2                DATA
0002:000004b4 00000014H .idata$3                DATA
0002:000004c8 000000f4H .idata$4                DATA
0002:000005bc 0000040aH .idata$6                DATA
0002:000009c6 00000000H .edata                  DATA
0003:00000000 00000004H .CRT$XCA                DATA
0003:00000004 00000004H .CRT$XCZ                DATA
0003:00000008 00000004H .CRT$XIA                DATA
0003:0000000c 00000004H .CRT$XIC                DATA
0003:00000010 00000004H .CRT$XIZ                DATA
0003:00000014 00000004H .CRT$XPA                DATA
0003:00000018 00000004H .CRT$XPZ                DATA
0003:0000001c 00000004H .CRT$XTA                DATA
0003:00000020 00000004H .CRT$XTZ                DATA
0003:00000030 00002490H .data                   DATA
0003:000024c0 000005fcH .bss                    DATA
0004:00000000 00000250H .rsrc$01                DATA
0004:00000250 00000720H .rsrc$02                DATA</pre>
<p>After the section information, you get the public function information. Notice the "public" part. If you have static-declared C functions, they won't show up in the MAP file. Fortunately, the line numbers will still reflect the static functions. The important parts of the public function information are the function names and the information in the <code>Rva+Base</code> column, which is the starting address of the function.</p>
<div class=precollapse id=premain2 style="WIDTH: 100%"><img id=preimg2 style="CURSOR: hand" height=9 src="http://www.codeproject.com/images/minus.gif" width=9 preid="2"><span id=precollapse2 style="MARGIN-BOTTOM: 0px; CURSOR: hand" preid="2"> Collapse</span></div>
<pre lang=text id=pre2 style="MARGIN-TOP: 0px">  Address         Publics by Value              Rva+Base     Lib:Object
0001:00000000       _WinMain@16                00401000 f   MAPFILE.obj
0001:000000c0       ?MyRegisterClass@@YAGPAUHINSTANCE__@@@Z 004010c0 f   MAPFILE.obj
0001:00000150       ?InitInstance@@YAHPAUHINSTANCE__@@H@Z 00401150 f   MAPFILE.obj
0001:000001b0       ?WndProc@@YGJPAUHWND__@@IIJ@Z 004011b0 f   MAPFILE.obj
0001:00000310       ?About@@YGJPAUHWND__@@IIJ@Z 00401310 f   MAPFILE.obj
0001:00000350       _WinMainCRTStartup         00401350 f   LIBC:wincrt0.obj
0001:00000446       __amsg_exit                00401446 f   LIBC:wincrt0.obj
0001:0000048f       __cinit                    0040148f f   LIBC:crt0dat.obj
0001:000004bc       _exit                      004014bc f   LIBC:crt0dat.obj
0001:000004cd       __exit                     004014cd f   LIBC:crt0dat.obj
0001:00000591       __XcptFilter               00401591 f   LIBC:winxfltr.obj
0001:00000715       __wincmdln                 00401715 f   LIBC:wincmdln.obj
//SNIPPED FOR BETTER READING
0003:00002ab4       __FPinit                   00408ab4     &lt;common&gt;
0003:00002ab8       __acmdln                   00408ab8     &lt;common&gt;
entry point at        0001:00000350
Static symbols
0001:000035d0       LeadUp1                    004045d0 f   LIBC:memmove.obj
0001:000035fc       LeadUp2                    004045fc f   LIBC:memmove.obj
//SNIPPED FOR BETTER READING
0001:00000577       __initterm                 00401577 f   LIBC:crt0dat.obj
0001:0000046b       _fast_error_exit           0040146b f   LIBC:wincrt0.obj</pre>
<p>The public function part is followed by the line information (you got this if you used the <code>/MAPINFO:LINES </code>in the Link tab and selected the "Line numbers" in the C/C++ tab). After this, you will get the export information if your project contains exported functions and you included <code>/MAPINFO:EXPORTS </code>in the link tab.</p>
<div class=precollapse id=premain3 style="WIDTH: 100%"><img id=preimg3 style="CURSOR: hand" height=9 src="http://www.codeproject.com/images/minus.gif" width=9 preid="3"><span id=precollapse3 style="MARGIN-BOTTOM: 0px; CURSOR: hand" preid="3"> Collapse</span></div>
<pre lang=text id=pre3 style="MARGIN-TOP: 0px">Line numbers for .\Release\MAPFILE.obj(F:\MAPFILE\MAPFILE.cpp) segment .text
24 0001:00000000    30 0001:00000004    31 0001:0000001b    32 0001:00000027
35 0001:0000002d    53 0001:00000041    40 0001:00000047    43 0001:00000050
45 0001:00000077    47 0001:00000088    48 0001:0000008f    52 0001:000000ad
53 0001:000000b3    71 0001:000000c0    80 0001:000000c3    81 0001:000000c8
82 0001:000000ff    86 0001:00000114    88 0001:00000135    89 0001:00000145
102 0001:00000150   108 0001:00000155   110 0001:00000188   122 0001:0000018d
115 0001:0000018e   116 0001:0000019a   119 0001:000001a1   121 0001:000001a8
122 0001:000001ae   135 0001:000001b0   143 0001:000001cc   172 0001:000001ee
175 0001:0000020d   149 0001:00000216   157 0001:0000022c   175 0001:00000248
154 0001:00000251   174 0001:0000025f   175 0001:00000261   151 0001:0000026a
174 0001:00000287   175 0001:00000289   161 0001:00000294   164 0001:000002a8
165 0001:000002b6   166 0001:000002d8   174 0001:000002e7   175 0001:000002e9
169 0001:000002f2   174 0001:000002fa   175 0001:000002fc   179 0001:00000310
186 0001:0000031e   193 0001:0000032e   194 0001:00000330   188 0001:00000333
183 0001:00000344   194 0001:00000349</pre>
<p>Now we will look up where the crash occurred. First, we'll determine which function contains the crash address. Look in the "<code>Rva+Base</code>" column and search the first function with an address bigger than the crash address. The preceding entry in the MAP file is the function that had the crash. In our example our crash address is <code><span class=cpp-literal>0x004011a1</span></code>. This is between <code><span class=cpp-literal>0x00401150</span></code> and <code><span class=cpp-literal>0x004011b0</span></code> so we know the crash function is <code>?InitInstance@@YAHPAUHINSTANCE__@@H@Z</code> . Any function name that starts with a question mark is a C++ decorated name. To translate the name, pass it as a command-line parameter to the Platform SDK program UNDNAME.EXE (in the bin dir). You won't need to do this most of the time as you might figure it out just by looking at it (here: <code>InitInstance() </code>in MAPFILE.obj).</p>
<p>This is a big step for bug tracking. But it gets even better: we can find out on which line the crash occurred! We need to do some basic hexadecimal mathematics, so people whom can't do this without a calculator: now is the time to use it. The first step is the following calculation: <code>crash_address - preferred_load_address - <span class=cpp-literal>0x1000</span></code><br>Addresses are offsets from the beginning of the first code section, se we need to do this calculation. Subtracting the preferred load address is logical, but why do we need to substract another 0x1000? The crash address is an offset from the beginning of the code section, but the first part of the binary isn't the code section! The first part of the binary is the Portable Executable (PE), which is 0x1000 bytes long. Mystery solved. In our example, this is: <code><span class=cpp-literal>0x004011a1</span> - <span class=cpp-literal>0x00400000</span> - <span class=cpp-literal>0x1000</span> = <span class=cpp-literal>0x1a1</span></code></p>
<p>Now it's time to look in the line information section of the MAP file. The lines are shown like this: <code><span class=cpp-literal>30</span> <span class=cpp-literal>0001</span>:<span class=cpp-literal>00000004</span></code>. The first number is the line number, the second number is the offset from the beginning of the code section in which this line occurred. If we want to look for our line number, we just have to do the same thing we did for the function: determine the first occurrence of a bigger offset than the one we just calculated. The crash occurred in the preceding entry. In our example: <code><span class=cpp-literal>0x1a1</span></code> is before <code><span class=cpp-literal>0x1a8</span></code>. So our crash occurred on <code>line <span class=cpp-literal>119</span> </code>in MAPFILE.CPP.</p>
<h2>Keeping track of MAP files</h2>
<p>Each release had it's own MAP file. It's not a bad idea to include the MAP file with the exe distribution. This way, you can be certain you have the correct MAP file for this exe. You could keep every MAP file with every exe on your system, but we all know this might give some troubles later on. The MAP file doesn't contain any information you wouldn't want the user to see (unless maybe class and function names ?) . A user would have no use with it, but at least you can ask for the MAP file if you don't have a copy yourself.</p><img src ="http://www.cppblog.com/jacky2019/aggbug/21527.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-04-09 13:45 <a href="http://www.cppblog.com/jacky2019/archive/2007/04/09/21527.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>placement new 操作符</title><link>http://www.cppblog.com/jacky2019/archive/2007/04/06/21375.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Fri, 06 Apr 2007 02:23:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/04/06/21375.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/21375.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/04/06/21375.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/21375.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/21375.html</trackback:ping><description><![CDATA[<p><span>在处理内存分配的时候，</span><span>C++</span><span>程序员会用</span><span>new</span><span>操作符（</span><em><span>operator new</span></em><span>）来分配内存，并用</span><span>delete</span><span>操作符（</span><em><span>operator delete</span></em><span>）来释放内存。这是一个</span><span>new</span><span>操作符的例子。</span></p>
<p><span>class CTest<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>/* </span><span>成员函数和成员数据</span><span> */</span><span><br>};<br><br></span><span>// . . . </span><span>代码</span><span><br><br>// </span><span>分配一个对象</span><span><br>CTest * pTest = new Test;<br></span><span>// </span><span>分配一个有十个对象的数组</span><span> (CTest </span><span>要有缺省构造函数（</span><span>default constuctor</span><span>）</span><span>)</span><span><br>CTest * p10Tests = new Test[ 10];</span><span> </span></p>
<p><span>虽然这种写法在大多数时候都工作得很好，但还是有些情况下使用</span><em><span>new</span></em><span>是很烦人的，比如当你想重新分配一个数组或者当你想在预分配的内存上构造一个对象的时候。</span></p>
<p><span>比如第一种情况，重新分配一个数组效率是很低的：</span></p>
<p><span>// </span><span>分配一个有</span><span>10</span><span>个对象的数组</span><span><br>CTest * pTests = new Test[ 10];<br></span><span>// . . .<br>// </span><span>假设现在我们需要</span><span>11</span><span>个对象</span><span><br>CTest * pNewTests = new Test[ 11];<br></span><span>// . . . </span><span>我们必须把原来的对象拷贝到新分配的内存中</span><span><br>for ( int i = 0; i &lt; 10; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;pNewTests[ i] = pTests[ i];<br>delete pTests;<br>pTests = pNewTests; </span></p>
<p><span>如果你想在预分配的内存上创建对象，用缺省的</span><span>new</span><span>操作符是行不通的。要解决这个问题，你可以用</span><em><span>placement new</span></em><span>构造。它允许你构造一个新对象到预分配的内存上：</span></p>
<p><span>// buffer </span><span>是一个</span><span>void</span><span>指针</span><span> (void *)<br>// </span><span>用方括号</span><span>[] </span><span>括起来的部分是可选的</span><span><br>[CYourClass * pValue = ] new( buffer) CYourClass[( parameters)];</span><span> </span></p>
<p><span>下面是一些例子：</span></p>
<p><span>#include &lt;new&gt;<br><br>class CTest<br>{<br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp;CTest()<br>&nbsp;&nbsp;&nbsp;&nbsp;{}<br>&nbsp;&nbsp;&nbsp;&nbsp;CTest( int)<br>&nbsp;&nbsp;&nbsp;&nbsp;{}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>/* </span><span>代码</span><span>*/</span><span><br>};<br><br>int main(int argc, char* argv[])<br>{</span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;// </span><span>由于这个例子的目的，我们不考虑内存对齐问题</span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;char strBuff[ sizeof( CTest) * 10 + 100];<br>&nbsp;&nbsp;&nbsp;&nbsp;CTest * pBuffer = ( CTest *)strBuff;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>// </span><span>缺省构造</span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;CTest * pFirst = new(pBuffer) CTest;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>// </span><span>缺省构造</span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;CTest * pSecond = new(pBuffer + 1) CTest;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>// </span><span>带参数的构造；</span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;// </span><span>不理会返回的指针</span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;new(pBuffer + 2) CTest( 5);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>// </span><span>带参数的构造</span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;CTest * pFourth = new( pBuffer + 3) CTest( 10);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>// </span><span>缺省构造</span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;CTest * pFifth = new(pBuffer + 4) CTest();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>// </span><span>构造多个元素（缺省构造）</span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;CTest * pMultipleElements = new(pBuffer + 5) CTest[ 5];<br>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>} </span></p>
<p><span>当你有自己的内存缓冲区或者在你实现自己的内存分配策略的时候，</span><em><span>placement new</span></em><span>会很有用。事实上在</span><span>STL</span><span>中广泛使用了</span><em><span>placement new</span></em><span>来给容器分配内存；每个容器类都有一个模版参数说明了构造</span><span>/</span><span>析构对象时所用的分配器（</span><span>allocator</span><span>）。</span></p>
<p><span>在使用</span><em><span>placement new</span></em><span>的时候，你要记住以下几点：</span></p>
<ul type=disc>
    <li><span>加上头文件</span><span>#include &lt;new&gt; </span></li>
    <li><span>你可以用</span><span>placement new</span><span>构造一个数组中的元素。</span><span> </span></li>
    <li><span>要析构一个用</span><span>placement new</span><span>分配的对象，你应该手工调用析构函数（并不存在一个</span><span>&#8220;placement delete&#8221;</span><span>）。它的语法如下：</span><span> </span></li>
</ul>
<p><span>pFirst-&gt;~CTest();<br>pSecond-&gt;~CTest();<br></span><span>//&nbsp;&nbsp;. . . </span><span>等等</span></p>
<p>&nbsp;</p>


<script type=text/javascript>
    <!--
google_ad_client = "pub-6457474891690507";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
google_ad_channel = "";
//-->
  </script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
  </script>
<!-- Search Google -->
<center>
<form action=http://www.google.cn/custom method=get target=_top>
<table bgColor=#ffffff>
<tbody>
<tr>
<td vAlign=top noWrap align=left height=32><a href="http://www.google.com/"><img alt=Google src="http://www.google.com/logos/Logo_25wht.gif" align=middle border=0> </a><label style="DISPLAY: none" for=sbi>输入您的搜索字词</label> <input id=sbi maxLength=255 size=31 name=q> <label style="DISPLAY: none" for=sbb>提交搜索表单</label> <input id=sbb type=submit value=搜索 name=sa> <input type=hidden value=pub-6457474891690507 name=client> <input type=hidden value=1 name=forid> <input type=hidden value=GB2312 name=ie> <input type=hidden value=GB2312 name=oe> <input type=hidden value=GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1 name=cof> <input type=hidden value=zh-CN name=hl> </td></tr></tbody></table></form></center><!-- Search Google --><img src ="http://www.cppblog.com/jacky2019/aggbug/21375.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-04-06 10:23 <a href="http://www.cppblog.com/jacky2019/archive/2007/04/06/21375.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CRuntimeClass的应用 </title><link>http://www.cppblog.com/jacky2019/archive/2007/04/06/21371.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Fri, 06 Apr 2007 02:10:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/04/06/21371.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/21371.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/04/06/21371.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/21371.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/21371.html</trackback:ping><description><![CDATA[<p><span>CRuntimeClass</span><span>在</span><span>MFC</span><span>中的作用很重要，因为</span><span>MFC</span><span>利用它来进行类的动态确定，即是通过类变量来判定该变量是否为某一类的实例。由于指针的类型是可以转换的，所以时常会出现从</span><span>A</span><span>到</span><span>B</span><span>的转换导致错误。而在</span><span>MFC</span><span>的各种书籍中对</span><span>CRuntimeClass</span><span>的介绍是比较少的，在这里总结它的一些用法。</span></p>
<p><span>1</span><span>、动态确定类</span></p>
<p><span>在</span><span>MFC</span><span>中</span><span>CObject::IsKindOf( const CRuntimeClass* pClass ) </span><span>利用</span><span>CRuntimeClass</span><span>来进行判定，如果你生成的类是以</span><span>CObject</span><span>为基础的，你可以使用该成员函数来判定。下面举一个例子来加深了解。</span></p>
<p><span>class CAge:public CObject</span></p>
<p><span>BOOL IsAge(CObject* pO)</span></p>
<p><span>{</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>return pO-&gt;IsKindOf( RUNTIME_CLASS( CAge ) );</span></p>
<p><span>}</span></p>
<p><span>BOOL IsAge2(CAge* pO)</span></p>
<p><span>{</span></p>
<p><span><span>&nbsp;&nbsp; </span>&nbsp;return pO-&gt;IsKindOf( RUNTIME_CLASS( CAge ) );</span></p>
<p><span>}</span></p>
<p><span>void main(void)</span></p>
<p><span>{</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>CObject a;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>CAge b;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>IsAge(&amp;a);//return FALSE</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>IsAge(&amp;b);//return TRUE</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>IsAge2((CAge*)&amp;a);//return FALSE,</span><span>避免强制转换带来的错误</span></p>
<p><span>}</span></p>
<p>&nbsp;</p>
<p><span>2</span><span>、生成类</span></p>
<p><span>CObject CRuntimeClass::CreateObject(void)</span><span>可以产生一个类变量。作用和</span><span>new</span><span>类似，但在某些特殊场合有独特的作用。下面举一个例子来加深了解。</span></p>
<p><span>假定有以下几个类定义</span></p>
<p><span>class CWndA: public CWnd</span></p>
<p><span>class CWndB: public CWnd</span></p>
<p><span>function1()</span></p>
<p><span>{</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>CRuntimeClass* pC=RUNTIME_CLASS( CWndA );</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>CreateWnd(pC);</span></p>
<p><span>}</span></p>
<p><span>CWnd* CreateWnd(CRuntimeClass* pClass)</span></p>
<p><span>{</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>return (CWnd*)pClass-&gt;CreateObject();</span></p>
<p><span>}</span></p>
<p><span>在上面例子中，</span><span>CreateWnd</span><span>返回的是</span><span>CWnd* </span><span>其实它是一个</span><span>CWndA*</span><span>。你可以进行由父类到子类的强制转换而不必要担心出错。使用</span><span>CRuntimeClass</span><span>可以代替使用</span><span>switch</span><span>生产类实例的一些繁琐。（请好好想想它的用途，当你发现它的好处时，你一定会大吃一惊，</span><span>M$</span><span>使用宏来实现类的动态检测，如果谁有兴趣可以去看看</span><span>MFC</span><span>的源代码。）</span></p>
<p>&nbsp;</p>
<p><span>注意：在类的定义中使用</span><span>IMPLEMENT_DYNCREATE</span><span>后方可生效。</span></p>
<p>&nbsp;</p>

<script type=text/javascript>
    <!--
google_ad_client = "pub-6457474891690507";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
google_ad_channel = "";
//-->
  </script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
  </script>
<!-- Search Google -->
<center>
<form action=http://www.google.cn/custom method=get target=_top>
<table bgColor=#ffffff>
<tbody>
<tr>
<td vAlign=top noWrap align=left height=32><a href="http://www.google.com/"><img alt=Google src="http://www.google.com/logos/Logo_25wht.gif" align=middle border=0> </a><label style="DISPLAY: none" for=sbi>输入您的搜索字词</label> <input id=sbi maxLength=255 size=31 name=q> <label style="DISPLAY: none" for=sbb>提交搜索表单</label> <input id=sbb type=submit value=搜索 name=sa> <input type=hidden value=pub-6457474891690507 name=client> <input type=hidden value=1 name=forid> <input type=hidden value=GB2312 name=ie> <input type=hidden value=GB2312 name=oe> <input type=hidden value=GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1 name=cof> <input type=hidden value=zh-CN name=hl> </td></tr></tbody></table></form></center><!-- Search Google --><img src ="http://www.cppblog.com/jacky2019/aggbug/21371.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-04-06 10:10 <a href="http://www.cppblog.com/jacky2019/archive/2007/04/06/21371.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC调试入门</title><link>http://www.cppblog.com/jacky2019/archive/2007/04/05/21337.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Thu, 05 Apr 2007 09:47:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/04/05/21337.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/21337.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/04/05/21337.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/21337.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/21337.html</trackback:ping><description><![CDATA[<p><strong><span>概述</span></strong><span><br></span><span>调试是一个程序员最基本的技能，其重要性甚至超过学习一门语言。不会调试的程序员就意味着他即使会一门语言，却不能编制出任何好的软件。</span><span><br></span><span>这里我简要的根据自己的经验列出调试中比较常用的技巧，希望对大家有用。</span><span><br></span><span>本文约定，在选择菜单时，通过</span><span>/</span><span>表示分级菜单，例如</span><span>File/Open</span><span>表示顶级菜单</span><span>File</span><span>的子菜单</span><span>Open</span><span>。</span><span><br>&nbsp;<br></span><strong><span>设置</span></strong><span><br></span><span>为了调试一个程序，首先必须使程序中包含调试信息。一般情况下，一个从</span><span>AppWizard</span><span>创建的工程中包含的</span><span>Debug Configuration</span><span>自动包含调试信息，但是是不是</span><span>Debug</span><span>版本并不是程序包含调试信息的决定因素，程序设计者可以在任意的</span><span>Configuration</span><span>中增加调试信息，包括</span><span>Release</span><span>版本。</span><span><br></span><span>为了增加调试信息，可以按照下述步骤进行：</span><span> </span></p>
<ul type=disc>
    <li><span>打开</span><span>Project settings</span><span>对话框（可以通过快捷键</span><span>ALT+F7</span><span>打开，也可以通过</span><span>IDE</span><span>菜单</span><span>Project/Settings</span><span>打开</span><span>) </span></li>
    <li><span>选择</span><span>C/C++</span><span>页，</span><span>Category</span><span>中选择</span><span>general </span><span>，则出现一个</span><span>Debug Info</span><span>下拉列表框，可供选择的调试信息</span><span> </span><span>方式包括：</span><span> <br></span><span>　</span><span> </span></li>
</ul>
<table cellSpacing=0 cellPadding=0 width=614 border=1>
    <tbody>
        <tr>
            <td width=56>
            <p align=center><strong><span>命令行</span></strong></p>
            </td>
            <td width=160>
            <p align=center><strong><span>Project settings</span></strong></p>
            </td>
            <td width=394>
            <p align=center><strong><span>说明</span></strong></p>
            </td>
        </tr>
        <tr>
            <td width=56>
            <p><span>无</span></p>
            </td>
            <td width=160>
            <p><span>None</span></p>
            </td>
            <td width=394>
            <p><span>没有调试信息</span></p>
            </td>
        </tr>
        <tr>
            <td width=56>
            <p><span>/Zd</span></p>
            </td>
            <td width=160>
            <p><span>Line Numbers Only</span></p>
            </td>
            <td width=394>
            <p><span>目标文件或者可执行文件中只包含全局和导出符号以及代码行信息，不包含符号调试信息</span></p>
            </td>
        </tr>
        <tr>
            <td width=56>
            <p><span>/Z7</span></p>
            </td>
            <td width=160>
            <p><span>C 7.0- Compatible</span></p>
            </td>
            <td width=394>
            <p><span>目标文件或者可执行文件中包含行号和所有符号调试信息，包括变量名及类型，函数及原型等</span></p>
            </td>
        </tr>
        <tr>
            <td width=56>
            <p><span>/Zi</span></p>
            </td>
            <td width=160>
            <p><span>Program Database</span></p>
            </td>
            <td width=394>
            <p><span>创建一个程序库</span><span>(PDB)</span><span>，包括类型信息和符号调试信息。</span></p>
            </td>
        </tr>
        <tr>
            <td width=56>
            <p><span>/ZI</span></p>
            </td>
            <td width=160>
            <p><span>Program Database for Edit and Continue</span></p>
            </td>
            <td width=394>
            <p><span>除了前面</span><span>/Zi</span><span>的功能外，这个选项允许对代码进行调试过程中的修改和继续执行。这个选项同时使</span><span>#pragma</span><span>设置的优化功能无效</span></p>
            </td>
        </tr>
    </tbody>
</table>
<ul type=disc>
    <li>&nbsp;</li>
    <li><span>选择</span><span>Link</span><span>页，选中复选框</span><span>"Generate Debug Info"</span><span>，这个选项将使连接器把调试信息写进可执行文件和</span><span>DLL </span></li>
    <li><span>如果</span><span>C/C++</span><span>页中设置了</span><span>Program Database</span><span>以上的选项，则</span><span>Link incrementally</span><span>可以选择。选中这个选项，将使程序可以在上一次编译的基础上被编译（即增量编译），而不必每次都从头开始编译。</span><span> </span></li>
</ul>
<p><strong><span>断点</span></strong><span><br></span><span>断点是调试器设置的一个代码位置。当程序运行到断点时，程序中断执行，回到调试器。断点是</span><span> </span><span>最常用的技巧。调试时，只有设置了断点并使程序回到调试器，才能对程序进行在线调试。</span><span><br><br></span><span>设置断点：可以通过下述方法设置一个断点。首先把光标移动到需要设置断点的代码行上，然后</span><span> </span></p>
<ul type=disc>
    <li><span>按</span><span>F9</span><span>快捷键</span><span> </span></li>
    <li><span>弹出</span><span>Breakpoints</span><span>对话框，方法是按快捷键</span><span>CTRL+B</span><span>或</span><span>ALT+F9</span><span>，或者通过菜单</span><span>Edit/Breakpoints</span><span>打开。打开后点击</span><span>Break at</span><span>编辑框的右侧的箭头，选择</span><span> </span><span>合适的位置信息。一般情况下，直接选择</span><span>line xxx</span><span>就足够了，如果想设置不是当前位置的断点，可以选择</span><span>Advanced</span><span>，然后填写函数、行号和可执行文件信息。</span><span> </span></li>
</ul>
<p><span>去掉断点：把光标移动到给定断点所在的行，再次按</span><span>F9</span><span>就可以取消断点。同前面所述，打开</span><span>Breakpoints</span><span>对话框后，也可以按照界面提示去掉断点。</span><span><br><br></span><span>条件断点：可以为断点设置一个条件，这样的断点称为条件断点。对于新加的断点，可以单击</span><span>Conditions</span><span>按钮，为断点设置一个表达式。当这个表达式发生改变时，程序就</span><span> </span><span>被中断。底下设置包括</span><span>&#8220;</span><span>观察数组或者结构的元素个数</span><span>&#8221;</span><span>，似乎可以设置一个指针所指向的内存区的大小，但是我设置一个比较的值但是改动</span><span> </span><span>范围之外的内存区似乎也导致断点起效。最后一个设置可以让程序先执行多少次然后才到达断点。</span><span><br><br></span><span>数据断点：数据断点只能在</span><span>Breakpoints</span><span>对话框中设置。选择</span><span>&#8220;Data&#8221;</span><span>页，就显示了设置数据断点的对话框。在编辑框中输入一个表达式，当这个</span><span> </span><span>表达式的值发生变化时，数据断点就到达。一般情况下，这个表达式应该由运算符和全局变量构成，例如：在编辑框中输入</span><span> g_bFlag</span><span>这个全局变量的名字，那么当程序中有</span><span>g_bFlag= !g_bFlag</span><span>时，程序就将停在这个语句处。</span><span><br><br></span><span>消息断点：</span><span>VC</span><span>也支持对</span><span>Windows</span><span>消息进行截获。他有两种方式进行截获：窗口消息处理函数和特定消息中断。</span><span><br></span><span>在</span><span>Breakpoints</span><span>对话框中选择</span><span>Messages</span><span>页，就可以设置消息断点。如果在上面那个对话框中写入消息处理函数的名字，那么</span><span> </span><span>每次消息被这个函数处理，断点就到达（我觉得如果采用普通断点在这个函数中截获，效果应该一样）。如果在底下的下拉</span><span> </span><span>列表框选择一个消息，则每次这种消息到达，程序就中断。</span><span><br><br></span><strong><span>值</span></strong><span><br><strong>Watch</strong><br>VC</span><span>支持查看变量、表达式和内存的值。所有这些观察都必须是在断点中断的情况下进行。</span><span><br></span><span>观看变量的值最简单，当断点到达时，把光标移动到这个变量上，停留一会就可以看到变量的值。</span><span><br>VC</span><span>提供一种被成为</span><span>Watch</span><span>的机制来观看变量和表达式的值。在断点状态下，在变量上单击右键，选择</span><span>Quick Watch</span><span>，</span><span> </span><span>就弹出一个对话框，显示这个变量的值。</span><span><br></span><span>单击</span><span>Debug</span><span>工具条上的</span><span>Watch</span><span>按钮，就出现一个</span><span>Watch</span><span>视图（</span><span>Watch1,Watch2,Watch3,Watch4</span><span>），在该视图中输入变量或者表达式，就可以观察</span><span> </span><span>变量或者表达式的值。注意：这个表达式不能有副作用，例如</span><span>++</span><span>运算符绝对禁止用于这个表达式中，因为这个运算符将修改变量的值，导致</span><span> </span><span>软件的逻辑被破坏。</span><span><br><br><strong>Memory</strong><br></span><span>由于指针指向的数组，</span><span>Watch</span><span>只能显示第一个元素的值。为了显示数组的后续内容，或者要显示一片内存的内容，可以使用</span><span>memory</span><span>功能。在</span><span> Debug</span><span>工具条上点</span><span>memory</span><span>按钮，就弹出一个对话框，在其中输入地址，就可以显示该地址指向的内存的内容。</span><strong><span><br><br>Varibles</span></strong><span><br>Debug</span><span>工具条上的</span><span>Varibles</span><span>按钮弹出一个框，显示所有当前执行上下文中可见的变量的值。特别是当前指令涉及的变量，以红色显示。</span><span><br><br></span><strong><span>寄存器</span></strong><span><br>Debug</span><span>工具条上的</span><span>Reigsters</span><span>按钮弹出一个框，显示当前的所有寄存器的值。</span><span><br><br></span><strong><span>进程控制</span></strong><span><br>VC</span><span>允许被中断的程序继续运行、单步运行和运行到指定光标处，分别对应快捷键</span><span>F5</span><span>、</span><span>F10/F11</span><span>和</span><span>CTRL+F10</span><span>。各个快捷键功能如下：</span><span> <br></span><span>　</span><span> </span></p>
<table cellSpacing=0 cellPadding=0 width="91%" border=1>
    <tbody>
        <tr>
            <td width="30%">
            <p align=center><strong><span>快捷键</span></strong></p>
            </td>
            <td width="70%">
            <p align=center><strong><span>说明</span></strong></p>
            </td>
        </tr>
        <tr>
            <td width="30%">
            <p align=center><span>F5</span></p>
            </td>
            <td width="70%">
            <p><span>继续运行</span></p>
            </td>
        </tr>
        <tr>
            <td width="30%">
            <p align=center><span>F10</span></p>
            </td>
            <td width="70%">
            <p><span>单步，如果涉及到子函数，不进入子函数内部</span></p>
            </td>
        </tr>
        <tr>
            <td width="30%">
            <p align=center><span>F11</span></p>
            </td>
            <td width="70%">
            <p><span>单步，如果涉及到子函数，进入子函数内部</span></p>
            </td>
        </tr>
        <tr>
            <td width="30%">
            <p align=center><span>CTRL+F10</span></p>
            </td>
            <td width="70%">
            <p><span>运行到当前光标处。</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><strong><span>Call Stack</span></strong><span><br></span><span>调用堆栈反映了当前断点处函数是被那些函数按照什么顺序调用的。单击</span><span>Debug</span><span>工具条上的</span><span>Call stack</span><span>就显示</span><span>Call Stack</span><span>对话框。在</span><span>CallStack</span><span>对话框中显示了一个调用系列，最上面的是当前函数，往下依次是调用函数的上级函数。单击这些函数名可以跳到对应的函数中去。</span><span><br><br></span><strong><span>其他调试手段</span></strong><span><br></span><span>系统提供一系列特殊的函数或者宏来处理</span><span>Debug</span><span>版本相关的信息，如下：</span><span> </span></p>
<table cellSpacing=0 cellPadding=0 width="86%" border=1>
    <tbody>
        <tr>
            <td width="42%">
            <p align=center><strong><span>宏名</span></strong><strong><span>/</span></strong><strong><span>函数名</span></strong></p>
            </td>
            <td width="58%">
            <p align=center><strong><span>说明</span></strong></p>
            </td>
        </tr>
        <tr>
            <td width="42%">
            <p align=center><span>TRACE</span></p>
            </td>
            <td width="58%">
            <p><span>使用方法和</span><span>printf</span><span>完全一致，他在</span><span>output</span><span>框中输出调试信息</span></p>
            </td>
        </tr>
        <tr>
            <td width="42%">
            <p align=center><span>ASSERT</span></p>
            </td>
            <td width="58%">
            <p><span>它接收一个表达式，如果这个表达式为</span><span>TRUE</span><span>，则无动作，否则中断当前程序执行。对于系统中出现这个宏</span><span> </span><span>导致的中断，应该认为你的函数调用未能满足系统的调用此函数的前提条件。例如，对于一个还没有创建的窗口调用</span><span>SetWindowText</span><span>等。</span></p>
            </td>
        </tr>
        <tr>
            <td width="42%">
            <p align=center><span>VERIFY</span></p>
            </td>
            <td width="58%">
            <p><span>和</span><span>ASSERT</span><span>功能类似，所不同的是，在</span><span>Release</span><span>版本中，</span><span>ASSERT</span><span>不计算输入的表达式的值，而</span><span>VERIFY</span><span>计算表达式的值。</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><strong><span>关注</span></strong><span><br></span><span>一个好的程序员不应该把所有的判断交给编译器和调试器，应该在程序中自己加以程序保护和错误定位，具体措施包括：</span><span> </span></p>
<ul type=disc>
    <li><span>对于所有有返回值的函数，都应该检查返回值，除非你确信这个函数调用绝对不会出错，或者不关心它是否出错。</span><span> </span></li>
    <li><span>一些函数返回错误，需要用其他函数获得错误的具体信息。例如</span><span>accept</span><span>返回</span><span>INVALID_SOCKET</span><span>表示</span><span>accept</span><span>失败，为了查明</span><span> </span><span>具体的失败原因，应该立刻用</span><span>WSAGetLastError</span><span>获得错误码，并针对性的解决问题。</span><span> </span></li>
    <li><span>有些函数通过异常机制抛出错误，应该用</span><span>TRY-CATCH</span><span>语句来检查错误</span><span> </span></li>
    <li><span>程序员对于能处理的错误，应该自己在底层处理，对于不能处理的，应该报告给用户让他们决定怎么处理。如果程序出了异常，</span><span> </span><span>却不对返回值和其他机制返回的错误信息进行判断，只能是加大了找错误的难度。</span><span> </span></li>
</ul>
<p><span>另外：</span><span>VC</span><span>中要编制程序不应该一开始就写</span><span>cpp/h</span><span>文件，而应该首先创建一个合适的工程。因为只有这样，</span><span>VC</span><span>才能选择合适的编译、连接</span><span> </span><span>选项。对于加入到工程中的</span><span>cpp</span><span>文件，应该检查是否在第一行显式的包含</span><span>stdafx.h</span><span>头文件，这是</span><span>Microsoft Visual Studio</span><span>为了加快编译</span><span> </span><span>速度而设置的预编译头文件。在这个</span><span>#include "stdafx.h"</span><span>行前面的所有代码将被忽略，所以其他头文件应该在这一行后面被包含。</span><span><br></span><span>对于</span><span>.c</span><span>文件，由于不能包含</span><span>stdafx.h</span><span>，因此可以通过</span><span>Project settings</span><span>把它的预编译头设置为</span><span>&#8220;</span><span>不使用</span><span>&#8221;</span><span>，方法是：</span><span> </span></p>
<ul type=disc>
    <li><span>弹出</span><span>Project settings</span><span>对话框</span><span> </span></li>
    <li><span>选择</span><span>C/C++ </span></li>
    <li><span>Category</span><span>选择</span><span>Precompilation Header </span></li>
    <li><span>选择不使用预编译头。</span><span> </span></li>
</ul>
<p>&nbsp;</p>

<script type=text/javascript>
    <!--
google_ad_client = "pub-6457474891690507";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
google_ad_channel = "";
//-->
  </script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
  </script>
<!-- Search Google -->
<center>
<form action=http://www.google.cn/custom method=get target=_top>
<table bgColor=#ffffff>
<tbody>
<tr>
<td vAlign=top noWrap align=left height=32><a href="http://www.google.com/"><img alt=Google src="http://www.google.com/logos/Logo_25wht.gif" align=middle border=0> </a><label style="DISPLAY: none" for=sbi>输入您的搜索字词</label> <input id=sbi maxLength=255 size=31 name=q> <label style="DISPLAY: none" for=sbb>提交搜索表单</label> <input id=sbb type=submit value=搜索 name=sa> <input type=hidden value=pub-6457474891690507 name=client> <input type=hidden value=1 name=forid> <input type=hidden value=GB2312 name=ie> <input type=hidden value=GB2312 name=oe> <input type=hidden value=GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1 name=cof> <input type=hidden value=zh-CN name=hl> </td></tr></tbody></table></form></center><!-- Search Google --><img src ="http://www.cppblog.com/jacky2019/aggbug/21337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-04-05 17:47 <a href="http://www.cppblog.com/jacky2019/archive/2007/04/05/21337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>显卡是干什么用的？</title><link>http://www.cppblog.com/jacky2019/archive/2007/04/05/21319.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Thu, 05 Apr 2007 07:23:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/04/05/21319.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/21319.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/04/05/21319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/21319.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/21319.html</trackback:ping><description><![CDATA[<p><span>突然想到这个问题。不知道！刚才看书看到</span><span>GDI<span>的时候想到的。</span>Google<span>了一下，不过下面的资料似乎有点</span>old<span>了，不过如果你也一样和我有同样的疑问的话，还是有的一读的，呵呵。</span></span></p>
<p><span>显卡又称显示器适配卡，现在的显卡都是</span><span>3D</span><span>图形加速卡。它是是连接主机与显示器的接口卡。其作用是将主机的输出信息转换成字符、图形和颜色等信息，传送到显示器上显示。显示卡插在主板的</span><span>ISA</span><span>、</span><span>PCI</span><span>、</span><span>AGP</span><span>扩展插槽中，</span><span>ISA</span><span>显示卡现已基本淘汰。现在也有一些主板是集成显卡的。</span></p>
<p><span>每一块显示卡基本上都是由</span><span>&#8220;</span><span>显示主芯片</span><span>&#8221;</span><span>，</span><span>&#8220;</span><span>显示缓存</span><span>&#8221;</span><span>（简称显存），</span><span>&#8220;BIOS&#8221;</span><span>，数字模拟转换器（</span><span>RAMDAC</span><span>），</span><span>&#8220;</span><span>显卡的接口</span><span>&#8221;</span><span>以及卡上的电容、电阻等组成。多功能显卡还配备了视频输出以及输入，供特殊需要。随着技术的发展，目前大多数显卡都将</span><span>RAMDAC</span><span>集成到了主芯片了。</span><span> <br><br></span><span>显示主芯片顾名思义，显示主芯片自然是显示卡的核心，如</span><span>nVIDIA</span><span>公司的</span><span>TNT2</span><span>、</span><span>GeForce2</span><span>、</span><span>GeForce MX</span><span>以及现在刚出现市场不久的</span><span>GeForce 4</span><span>。它们的主要任务就是处理系统输入的视频信息并将其进行构建、渲染等工作。显示主芯片的性能直接决定这显示卡性能的高低，不同的显示芯片，不论从内部结构还是其性能，都存在着差异，而其价格差别也很大。一般来说，越贵的显卡，性能自然越好。</span></p>
<p><span>显存</span><span> <br><br></span><span>显示卡的主芯片在整个显示卡中的地位固然重要，但显存的大小与好坏也直接关系着显示卡的性能高低。</span><span> <br></span><span>建议</span><span>:</span><span>买的一定要性能高的</span><span>.</span><span>不然的话就会出现画面流畅</span><span>,</span><span>卡</span><span>,</span><span>花屏</span><span> /</span><span>等一些</span><span>. <br>SDRAM</span><span>是现在应用最广的显存，几乎市场上的显卡使用的都是</span><span>SDRAM</span><span>显存。</span><span>SDRAM</span><span>与早期产品的设计思路完全不同，它可以在一个时钟周期内进行数据的读写，从而节省了等待时间。</span><span>SDRAM</span><span>现在已经成为显存市场上的主导产品，这主要是因为其低廉的价格和较佳的性能</span><span>.</span><span>这种的不错哦</span><span>.</span></p>

<script type=text/javascript>
    <!--
google_ad_client = "pub-6457474891690507";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
google_ad_channel = "";
//-->
  </script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
  </script>
<!-- Search Google -->
<center>
<form action=http://www.google.cn/custom method=get target=_top>
<table bgColor=#ffffff>
<tbody>
<tr>
<td vAlign=top noWrap align=left height=32><a href="http://www.google.com/"><img alt=Google src="http://www.google.com/logos/Logo_25wht.gif" align=middle border=0> </a><label style="DISPLAY: none" for=sbi>输入您的搜索字词</label> <input id=sbi maxLength=255 size=31 name=q> <label style="DISPLAY: none" for=sbb>提交搜索表单</label> <input id=sbb type=submit value=搜索 name=sa> <input type=hidden value=pub-6457474891690507 name=client> <input type=hidden value=1 name=forid> <input type=hidden value=GB2312 name=ie> <input type=hidden value=GB2312 name=oe> <input type=hidden value=GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1 name=cof> <input type=hidden value=zh-CN name=hl> </td></tr></tbody></table></form></center><!-- Search Google --><img src ="http://www.cppblog.com/jacky2019/aggbug/21319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-04-05 15:23 <a href="http://www.cppblog.com/jacky2019/archive/2007/04/05/21319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>创建自己的CriticalSection和Lock</title><link>http://www.cppblog.com/jacky2019/archive/2007/04/04/21265.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Wed, 04 Apr 2007 13:38:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/04/04/21265.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/21265.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/04/04/21265.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/21265.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/21265.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><strong>Lockable.h: CriticalSection<span lang=ZH-CN>的抽象父类</span></strong><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">class LockableObject<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public:<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>LockableObject(){}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>virtual ~LockableObject(){}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>virtual void Lock() = 0;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>virtual void Unlock() = 0;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">};<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><strong>CriticalSection.h<o:p></o:p></strong></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">#include "LockableObject.h"<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">#include &lt;windows.h&gt;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">class CriticalSection : public LockableObject<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public:<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CriticalSection();<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>virtual ~CriticalSection();<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>virtual void Lock();<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>virtual void Unlock();<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>private:<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CRITICAL_SECTION mCriticalSection;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">};<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><strong>CriticalSection.cpp<o:p></o:p></strong></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">#include "CriticalSection.h"<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">CriticalSection::CriticalSection()<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>InitializeCriticalSection(&amp;mCriticalSection);<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">CriticalSection::~CriticalSection()<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DeleteCriticalSection(&amp;mCriticalSection);<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">void CriticalSection::Lock()<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>EnterCriticalSection(&amp;mCriticalSection);<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">void CriticalSection::Unlock()<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>LeaveCriticalSection(&amp;mCriticalSection);<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><strong>Lock.h<o:p></o:p></strong></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">#include "CriticalSection.h"<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">class Lock<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public:<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Lock(LockableObject* pLockable);<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>~Lock();<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>private:<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>LockableObject* mLockable;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">};<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><strong>Lock.cpp<o:p></o:p></strong></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">#include "Lock.h"<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">Lock::Lock(LockableObject* pLockable)<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>mLockable = pLockable;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pLockable-&gt;Lock();<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">Lock::~Lock()<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>mLockable-&gt;Unlock();<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'">}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0in 0in 10pt"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-fareast; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></p>

<script type="text/javascript"><!--
google_ad_client = "pub-6457474891690507";
google_ad_width = 728;
google_ad_height = 15;
google_ad_format = "728x15_0ads_al";
google_ad_channel = "";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>


  </script><!-- Search Google -->
<center>
<form action=http://www.google.cn/custom method=get target=_top>
    <table bgColor=#ffffff>
        <tbody>
            <tr>
                <td vAlign=top noWrap align=left height=32><a href="http://www.google.com/"><img alt=Google src="http://www.google.com/logos/Logo_25wht.gif" align=middle border=0> </a><label style="DISPLAY: none" for=sbi>输入您的搜索字词</label> <input id=sbi maxLength=255 size=31 name=q> <label style="DISPLAY: none" for=sbb>提交搜索表单</label> <input id=sbb type=submit value=搜索 name=sa> <input type=hidden value=pub-6457474891690507 name=client> <input type=hidden value=1 name=forid> <input type=hidden value=GB2312 name=ie> <input type=hidden value=GB2312 name=oe> <input type=hidden value=GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1 name=cof> <input type=hidden value=zh-CN name=hl> </td>
            </tr>
        </tbody>
    </table>
</form>
</center><!-- Search Google --><img src ="http://www.cppblog.com/jacky2019/aggbug/21265.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-04-04 21:38 <a href="http://www.cppblog.com/jacky2019/archive/2007/04/04/21265.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Google推出拼音输入法了！</title><link>http://www.cppblog.com/jacky2019/archive/2007/04/04/21243.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Wed, 04 Apr 2007 07:37:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/04/04/21243.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/21243.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/04/04/21243.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/21243.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/21243.html</trackback:ping><description><![CDATA[&nbsp;<span>网址：</span><span><a href="http://tools.google.com/pinyin">http://tools.google.com/pinyin</a></span>
<p><span>下载地址：</span><span><a href="http://dl.google.com/pinyin/GooglePinyinInstaller.exe">http://dl.google.com/pinyin/GooglePinyinInstaller.exe</a></span></p>
<p><span>用了一下，感觉挺好用的，同志们有兴趣的话，也试试看吧。恩</span></p>
<p><span>聪明的谷歌拼音输入法五大特色：</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>智能组句：选词准确率高，能聪明地理解您的意图，短句长句都合适。 </span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>流行词汇：整合互联网上的流行词汇、热门搜索一网打尽，词组丰富强大。 </span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>网络同步：您可以将使用习惯和个人字典同步在</span><span> Google <span>帐号，一个跟您走的个性化输入法。 </span></span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>一键搜索：拼写输入的同时轻点一键即可快捷搜索。输入法结合搜索框一举两得。 </span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>英文提示：打英文时只需输入前几个字母，输入法自动提示您可能要找的单字。</span></p>

<script type=text/javascript>
    <!--
google_ad_client = "pub-6457474891690507";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
google_ad_channel = "";
//-->
  </script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
  </script>
<!-- Search Google -->
<center>
<form action=http://www.google.cn/custom method=get target=_top>
<table bgColor=#ffffff>
<tbody>
<tr>
<td vAlign=top noWrap align=left height=32><a href="http://www.google.com/"><img alt=Google src="http://www.google.com/logos/Logo_25wht.gif" align=middle border=0> </a><label style="DISPLAY: none" for=sbi>输入您的搜索字词</label> <input id=sbi maxLength=255 size=31 name=q> <label style="DISPLAY: none" for=sbb>提交搜索表单</label> <input id=sbb type=submit value=搜索 name=sa> <input type=hidden value=pub-6457474891690507 name=client> <input type=hidden value=1 name=forid> <input type=hidden value=GB2312 name=ie> <input type=hidden value=GB2312 name=oe> <input type=hidden value=GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1 name=cof> <input type=hidden value=zh-CN name=hl> </td></tr></tbody></table></form></center><!-- Search Google --><img src ="http://www.cppblog.com/jacky2019/aggbug/21243.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-04-04 15:37 <a href="http://www.cppblog.com/jacky2019/archive/2007/04/04/21243.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微软C/C++ 编译器选项参考</title><link>http://www.cppblog.com/jacky2019/archive/2007/04/04/21216.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Wed, 04 Apr 2007 02:54:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/04/04/21216.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/21216.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/04/04/21216.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/21216.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/21216.html</trackback:ping><description><![CDATA[<p align=center>&nbsp;</p>
<table id=AutoNumber1 style="BORDER-COLLAPSE: collapse" borderColor=#111111 cellSpacing=0 cellPadding=0 width="100%" border=1>
    <tbody>
        <tr>
            <td align=middle width="100%" colSpan=3><strong>微软C/C++ 编译器选项</strong></td>
        </tr>
        <tr>
            <td align=middle width="100%" colSpan=3><font color=#008000><strong>-优化- </strong></font></td>
        </tr>
        <tr>
            <td width="33%">/O1</td>
            <td width="33%">最小化空间</td>
            <td width="34%">minimize space</td>
        </tr>
        <tr>
            <td width="33%">/Op[-]</td>
            <td width="33%">改善浮点数一致性</td>
            <td width="34%">improve floating-pt consistency</td>
        </tr>
        <tr>
            <td width="33%">/O2</td>
            <td width="33%">最大化速度</td>
            <td width="34%">maximize speed</td>
        </tr>
        <tr>
            <td width="33%">/Os </td>
            <td width="33%">优选代码空间 </td>
            <td width="34%">favor code space</td>
        </tr>
        <tr>
            <td width="33%">/Oa</td>
            <td width="33%">假设没有别名</td>
            <td width="34%">assume no aliasing</td>
        </tr>
        <tr>
            <td width="33%">/Ot</td>
            <td width="33%">优选代码速度</td>
            <td width="34%">favor code speed</td>
        </tr>
        <tr>
            <td width="33%">/Ob<n></n></td>
            <td width="33%">内联展开（默认 n=0）</td>
            <td width="34%">inline expansion (default n=0)</td>
        </tr>
        <tr>
            <td width="33%">/Ow </td>
            <td width="33%">假设交叉函数别名 </td>
            <td width="34%">assume cross-function aliasing</td>
        </tr>
        <tr>
            <td width="33%">/Od </td>
            <td width="33%">禁用优化（默认值） </td>
            <td width="34%">disable optimizations (default)</td>
        </tr>
        <tr>
            <td width="33%">/Ox </td>
            <td width="33%">最大化选项。(/Ogityb2 /Gs)</td>
            <td width="34%">maximum opts. (/Ogityb1 /Gs)</td>
        </tr>
        <tr>
            <td width="33%">/Og </td>
            <td width="33%">启用全局优化 </td>
            <td width="34%">enable global optimization </td>
        </tr>
        <tr>
            <td width="33%">/Oy[-] </td>
            <td width="33%">启用框架指针省略 </td>
            <td width="34%">enable frame pointer omission</td>
        </tr>
        <tr>
            <td width="33%">/Oi </td>
            <td width="33%">启用内建函数 </td>
            <td width="34%">enable intrinsic functions</td>
        </tr>
        <tr>
            <td style="COLOR: #008000" align=middle width="100%" colSpan=3><strong>-代码生成- </strong></td>
        </tr>
        <tr>
            <td width="33%">/G3 </td>
            <td width="33%">为 80386 进行优化 </td>
            <td width="34%">optimize for 80386</td>
        </tr>
        <tr>
            <td width="33%">/G4 </td>
            <td width="33%">为 80486 进行优化 </td>
            <td width="34%">optimize for 80486</td>
        </tr>
        <tr>
            <td width="33%">/GR[-] </td>
            <td width="33%">启用 C++ RTTI </td>
            <td width="34%">enable C++ RTTI</td>
        </tr>
        <tr>
            <td width="33%">/G5 </td>
            <td width="33%">为 Pentium 进行优化 </td>
            <td width="34%">optimize for Pentium</td>
        </tr>
        <tr>
            <td width="33%">/G6</td>
            <td width="33%">为 Pentium Pro 进行优化 </td>
            <td width="34%">optimize for Pentium Pro</td>
        </tr>
        <tr>
            <td width="33%">/GX[-] </td>
            <td width="33%">启用 C++ 异常处理（与 /EHsc 相同） </td>
            <td width="34%">enable C++ EH (same as /EHsc)</td>
        </tr>
        <tr>
            <td width="33%">/EHs </td>
            <td width="33%">启用同步 C++ 异常处理 </td>
            <td width="34%">enable synchronous C++ EH</td>
        </tr>
        <tr>
            <td width="33%">/GD</td>
            <td width="33%">为 Windows DLL 进行优化</td>
            <td width="34%">optimize for Windows DLL</td>
        </tr>
        <tr>
            <td width="33%">/GB </td>
            <td width="33%">为混合模型进行优化（默认） </td>
            <td width="34%">optimize for blended model (default)</td>
        </tr>
        <tr>
            <td width="33%">/EHa </td>
            <td width="33%">启用异步 C++ 异常处理 </td>
            <td width="34%">enable asynchronous C++ EH</td>
        </tr>
        <tr>
            <td width="33%">/Gd </td>
            <td width="33%">__cdecl 调用约定 </td>
            <td width="34%">__cdecl calling convention </td>
        </tr>
        <tr>
            <td width="33%">/EHc </td>
            <td width="33%">extern&#8220;C&#8221;默认为 nothrow </td>
            <td width="34%">extern "C" defaults to nothrow</td>
        </tr>
        <tr>
            <td width="33%">/Gr </td>
            <td width="33%">__fastcall 调用约定 </td>
            <td width="34%">__fastcall calling convention</td>
        </tr>
        <tr>
            <td width="33%">/Gi[-]</td>
            <td width="33%">启用增量编译</td>
            <td width="34%">enable incremental compilation</td>
        </tr>
        <tr>
            <td width="33%">/Gz </td>
            <td width="33%">__stdcall 调用约定 </td>
            <td width="34%">__stdcall calling convention </td>
        </tr>
        <tr>
            <td width="33%">/Gm[-] </td>
            <td width="33%">启用最小重新生成 </td>
            <td width="34%">enable minimal rebuild</td>
        </tr>
        <tr>
            <td width="33%">/GA </td>
            <td width="33%">为 Windows 应用程序进行优化</td>
            <td width="34%">optimize for Windows Application</td>
        </tr>
        <tr>
            <td width="33%">/Gf </td>
            <td width="33%">启用字符串池 </td>
            <td width="34%">enable string pooling </td>
        </tr>
        <tr>
            <td width="33%">/QIfdiv[-] </td>
            <td width="33%">启用 Pentium FDIV 修复 </td>
            <td width="34%">enable Pentium FDIV fix </td>
        </tr>
        <tr>
            <td width="33%">/GF </td>
            <td width="33%">启用只读字符串池 </td>
            <td width="34%">enable read-only string pooling </td>
        </tr>
        <tr>
            <td width="33%">/QI0f[-] </td>
            <td width="33%">启用 Pentium 0x0f 修复 </td>
            <td width="34%">enable Pentium 0x0f fix</td>
        </tr>
        <tr>
            <td width="33%">/Gy </td>
            <td width="33%">分隔链接器函数 </td>
            <td width="34%">separate functions for linker</td>
        </tr>
        <tr>
            <td width="33%">/GZ </td>
            <td width="33%">启用运行时调试检查</td>
            <td width="34%">enable runtime debug checks</td>
        </tr>
        <tr>
            <td width="33%">/Gh</td>
            <td width="33%">启用钩子函数调用</td>
            <td width="34%">enable hook function call</td>
        </tr>
        <tr>
            <td width="33%">/Ge </td>
            <td width="33%">对所有函数强制堆栈检查 </td>
            <td width="34%">force stack checking for all funcs</td>
        </tr>
        <tr>
            <td width="33%">/Gs[num] </td>
            <td width="33%">禁用堆栈检查调用 </td>
            <td width="34%">disable stack checking calls</td>
        </tr>
        <tr>
            <td style="COLOR: #008000" align=middle width="100%" colSpan=3><strong>-输出文件- </strong></td>
        </tr>
        <tr>
            <td width="33%">/Fa[file] </td>
            <td width="33%">命名程序集列表文件 </td>
            <td width="34%">name assembly listing file</td>
        </tr>
        <tr>
            <td width="33%">/Fo<file></file> </td>
            <td width="33%">命名对象文件 </td>
            <td width="34%">name object file</td>
        </tr>
        <tr>
            <td width="33%">/FA[sc] </td>
            <td width="33%">配置程序集列表 </td>
            <td width="34%">configure assembly listing </td>
        </tr>
        <tr>
            <td width="33%">/Fp<file></file> </td>
            <td width="33%">命名预编译头文件 </td>
            <td width="34%">name precompiled header file</td>
        </tr>
        <tr>
            <td width="33%">/Fd[file] </td>
            <td width="33%">命名 .PDB 文件 </td>
            <td width="34%">name .PDB file </td>
        </tr>
        <tr>
            <td width="33%">/Fr[file] </td>
            <td width="33%">命名源浏览器文件 </td>
            <td width="34%">name source browser file</td>
        </tr>
        <tr>
            <td width="33%">/Fe<file></file> </td>
            <td width="33%">命名可执行文件 </td>
            <td width="34%">name executable file</td>
        </tr>
        <tr>
            <td width="33%">/FR[file] </td>
            <td width="33%">命名扩展 .SBR 文件 </td>
            <td width="34%">name extended .SBR file</td>
        </tr>
        <tr>
            <td width="33%">/Fm[file] </td>
            <td width="33%">命名映射文件 </td>
            <td width="34%">name map file</td>
        </tr>
        <tr>
            <td style="COLOR: #008000" align=middle width="100%" colSpan=3><strong>-预处理器- </strong></td>
        </tr>
        <tr>
            <td width="33%">/FI<file></file> </td>
            <td width="33%">命名强制包含文件 </td>
            <td width="34%">name forced include file</td>
        </tr>
        <tr>
            <td width="33%">/C </td>
            <td width="33%">不吸取注释 </td>
            <td width="34%">don't strip comments </td>
        </tr>
        <tr>
            <td width="33%">/U<name></name> </td>
            <td width="33%">移除预定义宏 </td>
            <td width="34%">remove predefined macro</td>
        </tr>
        <tr>
            <td width="33%">/D<name></name>{=|#}<text></text> </td>
            <td width="33%">定义宏 </td>
            <td width="34%">define macro</td>
        </tr>
        <tr>
            <td width="33%">/u </td>
            <td width="33%">移除所有预定义宏 </td>
            <td width="34%">remove all predefined macros</td>
        </tr>
        <tr>
            <td width="33%">/E </td>
            <td width="33%">将预处理定向到标准输出</td>
            <td width="34%">preprocess to stdout</td>
        </tr>
        <tr>
            <td width="33%">/I
            <dir></dir></td>
            <td width="33%">添加到包含文件的搜索路径 </td>
            <td width="34%">add to include search path</td>
        </tr>
        <tr>
            <td width="33%">/EP </td>
            <td width="33%">将预处理定向到标准输出，不要带行号 </td>
            <td width="34%">preprocess to stdout, no #line</td>
        </tr>
        <tr>
            <td width="33%">/X </td>
            <td width="33%">忽略&#8220;标准位置&#8221; </td>
            <td width="34%">ignore "standard places"</td>
        </tr>
        <tr>
            <td width="33%">/P </td>
            <td width="33%">预处理到文件 </td>
            <td width="34%">preprocess to file</td>
        </tr>
        <tr>
            <td style="COLOR: #008000" align=middle width="100%" colSpan=3><strong>-语言- </strong></td>
        </tr>
        <tr>
            <td width="33%">/Zi </td>
            <td width="33%">启用调试信息 </td>
            <td width="34%">enable debugging information</td>
        </tr>
        <tr>
            <td width="33%">/Zl </td>
            <td width="33%">忽略 .OBJ 中的默认库名 </td>
            <td width="34%">omit default library name in .OBJ</td>
        </tr>
        <tr>
            <td width="33%">/ZI </td>
            <td width="33%">启用调试信息的&#8220;编辑并继续&#8221;功能</td>
            <td width="34%">enable Edit and Continue debug info</td>
        </tr>
        <tr>
            <td width="33%">/Zg </td>
            <td width="33%">生成函数原型 </td>
            <td width="34%">generate function prototypes</td>
        </tr>
        <tr>
            <td width="33%">/Z7 </td>
            <td width="33%">启用旧式调试信息 </td>
            <td width="34%">enable old-style debug info</td>
        </tr>
        <tr>
            <td width="33%">/Zs </td>
            <td width="33%">只进行语法检查 </td>
            <td width="34%">syntax check only</td>
        </tr>
        <tr>
            <td width="33%">/Zd </td>
            <td width="33%">仅要行号调试信息 </td>
            <td width="34%">line number debugging info only</td>
        </tr>
        <tr>
            <td width="33%">/vd{0|1} </td>
            <td width="33%">禁用/启用 vtordisp </td>
            <td width="34%">disable/enable vtordisp</td>
        </tr>
        <tr>
            <td width="33%">/Zp[n] </td>
            <td width="33%">在 n 字节边界上包装结构 </td>
            <td width="34%">pack structs on n-byte boundary</td>
        </tr>
        <tr>
            <td width="33%">/vm<x></x> </td>
            <td width="33%">指向成员的指针类型 </td>
            <td width="34%">type of pointers to members</td>
        </tr>
        <tr>
            <td width="33%">/Za </td>
            <td width="33%">禁用扩展（暗指 /Op） </td>
            <td width="34%">disable extensions (implies /Op)</td>
        </tr>
        <tr>
            <td width="33%">/noBool </td>
            <td width="33%">禁用&#8220;bool&#8221;关键字 </td>
            <td width="34%">disable "bool" keyword</td>
        </tr>
        <tr>
            <td width="33%">/Ze </td>
            <td width="33%">启用扩展（默认） </td>
            <td width="34%">enable extensions (default)</td>
        </tr>
        <tr>
            <td style="COLOR: #008000" align=middle width="100%" colSpan=3><strong>- 杂项 - </strong></td>
        </tr>
        <tr>
            <td width="33%">/?, /help </td>
            <td width="33%">打印此帮助消息 </td>
            <td width="34%">print this help message</td>
        </tr>
        <tr>
            <td width="33%">/c </td>
            <td width="33%">只编译，不链接 </td>
            <td width="34%">compile only, no link</td>
        </tr>
        <tr>
            <td width="33%">/W<n></n> </td>
            <td width="33%">设置警告等级（默认 n=1） </td>
            <td width="34%">set warning level (default n=1)</td>
        </tr>
        <tr>
            <td width="33%">/H<num></num> </td>
            <td width="33%">最大化外部名称长度 </td>
            <td width="34%">max external name length</td>
        </tr>
        <tr>
            <td width="33%">/J </td>
            <td width="33%">默认 char 类型是 unsigned </td>
            <td width="34%">default char type is unsigned</td>
        </tr>
        <tr>
            <td width="33%">/nologo </td>
            <td width="33%">取消显示版权消息 </td>
            <td width="34%">suppress copyright message</td>
        </tr>
        <tr>
            <td width="33%">/WX </td>
            <td width="33%">将警告视为错误 </td>
            <td width="34%">treat warnings as errors</td>
        </tr>
        <tr>
            <td width="33%">/Tc<source file=""></source> </td>
            <td width="33%">将文件编译为 .c </td>
            <td width="34%">compile file as .c </td>
        </tr>
        <tr>
            <td width="33%">/Yc[file] </td>
            <td width="33%">创建 .PCH 文件 </td>
            <td width="34%">create .PCH file</td>
        </tr>
        <tr>
            <td width="33%">/Tp<source file=""></source> </td>
            <td width="33%">将文件编译为 .cpp </td>
            <td width="34%">compile file as .cpp </td>
        </tr>
        <tr>
            <td width="33%">/Yd </td>
            <td width="33%">将调试信息放在每个 .OBJ 中 </td>
            <td width="34%">put debug info in every .OBJ</td>
        </tr>
        <tr>
            <td width="33%">/TC </td>
            <td width="33%">将所有文件编译为 .c </td>
            <td width="34%">compile all files as .c </td>
        </tr>
        <tr>
            <td width="33%">/TP </td>
            <td width="33%">将所有文件编译为 .cpp </td>
            <td width="34%">compile all files as .cpp </td>
        </tr>
        <tr>
            <td width="33%">/Yu[file] </td>
            <td width="33%">使用 .PCH 文件 </td>
            <td width="34%">use .PCH file</td>
        </tr>
        <tr>
            <td width="33%">/V<string></string> </td>
            <td width="33%">设置版本字符串 </td>
            <td width="34%">set version string</td>
        </tr>
        <tr>
            <td width="33%">/YX[file] </td>
            <td width="33%">自动的 .PCH 文件</td>
            <td width="34%">automatic .PCH</td>
        </tr>
        <tr>
            <td width="33%">/w </td>
            <td width="33%">禁用所有警告 </td>
            <td width="34%">disable all warnings</td>
        </tr>
        <tr>
            <td width="33%">/Zm<n></n> </td>
            <td width="33%">最大内存分配（默认为 %） </td>
            <td width="34%">max memory alloc (% of default)</td>
        </tr>
        <tr>
            <td style="COLOR: #008000" align=middle width="100%" colSpan=3><strong>-链接- </strong></td>
        </tr>
        <tr>
            <td width="33%">/MD </td>
            <td width="33%">与 MSVCRT.LIB 链接 </td>
            <td width="34%">link with MSVCRT.LIB</td>
        </tr>
        <tr>
            <td width="33%">/MDd </td>
            <td width="33%">与 MSVCRTD.LIB 调试库链接 </td>
            <td width="34%">link with MSVCRTD.LIB debug lib</td>
        </tr>
        <tr>
            <td width="33%">/ML </td>
            <td width="33%">与 LIBC.LIB 链接 </td>
            <td width="34%">link with LIBC.LIB</td>
        </tr>
        <tr>
            <td width="33%">/MLd </td>
            <td width="33%">与 LIBCD.LIB 调试库链接 </td>
            <td width="34%">link with LIBCD.LIB debug lib</td>
        </tr>
        <tr>
            <td width="33%">/MT </td>
            <td width="33%">与 LIBCMT.LIB 链接 </td>
            <td width="34%">link with LIBCMT.LIB </td>
        </tr>
        <tr>
            <td width="33%">/MTd </td>
            <td width="33%">与 LIBCMTD.LIB 调试库链接 </td>
            <td width="34%">link with LIBCMTD.LIB debug lib</td>
        </tr>
        <tr>
            <td width="33%">/LD </td>
            <td width="33%">创建 .DLL </td>
            <td width="34%">Create .DLL </td>
        </tr>
        <tr>
            <td width="33%">/F<num></num> </td>
            <td width="33%">设置堆栈大小 </td>
            <td width="34%">set stack size</td>
        </tr>
        <tr>
            <td width="33%">/LDd </td>
            <td width="33%">创建 .DLL 调试库 </td>
            <td width="34%">Create .DLL debug libary</td>
        </tr>
        <tr>
            <td width="33%">/link </td>
            <td width="33%">[链接器选项和库] </td>
            <td width="34%">[linker options and libraries]</td>
        </tr>
    </tbody>
</table>
<br>
<script type=text/javascript>
    <!--
google_ad_client = "pub-6457474891690507";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
google_ad_channel = "";
//-->
  </script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
  </script>
<!-- Search Google -->
<center>
<form action=http://www.google.cn/custom method=get target=_top>
<table bgColor=#ffffff>
<tbody>
<tr>
<td vAlign=top noWrap align=left height=32><a href="http://www.google.com/"><img alt=Google src="http://www.google.com/logos/Logo_25wht.gif" align=middle border=0> </a><label style="DISPLAY: none" for=sbi>输入您的搜索字词</label> <input id=sbi maxLength=255 size=31 name=q> <label style="DISPLAY: none" for=sbb>提交搜索表单</label> <input id=sbb type=submit value=搜索 name=sa> <input type=hidden value=pub-6457474891690507 name=client> <input type=hidden value=1 name=forid> <input type=hidden value=GB2312 name=ie> <input type=hidden value=GB2312 name=oe> <input type=hidden value=GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1 name=cof> <input type=hidden value=zh-CN name=hl> </td></tr></tbody></table></form></center><!-- Search Google --><img src ="http://www.cppblog.com/jacky2019/aggbug/21216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-04-04 10:54 <a href="http://www.cppblog.com/jacky2019/archive/2007/04/04/21216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Visual C++ 编译器选项</title><link>http://www.cppblog.com/jacky2019/archive/2007/04/04/21214.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Wed, 04 Apr 2007 02:50:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/04/04/21214.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/21214.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/04/04/21214.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/21214.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/21214.html</trackback:ping><description><![CDATA[&nbsp;
<table cellSpacing=0 cellPadding=0 width="83%" border=0>
    <tbody>
        <tr>
            <td vAlign=top width="29%">
            <p><strong><span>选项</span></strong><strong></strong></p>
            </td>
            <td vAlign=top width="71%">
            <p><strong><span>目的</span></strong><strong></strong></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vctbsspecifyresponsefile.asp"><span>@</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>指定响应文件</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.help.asp"><span>/?</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>列出编译器选项</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vclrfaispecifymetadatadirectories.asp"><span>/AI</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>指定在解析传递到</span><span> #using </span><span>指令的文件引用时搜索的目录</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vclrfarchminimumcpuarchitecture.asp"><span>/arch</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>使用</span><span> SSE </span><span>或</span><span> SSE2 </span><span>指令生成代码</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.c_uc.asp"><span>/C</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>在预处理期间保留注释</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.c_lc.asp"><span>/c</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>编译但不链接</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcrefeecomcompilation.asp"><span>/clr</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>启用</span><span> C++ </span><span>的托管扩展并产生在公共语言运行库上运行的输出文件</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.d.asp"><span>/D</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>定义常数和宏</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.e.asp"><span>/E</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>将预处理器输出复制到标准输出</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.eh.asp"><span>/EH</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>指定异常处理模型</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.ep.asp"><span>/EP</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>将预处理器输出复制到标准输出</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.f.asp"><span>/F</span></a> </span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>设置堆栈大小</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.fa.asp"><span>/FA</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>创建列表文件</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.fa.asp"><span>/Fa</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>设置列表文件名</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.fd.asp"><span>/Fd</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>重命名程序数据库文件</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.fe.asp"><span>/Fe</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>重命名可执行文件</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.fi.asp"><span>/FI</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>预处理指定的包含文件</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.fm.asp"><span>/Fm</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>创建映射文件</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.fo.asp"><span>/Fo</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>创建对象文件</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.fp.asp"><span>/Fp</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>指定预编译头文件名</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.fr.2c_2f.fr.asp"><span>/FR</span></a> </span><span>字串</span><span>3</span><span> <br><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.fr.2c_2f.fr.asp"><span>/Fr</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>生成浏览器文件</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vclrffunameforcedusingfile.asp"><span>/FU</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>强制使用文件名，就像它已被传递到</span><span> #using </span><span>指令一样</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcrefFxMergeInjectedCode.asp"><span>/Fx</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>将插入的代码与源文件合并</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.g.asp"><span>/G3</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>优化代码以优选</span><span> 386 </span><span>处理器。在</span><span> Visual C++ 5.0 </span><span>中已经停用，编译器将忽略此选项</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.g.asp"><span>/G4</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>优化代码以优选</span><span> 486 </span><span>处理器。在</span><span> Visual C++ 5.0 </span><span>中已经停用，编译器将忽略此选项</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.g.asp"><span>/G5</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>优化代码以优选</span><span> Pentium </span><span>处理器</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.g.asp"><span>/G6</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>优化代码以优选</span><span> Pentium Pro</span><span>、</span><span>Pentium II </span><span>和</span><span> Pentium III </span><span>处理器</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.g.asp"><span>/G7</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>针对</span><span> Pentium 4 </span><span>或</span><span> Athlon </span><span>优化代码。</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.ga.asp"><span>/GA</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>优化</span><span> Windows </span><span>应用程序的代码</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.g.asp"><span>/GB</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>与</span><span> /G6 </span><span>等效；将</span><span> _M_IX86 </span><span>的值设置为</span><span> 600</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gd.2c_2f.gr.2c_2f.gz.asp"><span>/Gd</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>使用</span><span> </span><strong><span>__cdecl</span></strong><span> </span><span>调用约定</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.ge.asp"><span>/Ge</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>激活堆栈探测</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gf.asp"><span>/GF</span></a> </span></p>
            <p><span>字串</span><span>2</span></p>
            <p><span><br><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gf.asp"><span>/Gf</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>启用字符串池</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcrefghenable__pexithookfunction.asp"><span>/GH</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>调用挂钩函数</span><span> </span><strong><span>_pexit</span></strong></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gh.asp"><span>/Gh</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>调用挂钩函数</span><span> </span><strong><span>_penter</span></strong></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcgrfglwholeprogramoptimization.asp"><span>/GL</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>启用全程序优化</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gm_minimal.asp"><span>/Gm</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>启用最小重新生成</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gr_option.asp"><span>/GR</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>启用运行时类型信息</span><span> (RTTI)</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gd.2c_2f.gr.2c_2f.gz.asp"><span>/Gr</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>使用</span><span> </span><strong><span>__fastcall</span></strong><span> </span><span>调用约定</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vclrfgsbuffersecurity.asp"><span>/GS</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>缓冲区安全检查</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gs.asp"><span>/Gs</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>控制堆栈探测</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gt.asp"><span>/GT</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>支持使用静态线程本地存储区分配的数据的纤程安全</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gx.asp"><span>/GX</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>启用同步异常处理</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gy.asp"><span>/Gy</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>启用函数级链接</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcrefgz(catchrelease-builderrorsindebugbuild).asp"><span>/GZ</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>与</span><span> </span><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcrefrtcruntimechecks.asp"><span>/RTC1</span></a> </span><span>相同</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gd.2c_2f.gr.2c_2f.gz.asp"><span>/Gz</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>使用</span><span> </span><strong><span>__stdcall</span></strong><span> </span><span>调用约定</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.h.asp"><span>/H</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>限制外部（公共）名称的长度</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.help.asp"><span>/HELP</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>列出编译器选项</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.i.asp"><span>/I</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>在目录中搜索包含文件</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.j.asp"><span>/J</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>更改默认的</span><span> </span><strong><span>char</span></strong><span> </span><span>类型</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.md.2c_2f.ml.2c_2f.mt.2c_2f.ld.asp"><span>/LD</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>创建动态链接库</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.md.2c_2f.ml.2c_2f.mt.2c_2f.ld.asp"><span>/LDd</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>创建调试动态链接库</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.link.asp"><span>/link</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>将指定的选项传递给</span><span> LINK</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.md.2c_2f.ml.2c_2f.mt.2c_2f.ld.asp"><span>/MD</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>使用</span><span> MSVCRT.lib </span><span>创建多线程</span><span> DLL</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.md.2c_2f.ml.2c_2f.mt.2c_2f.ld.asp"><span>/MDd</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>使用</span><span> MSVCRTD.lib </span><span>创建调试多线程</span><span> DLL</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.md.2c_2f.ml.2c_2f.mt.2c_2f.ld.asp"><span>/ML</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>使用</span><span> LIBC.lib </span><span>创建单线程可执行文件</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.md.2c_2f.ml.2c_2f.mt.2c_2f.ld.asp"><span>/MLd</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>使用</span><span> LIBCD.lib </span><span>创建调试单线程可执行文件</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.md.2c_2f.ml.2c_2f.mt.2c_2f.ld.asp"><span>/MT</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>使用</span><span> LIBCMT.lib </span><span>创建多线程可执行文件</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.md.2c_2f.ml.2c_2f.mt.2c_2f.ld.asp"><span>/MTd</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>使用</span><span> LIBCMTD.lib </span><span>创建调试多线程可执行文件</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vclrfnologosuppressdisplayofbanner.asp"><span>/nologo</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>取消显示登录版权标志</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.o1.2c_2f.o2.asp"><span>/O1</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>创建小代码</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.o1.2c_2f.o2.asp"><span>/O2</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>创建快速代码</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.oa.2c_2f.ow.asp"><span>/Oa</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>假设没有别名</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.ob.asp"><span>/Ob</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>控制内联展开</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.od.asp"><span>/Od</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>禁用优化</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.og.asp"><span>/Og</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>使用全局优化</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.oi.asp"><span>/Oi</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>生成内部函数</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.op.asp"><span>/Op</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>改善浮点数一致性</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.os.asp"><span>/Os</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>代码大小优先</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.os.asp"><span>/Ot</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>代码速度优先</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.oa.2c_2f.ow.asp"><span>/Ow</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>假定在函数调用中使用别名</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.ox.asp"><span>/Ox</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>使用最大优化</span><span> (/Ob2gity /Gs)</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.oy.asp"><span>/Oy</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>省略框架指针</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.qi0f.asp"><span>/QI0f</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>执行</span><span> Pentium 0x0f </span><span>错误修复</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.qifdiv.asp"><span>/QIfdiv</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>执行</span><span> Pentium FDIV </span><span>错误修复</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcrefqifistsuppress_ftol.asp"><span>/QIfist</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>当需要从浮点类型转换为整型时取消</span><span> </span><strong><span>_ftol</span></strong></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.p.asp"><span>/P</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>将预处理器输出写入文件</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcrefrtcruntimechecks.asp"><span>/RTC</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>启用运行时错误检查</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcrefshowincludes.asp"><span>/showIncludes</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>在编译期间显示包含文件的列表</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.tc.2c_2f.tp.asp"><span>/Tc</span></a> </span><span>字串</span><span>5</span><span> <br><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.tc.2c_2f.tp.asp"><span>/TC</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>指定</span><span> C </span><span>源文件</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.tc.2c_2f.tp.asp"><span>/Tp</span></a><br><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.tc.2c_2f.tp.asp"><span>/TP</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>指定</span><span> C++ </span><span>源文件</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.u.2c_2f.u.asp"><span>/U</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>移除预定义宏</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.u.2c_2f.u.asp"><span>/u</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>移除所有的预定义宏</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.v.asp"><span>/V</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>设置版本字符串</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.vd.asp"><span>/vd</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>取消或启用隐藏的</span><span> vtordisp </span><span>类成员</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.vmb.2c_2f.vmg.asp"><span>/vmb</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>对指向成员的指针使用最佳的基</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.vmb.2c_2f.vmg.asp"><span>/vmg</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>对指向成员的指针使用完全一般性</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.vmm.2c_2f.vms.2c_2f.vmv.asp"><span>/vmm</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>声明多重继承</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.vmm.2c_2f.vms.2c_2f.vmv.asp"><span>/vms</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>声明单一继承</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.vmm.2c_2f.vms.2c_2f.vmv.asp"><span>/vmv</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>声明虚拟继承</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.w.2c_2f.w.asp"><span>/W</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>设置警告等级</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.w.2c_2f.w.asp"><span>/w</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>禁用所有警告</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.w.2c_2f.w.asp"><span>/Wall</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>启用所有警告，包括默认情况下禁用的警告</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcrefwlenableonelinediagnostics.asp"><span>/WL</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>在从命令行编译</span><span> C++ </span><span>源代码时启用错误信息和警告消息的单行诊断</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vchowwp64detect64bitportabilityproblems.asp"><span>/Wp64</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>检测</span><span> 64 </span><span>位可移植性问题</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.x.asp"><span>/X</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>忽略标准包含目录</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vclrfyignoreprecompiledheaderoptions.asp"><span>/Y-</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>忽略当前生成中的所有其他预编译头编译器选项</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.yc.asp"><span>/Yc</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>创建预编译头文件</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.yd.asp"><span>/Yd</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>将完整的调试信息放在所有对象文件中</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcrefylinjectpchreferencefordebuglib.asp"><span>/Yl</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>创建调试库时插入</span><span> PCH </span><span>引用</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.yu.asp"><span>/Yu</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>在生成期间使用预编译头文件</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.yx.asp"><span>/YX</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>自动处理预编译头</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.z7.2c_2f.zd.2c_2f.zi.asp"><span>/Z7</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>生成与</span><span> C 7.0 </span><span>兼容的调试信息</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.za.2c_2f.ze.asp"><span>/Za</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>禁用语言扩展</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcrefzcconformance.asp"><span>/Zc</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>在</span><span> </span><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.za.2c_2f.ze.asp"><span>/Ze</span></a> </span><span>下指定标准行为</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.z7.2c_2f.zd.2c_2f.zi.asp"><span>/Zd</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>生成行号</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.za.2c_2f.ze.asp"><span>/Ze</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>启用语言扩展</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.zg.asp"><span>/Zg</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>生成函数原型</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.z7.2c_2f.zd.2c_2f.zi.asp"><span>/ZI</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>将调试信息包含在与</span><span>&#8220;</span><span>编辑并继续</span><span>&#8221;</span><span>兼容的程序数据库中</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.z7.2c_2f.zd.2c_2f.zi.asp"><span>/Zi</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>生成完整的调试信息</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.zl.asp"><span>/Zl</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>从</span><span> .obj </span><span>文件中移除默认库名</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.zm.asp"><span>/Zm</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>指定预编译头内存分配限制</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.zp.asp"><span>/Zp</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>封装结构成员</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width="29%">
            <p><span><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.zs.asp"><span>/Zs</span></a></span></p>
            </td>
            <td vAlign=top width="71%">
            <p><span>只检查语法</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>


<script type=text/javascript>
    <!--
google_ad_client = "pub-6457474891690507";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
google_ad_channel = "";
//-->
  </script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
  </script>
<!-- Search Google -->
<center>
<form action=http://www.google.cn/custom method=get target=_top>
<table bgColor=#ffffff>
<tbody>
<tr>
<td vAlign=top noWrap align=left height=32><a href="http://www.google.com/"><img alt=Google src="http://www.google.com/logos/Logo_25wht.gif" align=middle border=0> </a><label style="DISPLAY: none" for=sbi>输入您的搜索字词</label> <input id=sbi maxLength=255 size=31 name=q> <label style="DISPLAY: none" for=sbb>提交搜索表单</label> <input id=sbb type=submit value=搜索 name=sa> <input type=hidden value=pub-6457474891690507 name=client> <input type=hidden value=1 name=forid> <input type=hidden value=GB2312 name=ie> <input type=hidden value=GB2312 name=oe> <input type=hidden value=GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1 name=cof> <input type=hidden value=zh-CN name=hl> </td></tr></tbody></table></form></center><!-- Search Google --><img src ="http://www.cppblog.com/jacky2019/aggbug/21214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-04-04 10:50 <a href="http://www.cppblog.com/jacky2019/archive/2007/04/04/21214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多线程同步机制摘要</title><link>http://www.cppblog.com/jacky2019/archive/2007/04/03/21190.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Tue, 03 Apr 2007 11:34:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/04/03/21190.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/21190.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/04/03/21190.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/21190.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/21190.html</trackback:ping><description><![CDATA[&nbsp;<strong><span>Critical Section</span></strong>
<p>Critical section<span>（临界区）用来实现&#8220;排他性占有&#8221;。适用范围是单一进程的各线程之间。它是：</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>一个局部性对象，不是一个核心对象。</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>快速而有效率。</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>不能够同时有一个以上的</span>critical section<span>被等待。</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>无法侦测是否已被某个线程放弃。</span></p>
<p><strong><span>Mutex</span></strong></p>
<p>Mutex<span>是一个核心对象，可以在不同的线程之间实现&#8220;排他性占有&#8221;，甚至几十那些现成分属不同进程。它是：</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>一个核心对象。</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>如果拥有</span>mutex<span>的那个线程结束，则会产生一个&#8220;</span>abandoned<span>&#8221;错误信息。</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>可以使用</span>Wait&#8230;()<span>等待一个</span>mutex<span>。</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>可以具名，因此可以被其他进程开启。</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>只能被拥有它的那个线程释放（</span>released<span>）。</span></p>
<p><strong><span>Semaphore</span></strong></p>
<p>Semaphore<span>被用来追踪有限的资源。它是：</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>一个核心对象。</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>没有拥有者。</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>可以具名，因此可以被其他进程开启。</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>可以被任何一个线程释放（</span>released<span>）。</span></p>
<p><strong><span>Event Object</span></strong></p>
<p>Event object<span>通常使用于</span>overlapped I/O<span>，或用来设计某些自定义的同步对象。它是：</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>一个核心对象。</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>完全在程序掌控之下。</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>适用于设计新的同步对象。</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>&#8220;要求苏醒&#8221;的请求并不会被储存起来，可能会遗失掉。</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>可以具名，因此可以被其他进程开启。</span></p>
<p><strong><span>Interlocked Variable</span></strong></p>
<p><span>如果</span>Interlocked&#8230;()<span>函数被使用于所谓的</span>spin-lock<span>，那么他们只是一种同步机制。所谓</span>spin-lock<span>是一种</span>busy loop<span>，被预期在极短时间内执行，所以有最小的额外负担（</span>overhead<span>）。系统核心偶尔会使用他们。除此之外，</span>interlocked variables<span>主要用于引用技术。他们：</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>允许对</span>4<span>字节的数值有些基本的同步操作，不需动用到</span>critical section<span>或</span>mutex<span>之类。</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>在</span>SMP<span>（</span>Symmetric Multi-Processors<span>）操作系统中亦可有效运作。</span></p>
<script type=text/javascript>
    <!--
google_ad_client = "pub-6457474891690507";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
google_ad_channel = "";
//-->
  </script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
  </script>
<!-- Search Google -->
<center>
<form action=http://www.google.cn/custom method=get target=_top>
<table bgColor=#ffffff>
<tbody>
<tr>
<td vAlign=top noWrap align=left height=32><a href="http://www.google.com/"><img alt=Google src="http://www.google.com/logos/Logo_25wht.gif" align=middle border=0> </a><label style="DISPLAY: none" for=sbi>输入您的搜索字词</label> <input id=sbi maxLength=255 size=31 name=q> <label style="DISPLAY: none" for=sbb>提交搜索表单</label> <input id=sbb type=submit value=搜索 name=sa> <input type=hidden value=pub-6457474891690507 name=client> <input type=hidden value=1 name=forid> <input type=hidden value=GB2312 name=ie> <input type=hidden value=GB2312 name=oe> <input type=hidden value=GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1 name=cof> <input type=hidden value=zh-CN name=hl> </td></tr></tbody></table></form></center><!-- Search Google --><img src ="http://www.cppblog.com/jacky2019/aggbug/21190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-04-03 19:34 <a href="http://www.cppblog.com/jacky2019/archive/2007/04/03/21190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Win32 Thread API学习之Event Objects</title><link>http://www.cppblog.com/jacky2019/archive/2007/04/03/21170.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Tue, 03 Apr 2007 06:44:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/04/03/21170.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/21170.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/04/03/21170.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/21170.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/21170.html</trackback:ping><description><![CDATA[&nbsp;Win32<span>中最具有弹性的同步机制就属</span>events<span>对象了。</span>Event<span>对象是一种核心对象，它的唯一目的就是成为激发状态或未激发状态。这两种状态完全由程序来控制，不会成为</span>Wait&#8230;()<span>函数的副作用。</span>
<p>Event<span>对象之所以有大用途，正是因为它的状态完全在你掌握之下。</span>Mutexes<span>和</span>Semaphores<span>就不一样了，他们的状态会因为诸如</span>WaitForSingleObject()<span>之类的函数调用而变化。所以，你可以精确告诉一个</span>event<span>对象做什么事情，以及什么时候去做。</span></p>
<p>Event<span>对象被运用在多种类型的高级</span>I/O<span>操作中。</span>Event<span>对象也可以用来设计你自己的同步对象。</span></p>
<p><span>产生一个</span>event<span>对象，可以调用</span>CreateEvent():</p>
<p><strong>CreateEvent</strong></p>
<p>The CreateEvent function creates a named or unnamed event object. </p>
<p><strong>HANDLE CreateEvent(</strong></p>
<p><strong><span>&nbsp;&nbsp;&nbsp; </span>LPSECURITY_ATTRIBUTES lpEventAttributes,<span> </span>// pointer to security attributes&nbsp;</strong></p>
<p><strong><span>&nbsp;&nbsp;&nbsp; </span>BOOL bManualReset,<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// flag for manual-reset event </strong></p>
<p><strong><span>&nbsp;&nbsp;&nbsp; </span>BOOL bInitialState,<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>// flag for initial state </strong></p>
<p><strong><span>&nbsp;&nbsp;&nbsp; </span>LPCTSTR lpName <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// pointer to event-object name&nbsp;</strong></p>
<p><strong><span>&nbsp;&nbsp; </span>);</strong></p>
<p><strong>For Example:</strong></p>
<p>hEvent = CreateEvent(NULL,TRUE,FALSE," Event");</p>
<p><span>其中</span>bManualReset<span>需要特别说明一下：</span></p>
<p><span>如为</span>FALSE<span>，表示这个</span>event<span>将在变成激发状态（因而唤醒一个线程）之后，自动重置（</span>reset<span>）为非激发状态。如果是</span>TRUE<span>，表示不会自动重置，必须靠程序操作（调用</span>ResetEvent()<span>）才能将激发状态的</span>event<span>重置为非激发状态。</span></p>
<p><strong>Return Values</strong></p>
<p>&nbsp;</p>
<p>If the function succeeds, the return value is a handle to the event object. If the named event object existed before the function call, the GetLastError function returns ERROR_ALREADY_EXISTS. Otherwise, GetLastError returns zero. </p>
<p>If the function fails, the return value is NULL.</p>
<p><span>与</span>Event<span>相关的几个</span>API<span>函数：</span></p>
<p><strong>SetEvent</strong>()<span>，把</span>event<span>对象设为激发状态</span></p>
<p><strong>ResetEvent</strong>()<span>，把</span>event<span>对象设为非激发状态，</span>Reset<span>的意思是&#8220;设定为非激发状态&#8221;，而不是&#8220;重新设定为激发状态&#8221;</span></p>
<p><strong>PulseEvent</strong>()<span>，如果是一个</span>Manual Reset Event<span>：把</span>event<span>对象设为激发状态，唤醒<strong>&#8220;所有&#8221;</strong>等待中的线程，然后</span>event<span>恢复为非激发状态。如果是一个</span>Auto Reset Event<span>：把</span>event<span>对象设为激发状态，唤醒<strong>&#8220;一个&#8221;</strong>等待中的线程，然后</span>event<span>恢复为非激发状态</span></p>
<p><span>如果是</span>automatic<span>，那</span>event<span>总是处于非激发状态，所以按下</span>ResetEvent<span>不会产生什么效果。但按下</span>SetEvent<span>和</span>PulseEvent<span>会唤醒一个等待中的线程。</span></p>
<p><span>如果是</span>manual<span>，</span>event<span>对象可能是激发的，也可能是非激发，视上一次调用的是</span>SetEvent()<span>或</span>ResetEvent()<span>而定。按下</span>SetEvent<span>会使得每一个等待中的线程立刻苏醒。按下</span>PulseEvent<span>会使的目前等待中的所有线程苏醒过来（随后立刻又进入等待状态）。</span></p>
<p>&nbsp;</p>
<p><span>侯杰大叔翻译的书也搞死我了！</span>Sigh<span>。感觉概念很模糊，看得我一头雾水，来来回回看了好几遍了，还不知道自己是不是已经懂了。</span>5555555<span>。可能是多线程搞得太少的原因吧。加油了。继续看。恩。</span></p>

<script type=text/javascript>
    <!--
google_ad_client = "pub-6457474891690507";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
google_ad_channel = "";
//-->
  </script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
  </script>
<!-- Search Google -->
<center>
<form action=http://www.google.cn/custom method=get target=_top>
<table bgColor=#ffffff>
<tbody>
<tr>
<td vAlign=top noWrap align=left height=32><a href="http://www.google.com/"><img alt=Google src="http://www.google.com/logos/Logo_25wht.gif" align=middle border=0> </a><label style="DISPLAY: none" for=sbi>输入您的搜索字词</label> <input id=sbi maxLength=255 size=31 name=q> <label style="DISPLAY: none" for=sbb>提交搜索表单</label> <input id=sbb type=submit value=搜索 name=sa> <input type=hidden value=pub-6457474891690507 name=client> <input type=hidden value=1 name=forid> <input type=hidden value=GB2312 name=ie> <input type=hidden value=GB2312 name=oe> <input type=hidden value=GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1 name=cof> <input type=hidden value=zh-CN name=hl> </td></tr></tbody></table></form></center><!-- Search Google --><img src ="http://www.cppblog.com/jacky2019/aggbug/21170.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-04-03 14:44 <a href="http://www.cppblog.com/jacky2019/archive/2007/04/03/21170.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Word2007的一个bug</title><link>http://www.cppblog.com/jacky2019/archive/2007/03/30/20942.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Fri, 30 Mar 2007 07:18:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/03/30/20942.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/20942.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/03/30/20942.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/20942.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/20942.html</trackback:ping><description><![CDATA[如果您有兴趣看了偶的上一片文章《<a href="http://blog.csdn.net/kisserLeon/archive/2007/03/30/1546676.aspx" target="_blank">Win32 Thread API学习之Critical Sections </a>》的话，您会发现，里面居然有乱码！而本人又是声称精通Unicode的，是不是太土了阿？<br />不过偶是故意留在那里的，免得忘了。恩<br />后来我又试了一次，先把vc中的代码（包括中文注释），其实就是那片文章中的那些代码了。先拷贝到notepad中，OK！Notepad能够正确识别那些中文！看来不是vc的问题了，难道是word的问题？<br />遂，直接在vc中输入中文，然后copy过来，还是乱码！这下子可以确认是word2007的一个bug了。hoho<br /><br /><script type="text/javascript"><!--
google_ad_client = "pub-6457474891690507";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
google_ad_channel = "";
//--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script><!-- Search Google --><center><form action="http://www.google.cn/custom" method="get" target="_top"><table bgcolor="#ffffff"><tbody><tr><td valign="top" nowrap="" align="left" height="32"><a href="http://www.google.com/"><img alt="Google" src="http://www.google.com/logos/Logo_25wht.gif" align="middle" border="0" /></a><label style="DISPLAY: none" for="sbi">输入您的搜索字词</label><input id="sbi" maxlength="255" size="31" name="q" /><label style="DISPLAY: none" for="sbb">提交搜索表单</label><input id="sbb" type="submit" value="搜索" name="sa" /><input type="hidden" value="pub-6457474891690507" name="client" /><input type="hidden" value="1" name="forid" /><input type="hidden" value="GB2312" name="ie" /><input type="hidden" value="GB2312" name="oe" /><input type="hidden" value="GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1" name="cof" /><input type="hidden" value="zh-CN" name="hl" /></td></tr></tbody></table></form></center><!-- Search Google --><img src ="http://www.cppblog.com/jacky2019/aggbug/20942.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-03-30 15:18 <a href="http://www.cppblog.com/jacky2019/archive/2007/03/30/20942.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Win32 Thread API学习之Critical Sections</title><link>http://www.cppblog.com/jacky2019/archive/2007/03/30/20938.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Fri, 30 Mar 2007 06:58:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/03/30/20938.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/20938.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/03/30/20938.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/20938.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/20938.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">Critical Sections</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">并不是核心对象。因此没有</span>
				<font face="Calibri">handle</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">这样的东西。它和核心对象不同，它存在于进程的内存空间中。你不需要使用想“</span>
				<font face="Calibri">Create</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">”这样的</span>
				<font face="Calibri">API</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">函数获得一个</span>
				<font face="Calibri">critical section handle</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">。你应该做的是将一个类型为</span>
				<font face="Calibri">CRITICAL_SECTION</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">的局部变量初始化，方法是调用</span>
				<font face="Calibri">InitializeCriticalSection():</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">The InitializeCriticalSection function initializes a critical section object. </font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">VOID <strong>InitializeCriticalSection</strong>(</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">
						<span style="mso-spacerun: yes">    </span>LPCRITICAL_SECTION lpCriticalSection <span style="mso-tab-count: 1">               </span>// address of critical section object<span style="mso-spacerun: yes">  </span></font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">
						<span style="mso-spacerun: yes">   </span>);<span style="mso-tab-count: 1">          </span></font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">
						<span style="mso-spacerun: yes"> </span>Parameters</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">lpCriticalSection</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">Points to the critical section object. </font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">Return Values</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">This function does not return a value.</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">
						<br />当你用毕</span>
				<font face="Calibri">critical section</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">时，你必须调用</span>
				<font face="Calibri">DeleteCriticalSection()</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">清除它。这个函数并没有“释放对象”的意义在里头，不要把它和</span>
				<font face="Calibri">C++</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">的</span>
				<font face="Calibri">delete</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">运算符混淆了。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">The DeleteCriticalSection function releases all resources used by an unowned critical section object. </font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">VOID <strong>DeleteCriticalSection</strong>(</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">
						<span style="mso-spacerun: yes">    </span>LPCRITICAL_SECTION lpCriticalSection <span style="mso-tab-count: 1">               </span>// pointer to critical section object<span style="mso-spacerun: yes">  </span></font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">
						<span style="mso-spacerun: yes">   </span>);<span style="mso-tab-count: 1">          </span></font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">Parameters</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">lpCriticalSection</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">Points to the critical section object. </font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">Return Values</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">This function does not return a value.</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">
						<br />一旦</span>
				<font face="Calibri">critical section</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">被初始化，每一个线程就可以进入其中——只要他通过了</span>
				<font face="Calibri">EnterCriticalSection()</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">这一关：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">The EnterCriticalSection function waits for ownership of the specified critical section object. The function returns when the calling thread is granted ownership. </font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">VOID <strong>EnterCriticalSection</strong>(</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">
						<span style="mso-spacerun: yes">    </span>LPCRITICAL_SECTION lpCriticalSection <span style="mso-tab-count: 1">               </span>// pointer to critical section object<span style="mso-spacerun: yes">  </span></font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">
						<span style="mso-spacerun: yes">   </span>);<span style="mso-tab-count: 1">          </span></font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">Parameters</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">lpCriticalSection</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">Points to the critical section object. </font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">Return Values</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">This function does not return a value.</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">
						<br />当线程准备好离开</span>
				<font face="Calibri">critical section</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">的时候，他必须调用</span>
				<font face="Calibri">LeaveCriticalSection():</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">The LeaveCriticalSection function releases ownership of the specified critical section object. </font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">VOID <strong>LeaveCriticalSection</strong>(</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">
						<span style="mso-spacerun: yes">    </span>LPCRITICAL_SECTION lpCriticalSection <span style="mso-tab-count: 1">               </span>// address of critical section object<span style="mso-spacerun: yes">  </span></font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">
						<span style="mso-spacerun: yes">   </span>);<span style="mso-tab-count: 1">          </span></font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">Parameters</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">lpCriticalSection</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">Points to the critical section object. </font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">Return Values</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">This function does not return a value.</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">
						<br />下面是一个很简单的使用例子，只是为了演示如何使用，没有其它目的：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: Consolas">#include</span>
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">&lt;stdio.h&gt;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: Consolas">#include</span>
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">&lt;windows.h&gt;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: Consolas">const</span>
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="COLOR: blue">int</span> numThreads = 3;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; COLOR: green; FONT-FAMILY: Consolas">//¶¨ÒåÒ»¸öcritical section±äÁ¿<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">CRITICAL_SECTION gCS;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">DWORD WINAPI helloFunc(LPVOID pArg) <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="mso-tab-count: 1">       </span>
						<span style="COLOR: green">//½øÈëcritical section<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="mso-tab-count: 1">       </span>EnterCriticalSection(&amp;gCS);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="mso-tab-count: 1">       </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="mso-tab-count: 1">       </span>
						<span style="COLOR: blue">int</span> num = (<span style="COLOR: blue">int</span>) pArg;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="mso-tab-count: 1">       </span>printf("Hello Thread %d\n", num); <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="mso-tab-count: 1">       </span>
						<span style="COLOR: green">//Ïß³ÌÓÃ±Ï£¬¼ÇµÃµ÷ÓÃ´Ëº¯ÊıÀë¿ªcritical section¡££¨Enter**ÓëLeave**µÄÊıÁ¿ÒªÅä¶Ô£©<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="mso-tab-count: 1">       </span>LeaveCriticalSection(&amp;gCS);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="mso-tab-count: 1">       </span>
						<span style="COLOR: blue">return</span> 0; <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: Consolas">int</span>
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">main() <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">{<span style="mso-tab-count: 1">      </span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="mso-tab-count: 1">       </span>
						<span style="COLOR: green">//³õÊ¼»¯critical section<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="mso-tab-count: 1">       </span>InitializeCriticalSection(&amp;gCS);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="mso-tab-count: 1">       </span>HANDLE hThread[numThreads];<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="mso-tab-count: 1">       </span>DWORD begin = GetTickCount();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="mso-tab-count: 1">       </span>
						<span style="COLOR: blue">for</span> (<span style="COLOR: blue">int</span> i = 0; i &lt; numThreads; i++)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="mso-tab-count: 1">       </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="mso-tab-count: 2">              </span>hThread[i] = CreateThread(NULL, 0, helloFunc, (LPVOID)i, 0, NULL);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="mso-tab-count: 1">       </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="mso-tab-count: 1">       </span>WaitForMultipleObjects(numThreads, hThread, TRUE, INFINITE);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="mso-tab-count: 1">       </span>DWORD elapse = GetTickCount() - begin;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="mso-tab-count: 1">       </span>printf("elapse time: %d\n", elapse);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="mso-tab-count: 1">       </span>
						<span style="COLOR: green">//ËùÓĞÏß³ÌÖ´ĞĞÍê±Ïºó£¬deleteµôcritical section<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="mso-tab-count: 1">       </span>DeleteCriticalSection(&amp;gCS);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<span style="mso-tab-count: 1">       </span>
						<span style="COLOR: blue">return</span> 0; <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none">
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: Consolas">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<o:p>
						<font face="Calibri"> </font>
				</o:p>
		</p>
		<script type="text/javascript">
				<!--
google_ad_client = "pub-6457474891690507";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
google_ad_channel = "";
//-->
		</script>
		<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
		</script>
		<!-- Search Google -->
		<center>
				<form action="http://www.google.cn/custom" method="get" target="_top">
						<table bgcolor="#ffffff">
								<tbody>
										<tr>
												<td valign="top" nowrap="" align="left" height="32">
														<a href="http://www.google.com/">
																<img alt="Google" src="http://www.google.com/logos/Logo_25wht.gif" align="middle" border="0" />
														</a>
														<label style="DISPLAY: none" for="sbi">输入您的搜索字词</label>
														<input id="sbi" maxlength="255" size="31" name="q" />
														<label style="DISPLAY: none" for="sbb">提交搜索表单</label>
														<input id="sbb" type="submit" value="搜索" name="sa" />
														<input type="hidden" value="pub-6457474891690507" name="client" />
														<input type="hidden" value="1" name="forid" />
														<input type="hidden" value="GB2312" name="ie" />
														<input type="hidden" value="GB2312" name="oe" />
														<input type="hidden" value="GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1" name="cof" />
														<input type="hidden" value="zh-CN" name="hl" />
												</td>
										</tr>
								</tbody>
						</table>
				</form>
		</center>
		<!-- Search Google -->
<img src ="http://www.cppblog.com/jacky2019/aggbug/20938.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-03-30 14:58 <a href="http://www.cppblog.com/jacky2019/archive/2007/03/30/20938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>核心对象激发状态的意义</title><link>http://www.cppblog.com/jacky2019/archive/2007/03/29/20880.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Thu, 29 Mar 2007 07:59:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/03/29/20880.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/20880.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/03/29/20880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/20880.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/20880.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">“激发”</span>
				<font face="Calibri">signaled</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">对于不同的核心对象有不同的意义</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">Thread</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">线程，当线程结束时，线程对象即被激发。当线程还在进行时，则对象处于未激发状态。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">Process</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">进程，当进程结束时，进程对象即被激发。当进程还在进行时，则对象处于未激发状态。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">Change Notification</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">，当一个特定的磁盘子目录中发生一件特别的变化时，此对象即被激发。此对象系由</span>
				<font face="Calibri">FindFirstChangeNotification()</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">产生</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">Console Input</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">，当</span>
				<font face="Calibri">console</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">窗口的输入缓冲区中有数据可用时，此对象将处于激发状态。</span>
				<font face="Calibri">CreateFile</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">（）和</span>
				<font face="Calibri">GetStdFile</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">（）两函数可以获得</span>
				<font face="Calibri">console handle</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">Event</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">，</span>
				<font face="Calibri">Event</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">对象的状态直接受控于应用程序所使用的三个</span>
				<font face="Calibri">Win32</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">函数：</span>
				<font face="Calibri">SetEvent</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">（），</span>
				<font face="Calibri">PulseEvent</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">（），</span>
				<font face="Calibri">ResetEvent</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">（）。</span>
				<font face="Calibri">CreateEvent</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">（）和</span>
				<font face="Calibri">OpenEvent</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">（）都可以传回一个</span>
				<font face="Calibri">event object handle</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">。</span>
				<font face="Calibri">Event</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">对象的状态也可以被操作系统设定——如果使用于“</span>
				<font face="Calibri">overlapped</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">”操作时。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">Mutex</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">，如果</span>
				<font face="Calibri">mutex</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">没有被任何线程拥有，他就是处于激发状态。一旦一个等待</span>
				<font face="Calibri">mutex</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">的函数返回了，</span>
				<font face="Calibri">mutex</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">也就自动重置为未激发状态。</span>
				<font face="Calibri">CreateMutex</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">（）和</span>
				<font face="Calibri">OpenMutex</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">（）都可以获得一个</span>
				<font face="Calibri">Mutext</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">的</span>
				<font face="Calibri">handle</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">Semaphore</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">，</span>
				<font face="Calibri">Semaphore</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">有点像</span>
				<font face="Calibri">mutex</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">，但他有个计数器，可以约束其拥有者（线程）的个数。当计数器内容大于</span>
				<font face="Calibri">0</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">时，</span>
				<font face="Calibri">semaphore</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">处于激发状态，当计数器内容等于</span>
				<font face="Calibri">0</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">时，</span>
				<font face="Calibri">semaphore</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">处于未激发状态。</span>
				<font face="Calibri">CreateSemaphore</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">（）和</span>
				<font face="Calibri">OpenSemaphore</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">（）可以传回一个</span>
				<font face="Calibri">semaphore handle</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">。<br /><br /></span>
		</p>
		<script type="text/javascript">
				<!--
google_ad_client = "pub-6457474891690507";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
google_ad_channel = "";
//-->
		</script>
		<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
		</script>
		<!-- Search Google -->
		<center>
				<form action="http://www.google.cn/custom" method="get" target="_top">
						<table bgcolor="#ffffff">
								<tbody>
										<tr>
												<td valign="top" nowrap="" align="left" height="32">
														<a href="http://www.google.com/">
																<img alt="Google" src="http://www.google.com/logos/Logo_25wht.gif" align="middle" border="0" />
														</a>
														<label style="DISPLAY: none" for="sbi">输入您的搜索字词</label>
														<input id="sbi" maxlength="255" size="31" name="q" />
														<label style="DISPLAY: none" for="sbb">提交搜索表单</label>
														<input id="sbb" type="submit" value="搜索" name="sa" />
														<input type="hidden" value="pub-6457474891690507" name="client" />
														<input type="hidden" value="1" name="forid" />
														<input type="hidden" value="GB2312" name="ie" />
														<input type="hidden" value="GB2312" name="oe" />
														<input type="hidden" value="GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1" name="cof" />
														<input type="hidden" value="zh-CN" name="hl" />
												</td>
										</tr>
								</tbody>
						</table>
				</form>
		</center>
		<!-- Search Google -->
<img src ="http://www.cppblog.com/jacky2019/aggbug/20880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-03-29 15:59 <a href="http://www.cppblog.com/jacky2019/archive/2007/03/29/20880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>核心对象Kernel Objects</title><link>http://www.cppblog.com/jacky2019/archive/2007/03/27/20735.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Tue, 27 Mar 2007 13:59:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/03/27/20735.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/20735.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/03/27/20735.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/20735.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/20735.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">核心对象其实和所谓的</span>
				<font face="Calibri">GDI</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">对象，如画笔、画刷或</span>
				<font face="Calibri">DC</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">是差不多的，只不过它由</span>
				<font face="Calibri">KERNEL32.DLL</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">管理，而非</span>
				<font face="Calibri">GDI32.DLL</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">管理。两种对象之间有许多相似。两者之间一个最大的不同是，</span>
				<font face="Calibri">GDI</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">对象有单一拥有者，不是进程就是线程；而核心对象可以有一个以上的拥有者，甚至可以跨进程。为了保持对每一位主人（拥有者）的追踪，核心对象保持了一个引用计数（</span>
				<font face="Calibri">reference count</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">），以记录有多少</span>
				<font face="Calibri">handles</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">对应到此对象。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">Win32</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">核心对象清单：</span>
		</p>
		<p class="MsoListParagraphCxSpFirst" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1">
				<span style="FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol">
						<span style="mso-list: Ignore">·<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">进程</span>
				<font face="Calibri">processes</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1">
				<span style="FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol">
						<span style="mso-list: Ignore">·<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">线程</span>
				<font face="Calibri">threads</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1">
				<span style="FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol">
						<span style="mso-list: Ignore">·<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">文件</span>
				<font face="Calibri">files</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1">
				<span style="FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol">
						<span style="mso-list: Ignore">·<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">事件</span>
				<font face="Calibri">events</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1">
				<span style="FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol">
						<span style="mso-list: Ignore">·<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">信号量</span>
				<font face="Calibri">semaphores</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1">
				<span style="FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol">
						<span style="mso-list: Ignore">·<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">互斥器</span>
				<font face="Calibri">mutexes</font>
		</p>
		<p class="MsoListParagraphCxSpLast" style="MARGIN: 0in 0in 10pt 0.5in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1">
				<span style="FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol">
						<span style="mso-list: Ignore">·<span style="FONT: 7pt 'Times New Roman'">         </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">管道</span>
				<font face="Calibri">pipes</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">，分为</span>
				<font face="Calibri">named</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">和</span>
				<font face="Calibri">anonymous</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">两种</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
				<o:p>
						<font face="Calibri"> </font>
				</o:p>
		</p>
<img src ="http://www.cppblog.com/jacky2019/aggbug/20735.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-03-27 21:59 <a href="http://www.cppblog.com/jacky2019/archive/2007/03/27/20735.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多线程学习中碰到的一个很有意思的问题 </title><link>http://www.cppblog.com/jacky2019/archive/2007/03/27/20732.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Tue, 27 Mar 2007 13:24:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/03/27/20732.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/20732.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/03/27/20732.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/20732.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/20732.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: #include				&lt;stdio.h&gt;								#include				&lt;windows.h&gt;								const										int numThreads = 3;														 												DWORD WINAPI helloFunc(LPVOID pAr...&nbsp;&nbsp;<a href='http://www.cppblog.com/jacky2019/archive/2007/03/27/20732.html'>阅读全文</a><img src ="http://www.cppblog.com/jacky2019/aggbug/20732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-03-27 21:24 <a href="http://www.cppblog.com/jacky2019/archive/2007/03/27/20732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件过程与度量Software Process</title><link>http://www.cppblog.com/jacky2019/archive/2007/03/27/20668.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Tue, 27 Mar 2007 01:09:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/03/27/20668.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/20668.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/03/27/20668.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/20668.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/20668.html</trackback:ping><description><![CDATA[
		<h1 style="MARGIN: 24pt 0in 0pt">
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: major-latin; mso-fareast-theme-font: major-fareast; mso-hansi-theme-font: major-latin; mso-ascii-font-family: Cambria; mso-fareast-font-family: 宋体; mso-hansi-font-family: Cambria">
						<font color="#4f81bd" size="4">软件过程的概念</font>
				</span>
		</h1>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<font face="Calibri">Defines Who is doing What, When to do it, and How to reach a certain goal. </font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">过程是产品成本、进度和质量的主要决定因素。软件过程的组成，五大元素：工件</span>
				<font face="Calibri">/</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">产品，活动，里程碑，资源和角色，关系。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">工件（</span>
				<font face="Calibri">Artifact</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">），是指软件开发过程的中间或最后工作产品，包括：文档，模型，程序，数据，计划，报告等</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">活动，软件过程由多个活动组成。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">里程碑，是特殊的活动，当时钟到达特定时间，就会触发里程碑检查本阶段的所有活动和工作是否按要求完成</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">资源，人是最重要的资源</span>
		</p>
		<h2 style="MARGIN: 10pt 0in 0pt">
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: major-latin; mso-fareast-theme-font: major-fareast; mso-hansi-theme-font: major-latin; mso-ascii-font-family: Cambria; mso-fareast-font-family: 宋体; mso-hansi-font-family: Cambria">
						<font color="#4f81bd" size="4">软件生命周期模型</font>
				</span>
		</h2>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">是软件生命周期的一个框架，规定了软件开发、运作和维护等所需的过程、活动和任务。又称软件开发模型。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">线形顺序模型</span>
				<font face="Calibri">waterfall model</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">增量式模型</span>
				<font face="Calibri">incremental model</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">演化模型</span>
				<font face="Calibri">evolutionary model</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">（目前采用最广泛的模型）</span>
		</p>
		<p class="MsoListParagraphCxSpFirst" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<span style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 'Courier New'">
						<span style="mso-list: Ignore">o<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">原型</span>
				<font face="Calibri">prototyping</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<span style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 'Courier New'">
						<span style="mso-list: Ignore">o<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">螺旋模型</span>
				<font face="Calibri">spiral model</font>
		</p>
		<p class="MsoListParagraphCxSpLast" style="MARGIN: 0in 0in 10pt 1in; TEXT-INDENT: -0.25in; mso-list: l1 level2 lfo1; mso-add-space: auto">
				<span style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 'Courier New'">
						<span style="mso-list: Ignore">o<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">并发开发模型</span>
				<font face="Calibri">concurrent development model</font>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">特殊过程模型</span>
		</p>
		<p class="MsoListParagraphCxSpFirst" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l0 level2 lfo2; mso-add-space: auto">
				<span style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 'Courier New'">
						<span style="mso-list: Ignore">o<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">基于构件的开发</span>
				<font face="Calibri">Component-Based Development</font>
		</p>
		<p class="MsoListParagraphCxSpMiddle" style="MARGIN: 0in 0in 0pt 1in; TEXT-INDENT: -0.25in; mso-list: l0 level2 lfo2; mso-add-space: auto">
				<span style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 'Courier New'">
						<span style="mso-list: Ignore">o<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">形式化方法的模型</span>
				<font face="Calibri">Formal Methods Model</font>
		</p>
		<p class="MsoListParagraphCxSpLast" style="MARGIN: 0in 0in 10pt 1in; TEXT-INDENT: -0.25in; mso-list: l0 level2 lfo2; mso-add-space: auto">
				<span style="FONT-FAMILY: 'Courier New'; mso-fareast-font-family: 'Courier New'">
						<span style="mso-list: Ignore">o<span style="FONT: 7pt 'Times New Roman'">   </span></span>
				</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">面向侧面的软件开发</span>
				<font face="Calibri">Aspect-Oriented Software Development</font>
		</p>
<img src ="http://www.cppblog.com/jacky2019/aggbug/20668.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-03-27 09:09 <a href="http://www.cppblog.com/jacky2019/archive/2007/03/27/20668.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>合作型多任务和抢先式多任务</title><link>http://www.cppblog.com/jacky2019/archive/2007/03/26/20648.html</link><dc:creator>kk</dc:creator><author>kk</author><pubDate>Mon, 26 Mar 2007 13:00:00 GMT</pubDate><guid>http://www.cppblog.com/jacky2019/archive/2007/03/26/20648.html</guid><wfw:comment>http://www.cppblog.com/jacky2019/comments/20648.html</wfw:comment><comments>http://www.cppblog.com/jacky2019/archive/2007/03/26/20648.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jacky2019/comments/commentRss/20648.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jacky2019/services/trackbacks/20648.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">合作型多任务（</span>
				<font face="Calibri">cooperative multitasking</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">）允许执行多个任务，但分享</span>
				<font face="Calibri">CPU</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">是程序（而非操作系统）的责任。如果有一个程序决定咬住</span>
				<font face="Calibri">CPU</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">不放，其它程序就停摆了。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0in 0in 10pt">
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">抢先式多任务（</span>
				<font face="Calibri">preemptive multitasking</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">）操作系统能够强迫应用程序把</span>
				<font face="Calibri">CPU</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">分享给其他人，程序员不需要什么额外的努力。虽然这个减少了程序员的工作，也不会因为某个程序拒绝分享</span>
				<font face="Calibri">CPU</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">而造成其他程序</span>
				<font face="Calibri">hang</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">住，但是它使得各个线程之间的执行顺序不可预测，从而导致了</span>
				<font face="Calibri">race condition</font>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-hansi-font-family: Calibri">等一系列问题。</span>
		</p>
<img src ="http://www.cppblog.com/jacky2019/aggbug/20648.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jacky2019/" target="_blank">kk</a> 2007-03-26 21:00 <a href="http://www.cppblog.com/jacky2019/archive/2007/03/26/20648.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>