﻿<?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++博客-清风竹林-随笔分类-VC</title><link>http://www.cppblog.com/xmli/category/11063.html</link><description>ぷ雪飘绛梅映残红 &lt;br&gt;
&amp;nbsp;&amp;nbsp; ぷ花舞霜飞映苍松&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;----- Do more,suffer less</description><language>zh-cn</language><lastBuildDate>Sat, 11 Jun 2011 09:34:56 GMT</lastBuildDate><pubDate>Sat, 11 Jun 2011 09:34:56 GMT</pubDate><ttl>60</ttl><item><title>VC/MFC之ListCtrl控件使用经验总结(转)</title><link>http://www.cppblog.com/xmli/archive/2011/06/11/148482.html</link><dc:creator>李现民</dc:creator><author>李现民</author><pubDate>Sat, 11 Jun 2011 03:57:00 GMT</pubDate><guid>http://www.cppblog.com/xmli/archive/2011/06/11/148482.html</guid><wfw:comment>http://www.cppblog.com/xmli/comments/148482.html</wfw:comment><comments>http://www.cppblog.com/xmli/archive/2011/06/11/148482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xmli/comments/commentRss/148482.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xmli/services/trackbacks/148482.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 以下未经说明，listctrl默认view 风格为report相关类及处理函数MFC：CListCtrl类SDK：以 &#8220;ListView_&#8221;开头的一些宏。如 ListView_InsertColumn--------------------------------------------------------------------------------1. CList...&nbsp;&nbsp;<a href='http://www.cppblog.com/xmli/archive/2011/06/11/148482.html'>阅读全文</a><img src ="http://www.cppblog.com/xmli/aggbug/148482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xmli/" target="_blank">李现民</a> 2011-06-11 11:57 <a href="http://www.cppblog.com/xmli/archive/2011/06/11/148482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c语言 printf()输出格式控制(转)</title><link>http://www.cppblog.com/xmli/archive/2011/06/09/148330.html</link><dc:creator>李现民</dc:creator><author>李现民</author><pubDate>Thu, 09 Jun 2011 03:59:00 GMT</pubDate><guid>http://www.cppblog.com/xmli/archive/2011/06/09/148330.html</guid><wfw:comment>http://www.cppblog.com/xmli/comments/148330.html</wfw:comment><comments>http://www.cppblog.com/xmli/archive/2011/06/09/148330.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xmli/comments/commentRss/148330.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xmli/services/trackbacks/148330.html</trackback:ping><description><![CDATA[<div><span style="font-family: verdana, sans-serif; "><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">1．转换说明符<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %a(%A)&nbsp;&nbsp;&nbsp;&nbsp; 浮点数、十六进制数字和p-(P-)记数法(C99)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有符号十进制整数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 浮点数(包括float和doulbe)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %e(%E)&nbsp;&nbsp;&nbsp;&nbsp; 浮点数指数输出[e-(E-)记数法]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %g(%G)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 浮点数不显无意义的零"0"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有符号十进制整数(与%d相同)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 无符号十进制整数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %o&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 八进制整数&nbsp;&nbsp;&nbsp; e.g.&nbsp;&nbsp;&nbsp;&nbsp; 0123<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %x(%X)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 十六进制整数0f(0F)&nbsp;&nbsp; e.g.&nbsp;&nbsp; 0x1234<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指针<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符串<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "%"</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">2．标志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 左对齐："-"&nbsp;&nbsp; e.g.&nbsp;&nbsp; "%-20s"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 右对齐："+" e.g.&nbsp;&nbsp; "%+20s"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 空格：若符号为正，则显示空格，负则显示"-"&nbsp;&nbsp; e.g.&nbsp;&nbsp; "% 6.2f"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #：对<span style="line-height: 21px; ">c,s,d,u类无影响；对o类，在输出时加前缀o；对x类，在输出时加前缀0x；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对e,g,f 类当结果有小数时才给出小数点。</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; ">3．格式字符串（格式）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;［标志］［输出最少宽度］［．精度］［长度］类型<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "％-md" ：左对齐，若m比实际少时，按实际输出。<br />&nbsp;&nbsp;&nbsp;&nbsp; "%m.ns"：输出m位，取字符串(左起)n位，左补空格，当n&gt;m or m省略时m=n<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.g.&nbsp;&nbsp;&nbsp; "%7.2s" 输入CHINA<br />&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出"&nbsp;&nbsp;&nbsp;&nbsp; CH"<br />&nbsp;&nbsp;&nbsp;&nbsp; "%m.nf"：输出浮点数，m为宽度，n为小数点右边数位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.g.&nbsp;&nbsp;&nbsp; "%3.1f"&nbsp;&nbsp;&nbsp; 输入3852.99<br />&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出3853.0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 长度：为ｈ短整形量,ｌ为长整形量</p><div></div></span></div><img src ="http://www.cppblog.com/xmli/aggbug/148330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xmli/" target="_blank">李现民</a> 2011-06-09 11:59 <a href="http://www.cppblog.com/xmli/archive/2011/06/09/148330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏客户端与编辑器代码重用设计杂谈</title><link>http://www.cppblog.com/xmli/archive/2010/12/10/136043.html</link><dc:creator>李现民</dc:creator><author>李现民</author><pubDate>Fri, 10 Dec 2010 04:28:00 GMT</pubDate><guid>http://www.cppblog.com/xmli/archive/2010/12/10/136043.html</guid><wfw:comment>http://www.cppblog.com/xmli/comments/136043.html</wfw:comment><comments>http://www.cppblog.com/xmli/archive/2010/12/10/136043.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/xmli/comments/commentRss/136043.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xmli/services/trackbacks/136043.html</trackback:ping><description><![CDATA[<p align="CENTER" style="margin-bottom: 0cm"><font color="#000000"><font size="4" style="font-size: 16pt"><strong><span lang="zh-CN">游戏客户端与编辑器</span>代码重<span lang="zh-CN">用</span>设计<span lang="zh-CN">杂谈</span></strong></font></font></p>
<p align="CENTER" style="margin-bottom: 0cm">版本：<font face="Times New Roman, serif">0.1</font></p>
<p align="CENTER" style="margin-bottom: 0cm">最后修改：<font face="Times New Roman, serif">2010-12-10</font></p>
<p align="CENTER" style="margin-bottom: 0cm">撰写：李现民</p>
<p align="CENTER" style="margin-bottom: 0cm"><br>
</p>
<h1 lang="zh-CN" class="cjk">引言</h1>
<p lang="zh-CN" style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font>很多游戏都有配套的编辑器，或通用或专用，这样可以方便策划及时设计、修改游戏数据。当一个游戏方案确认实施时，如果需要设计配套编辑器，那么它往往先于游戏本身而设计。出于代码重用和方便维护的需要，大部分核心代码会在游戏客户端与编辑器中同时使用，因此有效提取这部分共用代码并尽量减少与项目其它部分的耦合就成为设计的重点。</p>
<p lang="zh-CN" style="margin-bottom: 0cm"><br>
</p>
<p lang="zh-CN" style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font>关于良好程序架构设计的话题，比如设计模式、领域驱动设计等，相关论著恒河沙数。本文结合实践中遇到的问题，从工具与技术相结合的角度来阐述相关问题的解决方案。</p>
<p lang="zh-CN" style="margin-bottom: 0cm"><br>
</p>
<p lang="zh-CN" style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font>以下假定程序运行环境为<font face="Times New Roman, serif">VC6+XP</font>。从本文撰写时间看（<font face="Times New Roman, serif">2010-12-10</font>），<font face="Times New Roman, serif">VC6</font>无论如何都不是一个好的选择，但限于笔者所在公司环境如此，所以只好将就着来了╮<font face="Times New Roman, serif">(╯▽╰)╭</font>。</p>
<p lang="zh-CN" style="margin-bottom: 0cm"><br>
</p>
<h1 class="cjk">使用宏控制代码生成策略</h1>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font>尽管我们追求代码的可重用性，但实际情况往往并不尽如人意，特别是在与特定于游戏客户端<span lang="zh-CN">（</span>或编辑器<span lang="zh-CN">）</span>的功能相结合比较紧密的<span lang="zh-CN">代码</span>部分<span lang="zh-CN">。</span>比如<font face="Times New Roman, serif">UI</font>（<span lang="zh-CN">界面</span>），游戏<span lang="zh-CN">客户端</span>中有独立的界面模块，而编辑器界面<span lang="zh-CN">可能</span>使用<font face="Times New Roman, serif">MFC</font>制作<span lang="zh-CN">。即使同一个函数接口，游戏客户端与编辑器所需要的功能也可能是不一样的，这是因为它们拥有各自不同的应用倾向：游戏客户端倾向于使游戏画质更加平滑，而编辑器则需要考虑策划人员快速的编辑修改数据；再比如游戏客户端可能需要网络</span><font face="Times New Roman, serif">IO</font><span lang="zh-CN">功能，而编辑器则一般不需要。</span></p>
<p lang="zh-CN" style="margin-bottom: 0cm"><br>
</p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font><span lang="zh-CN">宏（具体的说，</span><font face="Times New Roman, serif">C++</font><span lang="zh-CN">中的宏），此时可能是一种比较合适的工具。比如，通过在游戏客户端与编辑器中定义不同的宏变量，可以使游戏客户端专用的网络</span><font face="Times New Roman, serif">IO</font><span lang="zh-CN">代码在编辑器中根本不生成。</span></p>
<p lang="zh-CN" style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font></p>
<p lang="zh-CN" style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font>某些情况下可能需要在<font color="#800000">同一个项目下建立多个<font face="Times New Roman, serif">configurations</font></font><font color="#800000">（配置），通过定义不同的宏变量以控制生成不同版本的程序，比如：简化版、完整版、内部版等</font>。</p>
<p lang="zh-CN" style="margin-bottom: 0cm"><br>
</p>
<p lang="zh-CN" style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font>宏在<font face="Times New Roman, serif">VC</font>环境中有大量的应用案例，比如<font face="Times New Roman, serif">windows.h</font>头文件中定义了大量的宏用于控制不同环境下的代码生成策略。</p>
<p lang="zh-CN" style="margin-bottom: 0cm"><br>
</p>
<h1 class="cjk"><span lang="zh-CN">使用函数控制代码生成策略并信任</span>编译器<span lang="zh-CN">优化</span></h1>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font><span lang="zh-CN">宏控制的原理是将不需要的代码当作注释直接移除，因此编</span><font color="#800000"><span lang="zh-CN">译器不会去审查该部分代码的正确性。这在某些情况下是必须的</span></font><span lang="zh-CN">，比如编辑器没有网络</span><font face="Times New Roman, serif">IO</font><span lang="zh-CN">相关的代码接口，因此相关代码必须被清除，否则编辑器项目将无法正确编译。</span></p>
<p lang="zh-CN" style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font></p>
<p lang="zh-CN" style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font>但宏控制有自己的问题：</p>
<ol>
	<li><p lang="zh-CN" style="margin-bottom: 0cm">宏变量通常定义在<font face="Times New Roman, serif">Project
	Settings</font>（工程设置）中，因此不容易记忆或查找；</p>
	</li><li><p lang="zh-CN" style="margin-bottom: 0cm"><font face="Times New Roman, serif">IDE</font>工具通常无法像支持代码一样支持此类宏变量的快速查找，特别是存在多个项目相互引用的复杂工程中（比如<font face="Times New Roman, serif">Visual
	Assist X</font>有<font face="Times New Roman, serif">Find
	Reference</font>功能，可以快速搜索到所有引用指定变量或函数的代码，但此功能不支持在<font face="Times New Roman, serif">Project
	Settings</font>中定义的宏变量）；</p>
	</li><li><p lang="zh-CN" style="margin-bottom: 0cm">编译器无法审查被移除部分代码的正确性，这可能导致一些代码修改同步的问题。</p></li></ol>
<p lang="zh-CN" style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font>针对这些问题，笔者的解决方案是：宏控制变量只使用一次，用于定义一个简单函数，而该函数返回当前宏控制变量的存在情况，其它原本使用宏控制变量的地方都改为使用这个函数判断。这样<font color="#800000">间接的将宏变量控制转换为函数控制，从而获得<font face="Times New Roman, serif">IDE</font></font><font color="#800000">工具支持与编译器代码审查的双重好处</font>。</p>
<p lang="zh-CN" style="margin-bottom: 0cm"><br>
</p>
<p lang="zh-CN" style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font>比如如下代码：</p>
<p style="margin-bottom: 0cm; background: #e6e6e6"><font face="Times New Roman, serif"><font color="#0000ff"><font size="2" style="font-size: 9pt"><span lang="zxx">namespace</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">
</span></font></font><font color="#010001"><font size="2" style="font-size: 9pt"><span lang="zxx">edition<br></span></font></font></font><span  style="font-family: 'Times New Roman', serif; font-size: 14.4px; ">{<br></span><span  style="font-family: 'Times New Roman', serif; "><font color="#0000ff"><font size="2" style="font-size: 9pt"><span lang="zxx">#ifdef</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">
</span></font></font><font color="#010001"><font size="2" style="font-size: 9pt"><span lang="zxx">_EDITOR<br></span></font></font></span><span  style="font-family: 'Times New Roman', serif; "><font color="#0000ff"><font size="2" style="font-size: 9pt"><span lang="zxx">inline</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">
</span></font></font><font color="#0000ff"><font size="2" style="font-size: 9pt"><span lang="zxx">bool</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">
</span></font></font><font color="#010001"><font size="2" style="font-size: 9pt"><span lang="zxx">IsEditor</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">()
{ </span></font></font><font color="#0000ff"><font size="2" style="font-size: 9pt"><span lang="zxx">return</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">
</span></font></font><font color="#0000ff"><font size="2" style="font-size: 9pt"><span lang="zxx">true</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">;
}<br></span></font></font></span><span  style="color: rgb(0, 0, 255); font-family: 'Times New Roman', serif; font-size: 14.4px; ">#else<br></span><span  style="font-family: 'Times New Roman', serif; "><font color="#0000ff"><font size="2" style="font-size: 9pt"><span lang="zxx">inline</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">
</span></font></font><font color="#0000ff"><font size="2" style="font-size: 9pt"><span lang="zxx">bool</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">
</span></font></font><font color="#010001"><font size="2" style="font-size: 9pt"><span lang="zxx">IsEditor</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">()
{ </span></font></font><font color="#0000ff"><font size="2" style="font-size: 9pt"><span lang="zxx">return</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">
</span></font></font><font color="#0000ff"><font size="2" style="font-size: 9pt"><span lang="zxx">false</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">;
}<br></span></font></font></span><span  style="color: rgb(0, 0, 255); font-family: 'Times New Roman', serif; font-size: 14.4px; ">#endif<br></span><span  style="font-family: 'Times New Roman', serif; font-size: 14.4px; ">}<br><span  style="font-size: medium; "><font color="#0000ff"><font size="2" style="font-size: 9pt"><span lang="zxx"><font  color="#000000"><br></font>void</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">
</span></font></font><font color="#010001"><font size="2" style="font-size: 9pt"><span lang="zxx">Print</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">()<br></span></font></font></span></span><span  style="font-family: 'Times New Roman', serif; font-size: 14.4px; ">{<br></span><span  style="font-family: 'Times New Roman', serif; "><font color="#0000ff"><font size="2" style="font-size: 9pt"><span lang="zxx">if</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">
(</span></font></font><font color="#010001"><font size="2" style="font-size: 9pt"><span lang="zxx">edition</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">::</span></font></font><font color="#010001"><font size="2" style="font-size: 9pt"><span lang="zxx">IsEditor</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">())<br></span></font></font></span><span  style="font-family: 'Times New Roman', serif; font-size: 14.4px; ">{<br></span><span  style="font-family: 'Times New Roman', serif; "><font color="#010001"><font size="2" style="font-size: 9pt"><span lang="zxx">puts</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">(</span></font></font><font color="#a31515"><font size="2" style="font-size: 9pt"><span lang="zxx">"This
is editor"</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">);<br></span></font></font></span><span  style="font-family: 'Times New Roman', serif; font-size: 14.4px; ">}<br></span><span  style="color: rgb(0, 0, 255); font-family: 'Times New Roman', serif; font-size: 14.4px; ">else<br></span><span  style="font-family: 'Times New Roman', serif; font-size: 14.4px; ">{<br></span><span  style="font-family: 'Times New Roman', serif; "><font color="#010001"><font size="2" style="font-size: 9pt"><span lang="zxx">puts</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">(</span></font></font><font color="#a31515"><font size="2" style="font-size: 9pt"><span lang="zxx">"This
is not editor"</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">);<br></span></font></font></span><span  style="font-family: 'Times New Roman', serif; font-size: 14.4px; ">}<br></span><span  style="font-family: 'Times New Roman', serif; font-size: 14.4px; ">}</span></p>
<p lang="zh-CN" style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font></p>
<p lang="zh-CN" style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font>宏变量<font face="Times New Roman, serif"><font color="#010001"><font size="2" style="font-size: 9pt"><span lang="zxx">_EDITOR</span></font></font></font>只使用一次，其余地方都使用<font face="Times New Roman, serif"><font color="#010001"><font size="2" style="font-size: 9pt"><span lang="zxx">edition</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">::</span></font></font><font color="#010001"><font size="2" style="font-size: 9pt"><span lang="zxx">IsEditor</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">()</span></font></font></font>区分是编辑器代码还是游戏客户端代码。</p>
<p lang="zh-CN" style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font></p>
<p lang="zh-CN" style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font>请注意，我们并不会有任何的运行期性能损失，虽然看起来并非如此。由于在编译期<font face="Times New Roman, serif"><font color="#010001"><font size="2" style="font-size: 9pt"><span lang="zxx">edition</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">::</span></font></font><font color="#010001"><font size="2" style="font-size: 9pt"><span lang="zxx">IsEditor</span></font></font><font color="#000000"><font size="2" style="font-size: 9pt"><span lang="zxx">()</span></font></font></font>的值是确定的，因此<font color="#800000">当打开优化时编译器会移除不可达代码，从而得到与宏控制情况下相同的可执行文件</font>。当然，在<font face="Times New Roman, serif">Debug</font>版本下（优化关闭）所有的代码都被编译生成到最终可执行文件中，但我猜您应该不会将<font face="Times New Roman, serif">Debug</font>版本给最终用户使用对吧？</p>
<p style="margin-bottom: 0cm"><br>
</p>
<h1 class="cjk">使用<font face="Times New Roman, serif">delegate</font>解耦</h1>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font><span lang="zh-CN">在</span><font face="Times New Roman, serif">MVC</font><span lang="zh-CN">架构下，使用</span><font face="Times New Roman, serif">Observer</font><span lang="zh-CN">（观察者）模式将核心逻辑代码与</span><font face="Times New Roman, serif">UI</font><span lang="zh-CN">界面代码分离似乎天经地义的事，这样做的好处是核心逻辑代码可以独立于</span><font face="Times New Roman, serif">UI</font><span lang="zh-CN">代码而存在，从而达到重用的目的。但不幸的是，从笔者经手的代码看，很多程序员并没有注意到这一点。主要问题可能包括以下两个方面：</span></p>
<p lang="zh-CN" style="margin-bottom: 0cm"><br>
</p>
<p lang="zh-CN" style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font>第一是核心逻辑代码与<font face="Times New Roman, serif">UI</font>界面代码相互调用关系错综复杂。由于核心逻辑代码不独立，因而很难进行提取复用。这种情况相对比较常见。</p>
<p lang="zh-CN" style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font></p>
<p lang="zh-CN" style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font>第二个问题解释起来可能更复杂一些。由于缺乏从核心逻辑代码到<font face="Times New Roman, serif">UI</font>界面代码的回调机制，程序员可能会被迫使用一些极端的手法来达到侦测指定事件是否发生的目的。比如，我们知道游戏客户端都有一个主循环<font face="Times New Roman, serif">main_loop</font>，方法名称通常叫<font face="Times New Roman, serif">Update()</font>或<font face="Times New Roman, serif">Tick()</font>，用于更新每一帧的游戏动画。这时，程序员可能会在该循环中埋伏一些代码以侦测核心逻辑状态的变化情况，从而达到触发事件的目的。这种手法实现了功能，保持了低耦合，却降低了代码执行效率。</p>
<p lang="zh-CN" style="margin-bottom: 0cm"><br>
</p>
<p lang="zh-CN" style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font>这两个问题的解决之道在于观察者模式。这个模式在实现上还是比较复杂的，对每一个要处理事件都需要定义对应的观察者与被观察者接口。这种代码复杂性曾使很多人望而却步（包括本人<font face="Times New Roman, serif">-___-</font>），为此<font face="Times New Roman, serif">java</font>中内置了<font face="Times New Roman, serif">java.util.Observer</font>与<font face="Times New Roman, serif">java.util.Observable</font>接口，以降低使用该模式的代价。</p>
<p lang="zh-CN" style="margin-bottom: 0cm"><br>
</p>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font><span lang="zh-CN">笔者建议的方案是使用</span><font face="Times New Roman, serif">delegate</font><span lang="zh-CN">（委托）。没错，就是那个</span><font face="Times New Roman, serif">C#</font><span lang="zh-CN">中的</span><font face="Times New Roman, serif">delegate</font><span lang="zh-CN">，它能够极低的设计复杂度实现与观察者模式相同的解耦效果。具体实例这里不再列举，因为网上可以找到很多。如果你使用的是</span><font face="Times New Roman, serif">C#</font><span lang="zh-CN">，那么你是幸运的；如果你使用的是</span><font face="Times New Roman, serif">C++</font><span lang="zh-CN">，那么网上同样可以找到设计好的仿真类库；如果你不幸使用了</span><font face="Times New Roman, serif">VC6</font><span lang="zh-CN">，并且实在找到出路了，那么同学你也许可以去参考一下我的另一篇文章《</span><font face="Times New Roman, serif">VC6</font><span lang="zh-CN">中简易</span><font face="Times New Roman, serif">delegate</font><span lang="zh-CN">实现》，或许会有点帮助。</span><font face="Times New Roman, serif">	</font></p>
<p style="margin-bottom: 0cm"><br>
</p>
<h1 class="cjk">结语</h1>
<p style="margin-bottom: 0cm"><font face="Times New Roman, serif">	</font><span lang="zh-CN">本来还想加点静态变量与通用工厂的话题的，但我发现</span><font face="Times New Roman, serif">meyers
singleton</font><span lang="zh-CN">在</span><font face="Times New Roman, serif">VC6</font><span lang="zh-CN">中的某种应用模式下会问题（</span><font face="Times New Roman, serif">singleton</font><span lang="zh-CN">对象的构造函数会被调用两次，</span><font face="Times New Roman, serif">T__T</font><span lang="zh-CN">），因此先欠着账，等待下次有成熟方案的时候再说吧。不过对此问题诸位看官如果有相关宝贵经验的话不妨提携一二，感激不尽中。</span></p>
<img src ="http://www.cppblog.com/xmli/aggbug/136043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xmli/" target="_blank">李现民</a> 2010-12-10 12:28 <a href="http://www.cppblog.com/xmli/archive/2010/12/10/136043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于常量折叠(转)</title><link>http://www.cppblog.com/xmli/archive/2010/11/23/134425.html</link><dc:creator>李现民</dc:creator><author>李现民</author><pubDate>Tue, 23 Nov 2010 13:24:00 GMT</pubDate><guid>http://www.cppblog.com/xmli/archive/2010/11/23/134425.html</guid><wfw:comment>http://www.cppblog.com/xmli/comments/134425.html</wfw:comment><comments>http://www.cppblog.com/xmli/archive/2010/11/23/134425.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xmli/comments/commentRss/134425.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xmli/services/trackbacks/134425.html</trackback:ping><description><![CDATA[
<span style="color: rgb(48, 48, 48); font-family: Verdana, Helvetica, Arial; line-height: 21px; font-size: 11.6667px; "><p>首先来看一个例子：</p><p>int main(int argc, char* argv[])<br>{<br>const int i=0;<br>int *j = (int *) &amp;i;<br>*j=1;<br>cout&lt;&lt;&amp;i&lt;&lt;endlcout&lt;&lt;j&lt;&lt;endl;<br>cout&lt;&lt;i&lt;&lt;endl;<br>cout&lt;&lt;*j&lt;&lt;endl;<br>return 0;<br>}</p><p>结果是</p><p>0012ff7c<br>0012ff7c</p><p>0</p><p>1</p><p>因为i和j都指向相同的内存地址，所以输出的前两个结果是相同的，但为啥相同的内存里的结果不相同么？－－这就是常量折叠.</p><p>这个"常量折叠"是 就是在编译器进行语法分析的时候，将常量表达式计算求值，并用求得的值来替换表达式，放入常量表。可以算作一种编译优化。<br>我只是改了这个地址内容,但是i还是0,</p><p>因为编译器在优化的过程中，会把碰见的const全部以内容替换掉（跟宏似的: #define pi 3.1415,用到pi时就用3.1415代替），这个出现在预编译阶段；但是在运行阶段，它的内存里存的东西确实改变了!!!</p><p>6.网上的一些问题（4）</p><br><p>关于常量</p><p>这些天被常量的一些概念折磨着,现在终于有些明白了，</p><p>问题始于const int i = 10;//i存在哪，10存在哪</p><p>说明一：符号表</p><p>这个语句是对i的声明，因为编译器一开始就知道i的值，所以以后出现i时就会用10代替，这好像叫做符号表的概念，i就对应10了。</p><p>网上一篇帖子上有这样的代码：</p><p>const int a = 3;</p><p>int *p = const_cast&lt;int *&gt;(&amp;a);</p><p>*p = 4;</p><p>cout &lt;&lt; a;//仍然输出3</p><p>这个结果可以用上面的说明来解释</p><p>说明二：常量折叠（const folding）与复写传播 (copy propagation)</p><p>网上人们普遍反映thinking in c++将const folding译为常量折叠是种误导，我觉得译的还行，本来folding就有折叠的意思，就是把原来的东西变小，而象const int i = 2*2;编译器确实将2*2算成4了，以后碰到i就用4替换，这个计算2*2的过程据说叫常量折叠--const folding，而用4替换i的过程叫做复写传播--copy propagation.他们都是编译器的优化技术</p><br><p>说明三：为常量分配空间</p><p>补充一下，这里说的都是const 定义的常量，而非文字常量，</p><p>（c++ primer翻译成文字常量--literal constant</p><p>the c++ programming language（tcpl）翻译成文字量，还分了不同类型）</p><p>至于文字常量存在哪，c++ primer 3ed上说它们是不可寻址的--nonaddressable，尽管它们也存在机器内存某个地方，但无法访问它们的地址</p><p>对于int double等类型还好理解，但是对于字符串常量（tcpl里说将字符串文字量作为常量，利于存储与访问时的优化）下面的代码似乎表示字符串常量存储在静态存储区里（字符串文字量是静态分配的--tcpl），那么字符串常量的地址不是可以访问了吗，在静态存储区里</p><p><a href="http://bbs.bc-cn.net/dispbbs.asp?boardid=56&amp;replyi" style="color: rgb(54, 105, 0); text-decoration: none; ">http://bbs.bc-cn.net/dispbbs.asp?boardid=56&amp;replyi</a>...</p><p>字符串文字量的类型是常量字符数组--适当个数的const字符的数组</p><p>//有关字符常量的存储区的问题</p><p>//另外，char a[]和char *a的区别</p><p>//"hello world 1"存在哪<br>#include &lt;iostream&gt;<br>using namespace std;<br>int main()<br>{</p><p><br>char* p = "hello world1"；<br>char a[] = "hello world2"；<br>//会为a在栈上分配13个字节的空间<br>// p[2] = a;<br>a[2] = a;<br>char* p1 = "hello world1"<br>printf("%xn",&amp;p[2]);//p应该指向常量区<br>printf("%x",&amp;a[2]);//栈上数组第三个元素的地址<br>return 0;<br>//结果42f036 //这是常量区<br>//12ff6e果然不一样，这是栈区<br>}</p><br><p>6.总结</p><p>那么"常量折叠"到底是啥意思呢？</p><p>我理解，简单的说就是，当编译器处理const的时候，编译器会将其变成一个立即数。</p><p>《thinking in c++》里面说这一点在数组定义里尤其重要(为啥呢？没有查到相关的资料)。</p><p class="zoundry_bw_tags"><span class="ztags"><span class="ztagspace">Technorati</span>&nbsp;:&nbsp;<a href="http://technorati.com/tag/Zoundary" class="ztag" rel="tag" style="color: rgb(54, 105, 0); text-decoration: none; ">Zoundary</a>,&nbsp;<a href="http://technorati.com/tag/test" class="ztag" rel="tag" style="color: rgb(54, 105, 0); text-decoration: none; ">test</a>,&nbsp;<a href="http://technorati.com/tag/%E5%B8%B8%E9%87%8F%E6%8A%98%E5%8F%A0" class="ztag" rel="tag" style="color: rgb(54, 105, 0); text-decoration: none; ">常量折叠</a></span></p></span><img src ="http://www.cppblog.com/xmli/aggbug/134425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xmli/" target="_blank">李现民</a> 2010-11-23 21:24 <a href="http://www.cppblog.com/xmli/archive/2010/11/23/134425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何通过程序屏蔽windows粘滞键之热键</title><link>http://www.cppblog.com/xmli/archive/2010/03/04/108880.html</link><dc:creator>李现民</dc:creator><author>李现民</author><pubDate>Thu, 04 Mar 2010 05:36:00 GMT</pubDate><guid>http://www.cppblog.com/xmli/archive/2010/03/04/108880.html</guid><wfw:comment>http://www.cppblog.com/xmli/comments/108880.html</wfw:comment><comments>http://www.cppblog.com/xmli/archive/2010/03/04/108880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xmli/comments/commentRss/108880.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xmli/services/trackbacks/108880.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 最近在游戏开发中遇到这样的需求：玩家需要不停的连击shift键。<br>&nbsp;&nbsp;&nbsp; 大家都知道，在windows下默认连击shift键到5次会弹出粘滞键设置的对话框，如下图所示。<br><br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/xmli/stickykeys.JPG" width=410 height=160><br><br>&nbsp;&nbsp;&nbsp; 在游戏中必须屏蔽windows对粘滞键热键的反应，否则游戏体验将会非常差。在网上查找一段时间后发现，关于如何通过程序屏蔽粘滞键热键的中文资料非常少，大多数的答案都是打开&#8220;控制面板&#8221;，然后找到&#8220;辅助功能选项&#8221;条目云云，这显示不是程序员所需要的解决手法。<br>&nbsp;&nbsp;&nbsp; 经过多方查找，问题最终得以解决。下面列表代码，以飨未来者，程序VC6.0+XP系统下运行通过。<br><br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;activate&nbsp;or&nbsp;inactivate&nbsp;sticky&nbsp;keys&nbsp;hot&nbsp;key&nbsp;(pop&nbsp;up&nbsp;&nbsp;a&nbsp;set&nbsp;up&nbsp;dialog&nbsp;after&nbsp;continually&nbsp;pressed&nbsp;shift&nbsp;5&nbsp;times)</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;ActivateStickyHotkey(</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;isActivate,&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pIsPreviouslyActivate</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;fetch&nbsp;current&nbsp;sticky&nbsp;keys&nbsp;state</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STICKYKEYS&nbsp;skf;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;DWORD&nbsp;datasize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(STICKYKEYS);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;skf.cbSize&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: #000000">=</span><span style="COLOR: #000000">&nbsp;datasize;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">SystemParametersInfo(SPI_GETSTICKYKEYS,&nbsp;datasize,&nbsp;(LPVOID)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">skf,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;isPreviouslyActivate&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(skf.dwFlags&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;SKF_HOTKEYACTIVE)&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;store&nbsp;old&nbsp;sticky&nbsp;keys&nbsp;state</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(NULL</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;pIsPreviouslyActivate)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pIsPreviouslyActivate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;isPreviouslyActivate;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;return&nbsp;true&nbsp;if&nbsp;no&nbsp;need&nbsp;to&nbsp;change&nbsp;state</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(isActivate</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">isPreviouslyActivate)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;change&nbsp;sticky&nbsp;keys&nbsp;state</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;skf.dwFlags&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: #000000">=</span><span style="COLOR: #000000">&nbsp;isActivate</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;(skf.dwFlags&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;SKF_HOTKEYACTIVE)&nbsp;:&nbsp;(skf.dwFlags&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">SKF_HOTKEYACTIVE));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;isSuccess&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;TRUE</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">SystemParametersInfo(SPI_SETSTICKYKEYS,&nbsp;datasize,&nbsp;(LPVOID)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">skf,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;isSuccess;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br></span></div>
<br>参考资料：<br>1, <a href="http://msdn.microsoft.com/en-us/library/aa925903.aspx">http://msdn.microsoft.com/en-us/library/aa925903.aspx</a>&nbsp;<br>2, <a href="http://stackoverflow.com/questions/734618/disabling-accessibility-shortcuts-in-net-application">http://stackoverflow.com/questions/734618/disabling-accessibility-shortcuts-in-net-application</a>
<img src ="http://www.cppblog.com/xmli/aggbug/108880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xmli/" target="_blank">李现民</a> 2010-03-04 13:36 <a href="http://www.cppblog.com/xmli/archive/2010/03/04/108880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>符号文件——Windows 应用程序调试必备</title><link>http://www.cppblog.com/xmli/archive/2009/09/15/96258.html</link><dc:creator>李现民</dc:creator><author>李现民</author><pubDate>Tue, 15 Sep 2009 10:26:00 GMT</pubDate><guid>http://www.cppblog.com/xmli/archive/2009/09/15/96258.html</guid><wfw:comment>http://www.cppblog.com/xmli/comments/96258.html</wfw:comment><comments>http://www.cppblog.com/xmli/archive/2009/09/15/96258.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xmli/comments/commentRss/96258.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xmli/services/trackbacks/96258.html</trackback:ping><description><![CDATA[<br>
<p align="center"><strong>符号文件——Windows 应用程序调试必备</strong><br>
<br>
作者：Generad USam</p>
<p>　</p>
<p><strong>一、何谓符号文件？</strong></p>
<p>
符号文件（Symbol
Files）是一个数据信息文件，它包含了应用程序二进制文件（比如：EXE、DLL等）调试信息，专门用来作调试之用，最终生成的可执行文件在运行时并
不需要这个符号文件，但你的程序中所有的变量信息都记录在这个文件中。所以调试应用程序时，这个文件是非常重要的。用 Visual C++ 和
WinDbg 调试程序时都要用到这个文件。<br>
在 Windows 系统中，符号文件以 .pdb 为扩展名，比如：每个 Windows 操作系统下有一个 GDI32.dll
文件，编译器在编译该 DLL 的时候会产生一个 GDI32.pdb 文件，一旦你拥有了这个 PDB 文件，那么便可以用它来调试并跟踪到
GDI32.dll 内部。该文件和二进制文件的编译版本密切相关，比如修改了 DLL 的输出函数，再编译该 DLL，那么原先的 PDB
文件就过时了，不能再用老的 PDB 文件来做调试工作,而必须使用最新的 PDB 文件版本。<br>
Visual C++ 编译代码后会在 Debug 或者 Release 目录下生成一个 PDB
文件。一般情况下，符号文件包括以下的数据信息：</p>
<ol>
    <li>全局变量（Global variables）；</li>
    <li>局部变量（Local variables）；</li>
    <li>函数名和它们的入口地址（Function names and the addresses of their entry
    points）；</li>
    <li>FPO 数据（Frame Pointer Omission)：Frame Pointer 是一种用来在调用堆栈（Call
    stack）中找到下一个将要被调用的函数的数据结构源代码的行序号（Source-line numbers）；</li>
</ol>
<p><strong>二、如何得到和安装符号文件?</strong></p>
<ol>
    <li>先确定你的操作系统（OS）版本；</li>
    <li>到微软网站下载相应的符号文件；</li>
    <li>安装符号文件，对于符号文件的安装位置没有特贝要求，可以安装在任何目录中；</li>
    <li>设置环境变量，使得调试工具（比如：Visual C++、WinDbg、Ntsd、DrWatson 等）能找到符号文件；</li>
</ol>
<p>安装符号文件的注意事项：<br>
<br>
如果是手动安装符号文件，有一点很重要，那就是宿主机（Hostt Computer）上的符号文件必须与目标机器（Target
Computer）上的 Windows 版本相匹配。<br>
这里所谓的宿主机指的是运行调试会话的机器，在典型的双系统调试会话环境中，宿主机可以是连接到目标机器的任何机器。目标机器指的是发生软件组件、系
统服务、应用程序或操作系统运行失败的机器。也即是需要被调试的机器，它是调试会话关注的焦点。目标机器可以近在咫尺，也可以位于完全不同的地方。有时我
们也将目标机器称之为——被调试者（debuggee），那么与之对应，宿主机则可以称为调试者（debugger）。</p>
<p><strong>三、在 Visual C++ 使用符号文件的方法</strong></p>
<p>在 Visual C++ 6.0 中的使用方法：</p>
<ol>
    <li>打开 Visual C++ 6.0 的 Workspace 文件（*.dsw）；</li>
    <li>进入 Tools 菜单，选择 Options 菜单项 (Tools-&gt;Options)；</li>
    <li>单击 Directoties 标签；</li>
    <li>在 &#8220;Show directories for&#8221;下拉列表中选择 &#8220;Executable files&#8221;；</li>
    <li>将符号文件的路径添加到 &#8220;Directories&#8221; 路径列表中；</li>
    <li>单击&nbsp; OK 完成；</li>
</ol>
<p>在 Visual C++ .NET 2003 中的使用方法：</p>
<ol>
    <li>打开 Visual C++ .NET 的项目文件（*.vcproj）；</li>
    <li>在解决方案管理器中选中要使用符号文件的项目；</li>
    <li>单击右键进入项目属性对话框；</li>
    <li>选择&#8220;配置属性&#8221;中的&#8220;调试&#8221;；</li>
    <li>在与&#8220;调试&#8221;对应的&#8220;操作&#8221;选项中有一个&#8220;符号路径&#8221;，在此添加符号文件的路径即可；</li>
    <li>单击&nbsp; &#8220;确定&#8221; 完成；</li>
</ol>
<p><strong>四、如何产生 Release 版本二进制文件对应的 PDB 文件?</strong></p>
<p>在 Visual C++ 6.0 中的方法：</p>
<ol>
    <li>打开 Visual C++ 6.0 的 Workspace 文件（*.dsw）；</li>
    <li>进入 Project 菜单，选择 Settings 菜单项 (Project-&gt;Settings)，打开项目设置对话框；</li>
    <li>在 &#8220;Settings for&#8221;列表中选择项目的 Release 配置；</li>
    <li>单击&#8220;C/C++&#8221;标签；</li>
    <li>在&#8220;Category&#8221;下拉列表框中选择&#8220;General&#8221;选项；</li>
    <li>在&#8220;Debug info&#8221;下拉列表框中选择调试信息格式（具体选项参见图一），在此不必禁用任何优化选项；</li>
    <li>单击&#8220;Link&#8221;标签；</li>
    <li>在&#8220;Category&#8221;下拉列表框中选择&#8220;Debug&#8221;选项；</li>
    <li>选中&#8220;Debug info&#8221;复选框，然后选择需要的链接调试类型（具体选项参见图一）；</li>
    <li>不要选择&#8220;Separate types&#8221;复选框；</li>
    <li>在&#8220;Project options&#8221;编辑框的最后添加如下指令：/opt:ref,icf；</li>
    <li>重新生成（Rebuild）项目；</li>
</ol>
<p>在 Visual C++ .NET 2003 中的方法：</p>
<ol>
    <li>打开 Visual C++ .NET 的项目文件（*.vcproj）；</li>
    <li>进入 Project 菜单，选择 Settings 菜单项 (Project-&gt;Settings)，打开项目设置对话框；</li>
    <li>在 &#8220;配置&#8221;下拉列表中选择项目的 &#8220;（活动）Release&#8221; 配置；</li>
    <li>选择&#8220;配置属性&#8221;树型节点中的&#8220;C/C++&#8221; ==〉&#8220;常规&#8221;；</li>
    <li>设置右边的&#8220;调试信息格式&#8221;选项（具体选项参见图一）；</li>
    <li>选择&#8220;配置属性&#8221;树型节点中的&#8220;链接器&#8221;==〉&#8220;调试&#8221;；</li>
    <li>设置右边的&#8220;生成程序数据库文件&#8221;（具体选项参见图一）；</li>
    <li>选择&#8220;配置属性&#8221;树型节点中的&#8220;链接器&#8221;==〉&#8220;命令行&#8221;；</li>
    <li>在&#8220;附加选项(D)&#8221;编辑框中添加如下指令：/opt:ref,icf；</li>
    <li>按&#8220;确定&#8221;退出；</li>
    <li>重新生成（Rebuild）项目；</li>
</ol>
<img  src="http://www.cppblog.com/images/cppblog_com/xmli/SymbleFile.gif" border="0"><br>图一
<p><strong>五、关于 Free Build（也称 Retail Build）和 Checked Build（也称 Debug Build）</strong></p>
<p>每个基于 NT 操作系统有两种不同的程序生成模式，即：</p>
<ul>
    <li>Free Build (或 Retail Build)</li>
    <li>Checked Build (或 Debug Build)</li>
</ul>
<p>　　Free Build
生成的是最终用户版本，针对生成的二进制文件进行了彻底的优化，禁用了调试断言，并剥离了调试信息。这样一来使可执行程序文件更小，加载更快，使用的内存也更小。<br>
Checked Build 生成的是测试和调试版本。它包含额外的 Free Build 所没有的错误检查，参数验证和调试信息，Checked
Build 有助于隔离和跟踪可能导致不可预见的行为的问题，比如内存溢出，不正确的设备配置。虽然 Checked Build
提供了额外的保护，但与 Free Build
比较，它需要更多的内存开销和磁盘空间。由于可执行程序包含符号调试信息；调试时要执行附加的代码、参数检查和输出调试诊断信息，从而导致性能下降。<br>
<br>
<strong>六、系统符号文件的更新方法</strong><br>
<br>
系统符号文件指 Windows 操作系统依赖的那几个重要的 DLL/SYS
和可执行文件对应的符号文件，常见的比如：gdi32.dll、Kernel32.dll、Kerberos.dll、psapi.dll、user32.dll等，使用
WinDbg 调试时，你就会发现系统符号文件(PDB)有多重要，这些文件都与本地的 OS 密切相关，比如，Windows 2000
打了SP补丁的话，那么必须更新系统符号文件才能进行相关调试，原来的符号文件与打补丁后的系统就会不匹配，怎么办呢?
可以通过网络来更新！象下面这样在 WinDbg 的 Symbols Path 里面输入路径：</p>
<pre>SRV*<em><strong>D:\Symbols\websymbols*</strong></em>http://msdl.microsoft.com/download/symbols</pre>
（斜体部分是你在本地保存符号文件的路径）<br>
<br>
如果你不是通过代理上网，那么在你用 WinDbg 打开一个被调试程序后，输入 symchk 回车，WinDbg
就会自动的连到微软的网站根据你的机器的情况更新的 PDB
文件，并将它保存在上面斜体部分指定的本地路径里，这样你就可以确保你的符号文件版本和你机器上的文件版本一致。<br>
<br>
如果你是通过代理上网那么你需要配置 IE 的连接设置。具体方法恕不赘言。<br><br><img src ="http://www.cppblog.com/xmli/aggbug/96258.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xmli/" target="_blank">李现民</a> 2009-09-15 18:26 <a href="http://www.cppblog.com/xmli/archive/2009/09/15/96258.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何通过打印机之网络名称获取其IP地址</title><link>http://www.cppblog.com/xmli/archive/2009/09/02/95104.html</link><dc:creator>李现民</dc:creator><author>李现民</author><pubDate>Wed, 02 Sep 2009 07:51:00 GMT</pubDate><guid>http://www.cppblog.com/xmli/archive/2009/09/02/95104.html</guid><wfw:comment>http://www.cppblog.com/xmli/comments/95104.html</wfw:comment><comments>http://www.cppblog.com/xmli/archive/2009/09/02/95104.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/xmli/comments/commentRss/95104.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xmli/services/trackbacks/95104.html</trackback:ping><description><![CDATA[&nbsp; 前天有大学同学问到这个问题，据说寻觅了好久：<br>&nbsp; 1、如何根据网络打印机的名字，获取该打印机的IP；<br>&nbsp; 2、如何从shd文件获取打印相关的信息；<br>&nbsp; <br>&nbsp; 问题一与&#8220;查找网络上服务器的ip地址&#8221;是相同的问题，比如查找g.cn的ip地址。以下假定网络打印机名称为"\\printer"，则可通过以下代码获取其ip地址。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">WinSock2.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#pragma&nbsp;comment(lib,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Ws2_32</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;WSADATA&nbsp;wsaData;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;err_code</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;WSAStartup(MAKEWORD(</span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">),</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">wsaData);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">0</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;err_code)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hostent</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pHost</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;gethostbyname(</span><span style="color: #000000;">"</span><span style="color: #000000;">printer</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(NULL</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;pHost)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sockaddr_in&nbsp;&nbsp;&nbsp;sa;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;pHost</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">h_addr_list[i];&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">sa.sin_addr.s_addr,&nbsp;pHost</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">h_addr_list[i],&nbsp;pHost</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">h_length);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">IP=&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;inet_ntoa(sa.sin_addr)</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;std::endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="color: #000000;">"</span><span style="color: #000000;">pause</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}</span></div>
<br>&nbsp;&nbsp; 问题二尚无头绪，借宝地问一下各位前辈有没有知道解决方案的？谢谢啦！<br><br><br><br><br><img src ="http://www.cppblog.com/xmli/aggbug/95104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xmli/" target="_blank">李现民</a> 2009-09-02 15:51 <a href="http://www.cppblog.com/xmli/archive/2009/09/02/95104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文件夹选项更改后刷新的问题</title><link>http://www.cppblog.com/xmli/archive/2009/07/03/89152.html</link><dc:creator>李现民</dc:creator><author>李现民</author><pubDate>Fri, 03 Jul 2009 05:03:00 GMT</pubDate><guid>http://www.cppblog.com/xmli/archive/2009/07/03/89152.html</guid><wfw:comment>http://www.cppblog.com/xmli/comments/89152.html</wfw:comment><comments>http://www.cppblog.com/xmli/archive/2009/07/03/89152.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/xmli/comments/commentRss/89152.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xmli/services/trackbacks/89152.html</trackback:ping><description><![CDATA[感谢coolslob的帮助， 我被这个问题困惑很久的，今天终于找到的合适的解决方案<br><br>参考链接如下：<br><br>三问文件夹选项更改后刷新的问题<br><a>http://topic.csdn.net/u/20081121/11/f5034a2f-26ae-4f74-a357-1fbd33576883.html </a><br>&nbsp;<br>再问文件夹选项更改后刷新的问题 <br>http://topic.csdn.net/u/20081108/18/ab4009f0-bfd1-4af6-873d-06ec7837236a.html <br>&nbsp;<br>&nbsp;在程序中怎么调用设置文件夹选项的功能？ <br>http://topic.csdn.net/u/20081104/11/b79c58c2-7887-4144-87d0-e9486685cb87.html <br><br>实现代码如下：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;ShowAllFilesInExplorer(</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;isShowHidden</span><span style="color: #008000;">/*</span><span style="color: #008000;">对应[显示所有的文件和文件夹]</span><span style="color: #008000;">*/</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;isShowSysProtected</span><span style="color: #008000;">/*</span><span style="color: #008000;">对应[显示受操作系统保护的文件]</span><span style="color: #008000;">*/</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;isShowFileExt</span><span style="color: #008000;">/*</span><span style="color: #008000;">对应[隐藏已知文件类型的扩展名]</span><span style="color: #008000;">*/</span><span style="color: #000000;">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;HKEY&nbsp;hKey&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">0</span><span style="color: #000000;">};<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;bRet&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(ERROR_SUCCESS&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;::RegOpenKeyEx(HKEY_CURRENT_USER,&nbsp;TEXT(</span><span style="color: #000000;">"</span><span style="color: #000000;">Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced</span><span style="color: #000000;">"</span><span style="color: #000000;">),&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;KEY_SET_VALUE,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">hKey))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwShowHidden&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;isShowHidden&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;:&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwShowSysProtected&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;isShowSysProtected&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;:&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwShowFileExt</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;isShowFileExt</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">:&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(ERROR_SUCCESS&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;::RegSetValueEx(hKey,&nbsp;TEXT(</span><span style="color: #000000;">"</span><span style="color: #000000;">Hidden</span><span style="color: #000000;">"</span><span style="color: #000000;">),&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;REG_DWORD,&nbsp;(LPBYTE)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">dwShowHidden,&nbsp;(DWORD)</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(dwShowHidden))&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">ERROR_SUCCESS&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;::RegSetValueEx(hKey,&nbsp;TEXT(</span><span style="color: #000000;">"</span><span style="color: #000000;">ShowSuperHidden</span><span style="color: #000000;">"</span><span style="color: #000000;">),&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;REG_DWORD,&nbsp;(LPBYTE)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">dwShowSysProtected,&nbsp;(DWORD)</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(dwShowSysProtected))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;ERROR_SUCCESS&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;::RegSetValueEx(hKey,&nbsp;TEXT(</span><span style="color: #000000;">"</span><span style="color: #000000;">HideFileExt</span><span style="color: #000000;">"</span><span style="color: #000000;">),&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;REG_DWORD,&nbsp;(LPBYTE)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">dwShowFileExt,&nbsp;(DWORD)</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(dwShowFileExt)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bRet&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::RegCloseKey(hKey);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bRet&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(bRet)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::SendMessageTimeout(HWND_BROADCAST,&nbsp;WM_SETTINGCHANGE,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;(LPARAM)TEXT(</span><span style="color: #000000;">"</span><span style="color: #000000;">ShellState</span><span style="color: #000000;">"</span><span style="color: #000000;">),&nbsp;SMTO_ABORTIFHUNG,&nbsp;</span><span style="color: #000000;">3000</span><span style="color: #000000;">,&nbsp;NULL);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::SHChangeNotify(SHCNE_ASSOCCHANGED,&nbsp;SHCNF_IDLIST,&nbsp;NULL,&nbsp;NULL);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;bRet;<br>}</span></div>
<br><img src ="http://www.cppblog.com/xmli/aggbug/89152.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xmli/" target="_blank">李现民</a> 2009-07-03 13:03 <a href="http://www.cppblog.com/xmli/archive/2009/07/03/89152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc中bool与BOOL的区别</title><link>http://www.cppblog.com/xmli/archive/2009/07/03/89138.html</link><dc:creator>李现民</dc:creator><author>李现民</author><pubDate>Fri, 03 Jul 2009 01:48:00 GMT</pubDate><guid>http://www.cppblog.com/xmli/archive/2009/07/03/89138.html</guid><wfw:comment>http://www.cppblog.com/xmli/comments/89138.html</wfw:comment><comments>http://www.cppblog.com/xmli/archive/2009/07/03/89138.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xmli/comments/commentRss/89138.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xmli/services/trackbacks/89138.html</trackback:ping><description><![CDATA[<div class="articletxt">
<p>BOOL是微软定义的typedef&nbsp;&nbsp; int&nbsp;&nbsp;
BOOL。与bool不同，它是一个三值逻辑，TRUE/FALSE/ERROR，返回值为&amp;gt;0的整数为TRUE，0为FALSE，-1为
ERROR。Win32&nbsp;&nbsp; API中很多返回值为BOOL的函数都是三值逻辑。比如GetMessage().</p>
<p>bool是标准C 数据类型，可取值true和false。</p>
<p>根据布尔类型的语义，零值为&#8220;假&#8221;（记为FALSE），任何非零值都是&#8220;真&#8221;（记为TRUE）。TRUE的值究竟是什么并没有统一的标准。例如Visual C 将TRUE定义为1，而Visual Basic则将TRUE定义为-1。 <br>
假设布尔变量名字为flag，它与零值比较的标准if语句如下： <br>
if (flag) // 表示flag为真 <br>
if (!flag) // 表示flag为假 <br>
其它的用法都属于不良风格，例如： <br>
if (flag == TRUE) <br>
if (flag == 1 ) <br>
if (flag == FALSE)&nbsp;&nbsp; <br>
if (flag == 0)</p>
</div><img src ="http://www.cppblog.com/xmli/aggbug/89138.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xmli/" target="_blank">李现民</a> 2009-07-03 09:48 <a href="http://www.cppblog.com/xmli/archive/2009/07/03/89138.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>