﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-我的玻璃盒子-随笔分类-皮皮片片</title><link>http://www.cppblog.com/epubcn/category/6041.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 10 Mar 2017 20:07:18 GMT</lastBuildDate><pubDate>Fri, 10 Mar 2017 20:07:18 GMT</pubDate><ttl>60</ttl><item><title>【原创】Windows下编译 openh264 小记</title><link>http://www.cppblog.com/epubcn/archive/2017/03/09/214740.html</link><dc:creator>深蓝色系统</dc:creator><author>深蓝色系统</author><pubDate>Thu, 09 Mar 2017 03:51:00 GMT</pubDate><guid>http://www.cppblog.com/epubcn/archive/2017/03/09/214740.html</guid><wfw:comment>http://www.cppblog.com/epubcn/comments/214740.html</wfw:comment><comments>http://www.cppblog.com/epubcn/archive/2017/03/09/214740.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/epubcn/comments/commentRss/214740.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/epubcn/services/trackbacks/214740.html</trackback:ping><description><![CDATA[<span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.3333px; background-color: #ffffff;">1. 安装git工具(如GitHub for Windows)，clone源码：https://github.com/cisco/openh264.git</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.3333px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.3333px; background-color: #ffffff;">2. 安装MinGW，添加 &nbsp;%YOUR MINGW INSTALL DIR%\bin\ &nbsp;到系统环境变量 &nbsp;Path &nbsp;中，手动修改\bin\mingw32-make.exe为make.exe（不改也行，以后执行起来麻烦点）</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.3333px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.3333px; background-color: #ffffff;">3. 运行Visual Studio Command Prompt( 如 VS2013 x86 Native Tools Command Prompt）</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.3333px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.3333px; background-color: #ffffff;">4. 在命令行窗口中，执行%YOUR MINGW INSTALL DIR%\msys\1.0\msys.bat，把MSYS命令行窗口弄出来</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.3333px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.3333px; background-color: #ffffff;">5. MSYS中执行一下pwd看一下当前路径，把openh264代码拷贝到当前路径下某个文件夹，新建一个也行</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.3333px; background-color: #ffffff;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13.3333px; background-color: #ffffff;">6. 进入openh264目录，执行 &nbsp;make OS=msvc &nbsp;（注意大小写），好了。</span><img src ="http://www.cppblog.com/epubcn/aggbug/214740.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/epubcn/" target="_blank">深蓝色系统</a> 2017-03-09 11:51 <a href="http://www.cppblog.com/epubcn/archive/2017/03/09/214740.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>终于在我的HP 6515B 上激活了WINDOWS 7 RTM U版</title><link>http://www.cppblog.com/epubcn/archive/2009/08/29/94765.html</link><dc:creator>深蓝色系统</dc:creator><author>深蓝色系统</author><pubDate>Sat, 29 Aug 2009 07:39:00 GMT</pubDate><guid>http://www.cppblog.com/epubcn/archive/2009/08/29/94765.html</guid><wfw:comment>http://www.cppblog.com/epubcn/comments/94765.html</wfw:comment><comments>http://www.cppblog.com/epubcn/archive/2009/08/29/94765.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/epubcn/comments/commentRss/94765.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/epubcn/services/trackbacks/94765.html</trackback:ping><description><![CDATA[
vista用了有一段时间了，最近看同事装了个WIN 7，挺新鲜，决定也装一个。<br>昨天晚上从远景下载了一个cn_windows_7_ultimate_x86_dvd_x15-65907.iso，刻盘，安装，然后开始艰苦的激活尝试。<br>折腾到凌晨1点，几乎所有的激活补丁、工具都试过了，就是不成功，有些想放弃了。<br><br>今天早上起来又上网搜索了一下HP 6515B相关的帖子，突然发现有人成功激活了，最早的帖子是这篇：<br><a href="http://benyouhui.it168.com/thread-985830-3-1.html">http://benyouhui.it168.com/thread-985830-3-1.html</a><br><br>然后按照帖子里面的说明，下载安装了<span style="font-family: Helvetica; border-collapse: collapse; font-size: 14px; line-height: 22px; ">grub4dos，然后把slic.bin、grldr以及menu.lst复制到C盘下。<br></span><span style="font-family: Helvetica; border-collapse: collapse; font-size: 14px; line-height: 22px; ">用SLIC_Dump_TooKit查看BIOS的SLIC版本，原来是显示Error，装了grub4dos以后，显示2.1了。<br>最后用远景论坛上一哥们儿提供的oem激活工具进行激活，重启以后还是显示没激活，郁闷。然后又执行了一遍这个激活工具的卸载，但是好像显示什么错误，不管他，重启机器。<br>不甘心那，运行SLIC_Dump_Tookit，又显示Error了，再试一遍：安装grub4dos，这下SLIC又显示2.1了。再重启机器&#8230;&#8230;<br><br>进入WIN 7，按WIN+Pause，我靠！竟然显示Windows已激活了！！哈哈哈&#8230;&#8230;鬼使神差地让我给弄好了。<br>亢奋中&#8230;&#8230;<br><br>后来又在网上发现另外一篇帖子，也是用差不多的方式激活了，不过他是导入证书并用key激活的：<a href="http://benyouhui.it168.com/thread-988200-1-1.html">http://benyouhui.it168.com/thread-988200-1-1.html</a><br>以后有机会可以试试这种方法。<br><br>接下来开始装各种各样的软件咯&#8230;&#8230;</span><img src ="http://www.cppblog.com/epubcn/aggbug/94765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/epubcn/" target="_blank">深蓝色系统</a> 2009-08-29 15:39 <a href="http://www.cppblog.com/epubcn/archive/2009/08/29/94765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】搜狐白社会阳光牧场外挂 UI源代码</title><link>http://www.cppblog.com/epubcn/archive/2009/08/11/92913.html</link><dc:creator>深蓝色系统</dc:creator><author>深蓝色系统</author><pubDate>Tue, 11 Aug 2009 08:14:00 GMT</pubDate><guid>http://www.cppblog.com/epubcn/archive/2009/08/11/92913.html</guid><wfw:comment>http://www.cppblog.com/epubcn/comments/92913.html</wfw:comment><comments>http://www.cppblog.com/epubcn/archive/2009/08/11/92913.html#Feedback</comments><slash:comments>32</slash:comments><wfw:commentRss>http://www.cppblog.com/epubcn/comments/commentRss/92913.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/epubcn/services/trackbacks/92913.html</trackback:ping><description><![CDATA[好多朋友需要我写的阳光牧场外挂的界面代码，今天抽空打了个包，提供给各位下载。<br><br>一些说明：<br><br>1、界面主要是基于XT的早期版本（大概是4、5年前的版本）中rip出来的代码，做了一些修改。代码中还有不少问题，我没有去修正。因为我工作中写界面是不用MFC的，这次是为了写这个外挂才把以前的老界面code翻出来。<br><br>2、源代码解压后，有个XTUILib目录，里面就是rip出来的全部XT的代码。把这个目录搞到你的工程中去以后，还有很多其他事情要做：<br>（1）resource.h中所有以XT或XTP开头的资源ID，要搞到你的工程去；<br>（2）rc文件中所有以XT或XTP开头的资源（主要是一些图标、对话框、bitmap之类的）也要搞到你的工程里去，资源文件在res目录下你可以找到。<br><br>3、XT的使用，请自行到官网或国内其他编程站点找一下，这里就不赘述了。<br><br><a href="http://sohusunfarmhelper.googlecode.com/files/sohusunfarmhelper_base_ui_codes.rar" target="_blank">点击这里下载</a>（652KB）<img src ="http://www.cppblog.com/epubcn/aggbug/92913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/epubcn/" target="_blank">深蓝色系统</a> 2009-08-11 16:14 <a href="http://www.cppblog.com/epubcn/archive/2009/08/11/92913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】TinyJSON使用介绍</title><link>http://www.cppblog.com/epubcn/archive/2009/08/05/92267.html</link><dc:creator>深蓝色系统</dc:creator><author>深蓝色系统</author><pubDate>Wed, 05 Aug 2009 03:56:00 GMT</pubDate><guid>http://www.cppblog.com/epubcn/archive/2009/08/05/92267.html</guid><wfw:comment>http://www.cppblog.com/epubcn/comments/92267.html</wfw:comment><comments>http://www.cppblog.com/epubcn/archive/2009/08/05/92267.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/epubcn/comments/commentRss/92267.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/epubcn/services/trackbacks/92267.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 引用www.json.org上的对JSON这种数据格式的介绍：JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立...&nbsp;&nbsp;<a href='http://www.cppblog.com/epubcn/archive/2009/08/05/92267.html'>阅读全文</a><img src ="http://www.cppblog.com/epubcn/aggbug/92267.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/epubcn/" target="_blank">深蓝色系统</a> 2009-08-05 11:56 <a href="http://www.cppblog.com/epubcn/archive/2009/08/05/92267.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>虚方法(virtual)和抽象方法(abstract)的区别</title><link>http://www.cppblog.com/epubcn/archive/2008/04/03/46216.html</link><dc:creator>深蓝色系统</dc:creator><author>深蓝色系统</author><pubDate>Thu, 03 Apr 2008 14:41:00 GMT</pubDate><guid>http://www.cppblog.com/epubcn/archive/2008/04/03/46216.html</guid><wfw:comment>http://www.cppblog.com/epubcn/comments/46216.html</wfw:comment><comments>http://www.cppblog.com/epubcn/archive/2008/04/03/46216.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/epubcn/comments/commentRss/46216.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/epubcn/services/trackbacks/46216.html</trackback:ping><description><![CDATA[<p>虚方法和抽象方法都可以供派生类重写，它们之间有什么区别呢？<br>1. 虚方法必须有实现部分，抽象方法没有提供实现部分，抽象方法是一种强制派生类覆盖的方法，否则派生类将不能被实例化。如：
<p>//抽象方法<br>public abstract class Animal<br>{<br>public abstract void Sleep();<br>public abstract void Eat();<br>}<br>//虚方法<br>public class Animal<br>{<br>public virtual void Sleep(){}<br>public virtual void Eat(){}<br>}
<p>2. 抽象方法只能在抽象类中声明，虚方法不是。其实如果类包含抽象方法，那么该类也是抽象的，也必须声明为抽象的。如：
<p>public class Animal<br>{<br>public abstract void Sleep();<br>public abstract void Eat();<br>}
<p>编译器会报错：<br>Main.cs(10): 'VSTest.Animal.Sleep()' is abstract but it is contained in nonabstract class 'VSTest.Animal'<br>Main.cs(11): 'VSTest.Animal.Eat()' is abstract but it is contained in nonabstract class 'VSTest.Animal'
<p>3. 抽象方法必须在派生类中重写，这一点跟接口类似，虚方法不必。如：
<p>public abstract class Animal<br>{<br>public abstract void Sleep();<br>public abstract void Eat();<br>}<br>public class Cat : Animal<br>{<br>public override void Sleep()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine( "Cat is sleeping<img alt="" src="http://www.cnblogs.com/Images/dot.gif">" );<br>&nbsp;&nbsp;&nbsp; }<br>// we need implement Animal.Eat() here<img alt="" src="http://www.cnblogs.com/Images/dot.gif"><br>}
<p>编译器会报错：Main.cs(14): 'VSTest.Cat' does not implement inherited abstract member 'VSTest.Animal.Eat()'，因为我们没有实现抽象类中所有抽象方法。</p>
<img src ="http://www.cppblog.com/epubcn/aggbug/46216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/epubcn/" target="_blank">深蓝色系统</a> 2008-04-03 22:41 <a href="http://www.cppblog.com/epubcn/archive/2008/04/03/46216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转载）IE 异步可插入协议扩展</title><link>http://www.cppblog.com/epubcn/archive/2008/03/24/45307.html</link><dc:creator>深蓝色系统</dc:creator><author>深蓝色系统</author><pubDate>Mon, 24 Mar 2008 13:20:00 GMT</pubDate><guid>http://www.cppblog.com/epubcn/archive/2008/03/24/45307.html</guid><wfw:comment>http://www.cppblog.com/epubcn/comments/45307.html</wfw:comment><comments>http://www.cppblog.com/epubcn/archive/2008/03/24/45307.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/epubcn/comments/commentRss/45307.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/epubcn/services/trackbacks/45307.html</trackback:ping><description><![CDATA[<p>转载地址：<a title=http://www.cppblog.com/bigsml/archive/2008/03/23/45145.html href="http://www.cppblog.com/bigsml/archive/2008/03/23/45145.html">http://www.cppblog.com/bigsml/archive/2008/03/23/45145.html</a></p>
<p>&nbsp;</p>
<p>可插入协议扩展（Asynchronous Pluggable Protocols）主要基于异步的URL Moniker技术。 IE的URL Moniker在urlmon.dll 动态库中实现的， 有两种处理机制：<br><strong>1. 根据URL 协议调用外部程序处理</strong><br>比如telnet: or news: or mailto:，当访问这些url的时候会打开相应的程序来处理。<br>比如要添加note:协议(Registering an Application to a URL Protocol), 则只要修改注册表<br>[HKEY_CLASSES_ROOT]<br>&nbsp;&nbsp;&nbsp; [note]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Default) = "<a href="http://www.cppblog.com/bigsml/admin/Note">URL:Note</a> Protocol"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URL Protocol = ""<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [DefaultIcon]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Default) = "notepad.exe"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [shell]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [command]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Default) = "c:\windows\notepad.exe %1"<br>在IE 中输入 note://xxx.txt 的时候会自动用notepad 打开xxx.txt 文件
<p><strong>2. 根据URL 协议调用类对象来处理<br></strong>可以根据URL 协议或者MIME type 注册不同的处理对象<br>有两种方式：<br>a) 通过在注册表将URL 协议与COM 对象关联<br>主要在注册表中的 <br>HKEY_CLASSES_ROOT\PROTOCOLS\Handler # URL 协议<br>HKEY_CLASSES_ROOT\PROTOCOLS\Filter # Mime Filter
<p>b) 通过临时注册类对象将URL 协议与其关联<br>// 注册<br>CComPtr&lt;IInternetSession&gt; spSession;<br>CComPtr&lt;IClassFactory&gt;&nbsp;&nbsp; spCFHTTP;<br>HRESULT hr = CoInternetGetSession(0, &amp;spSession, 0);<br>hr = FilterFactory::CreateInstance(CLSID_HttpProtocol, &amp;spCFHTTP);<br>hr = spSession-&gt;RegisterNameSpace(spCFHTTP, CLSID_NULL, L"http", 0, 0, 0);
<p>// 反注册<br>spSession-&gt;UnregisterNameSpace(spCFHTTP, L"http");
<p>3. FilterFactory 的实现可以参考<br><a href="http://www.codeguru.com/cpp/com-tech/atl/misc/article.php/c37/">Asynchronous Pluggable Protocol Implementation with ATL</a><br><a href="http://www.codeguru.com/cpp/com-tech/atl/misc/article.php/c37/">http://www.codeguru.com/cpp/com-tech/atl/misc/article.php/c37/</a><br><a href="http://blog.csdn.net/111222/archive/2002/02/09/7255.aspx">Internet Explorer下载文件的终极过滤</a><br><a href="http://blog.csdn.net/111222/archive/2002/02/09/7255.aspx">http://blog.csdn.net/111222/archive/2002/02/09/7255.aspx</a>
<p><a href="http://blog.csdn.net/lion_wing/archive/2006/06/27/839134.aspx">通过Mime filter技术对网页源码进行过滤（监视下载文件）</a><br><a href="http://blog.csdn.net/lion_wing/archive/2006/06/27/839134.aspx">http://blog.csdn.net/lion_wing/archive/2006/06/27/839134.aspx</a><br><a href="http://blog.csdn.net/lion_wing/articles/534716.aspx">HTML代码过滤技术</a><br><a href="http://blog.csdn.net/lion_wing/articles/534716.aspx">http://blog.csdn.net/lion_wing/articles/534716.aspx</a>
<p>About Asynchronous Pluggable Protocols （MSDN）<br><a href="http://blog.csdn.net/CathyEagle/archive/2005/12/12/550698.aspx">Internet Explorer 编程简述（九）在自己的浏览器中嵌入Google工具条</a><br><a href="http://blog.csdn.net/CathyEagle/archive/2005/12/12/550698.aspx">http://blog.csdn.net/CathyEagle/archive/2005/12/12/550698.aspx</a><br><a href="http://topic.csdn.net/t/20061214/12/5230161.html">放1000分，高手进来动手试试：如何提取AJAX里的HTML内容？<br></a><a href="http://topic.csdn.net/t/20061214/12/5230161.html">http://topic.csdn.net/t/20061214/12/5230161.html</a><br>这里主要通过监视IE 的下载从而保存Google Map 的地图数据文件.&nbsp; 通过监视http &amp; text/html &amp; application/javascript 的内容来获取图片文件URL 和 信息.. :)</p>
<img src ="http://www.cppblog.com/epubcn/aggbug/45307.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/epubcn/" target="_blank">深蓝色系统</a> 2008-03-24 21:20 <a href="http://www.cppblog.com/epubcn/archive/2008/03/24/45307.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转帖）项目为何失败&amp;mdash;&amp;mdash;从需求的角度出发</title><link>http://www.cppblog.com/epubcn/archive/2008/02/01/42359.html</link><dc:creator>深蓝色系统</dc:creator><author>深蓝色系统</author><pubDate>Fri, 01 Feb 2008 09:16:00 GMT</pubDate><guid>http://www.cppblog.com/epubcn/archive/2008/02/01/42359.html</guid><wfw:comment>http://www.cppblog.com/epubcn/comments/42359.html</wfw:comment><comments>http://www.cppblog.com/epubcn/archive/2008/02/01/42359.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/epubcn/comments/commentRss/42359.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/epubcn/services/trackbacks/42359.html</trackback:ping><description><![CDATA[<p>&#160;</p>
<p>原文链接：<a title=http://www.51testing.com/?103489/action_viewspace_itemid_70804.html href="http://www.51testing.com/?103489/action_viewspace_itemid_70804.html">http://www.51testing.com/?103489/action_viewspace_itemid_70804.html</a></p>
<p>之前一个朋友问起我，说做了那么多年开发，谈谈有些项目为何失败。朋友说项目失败很大的原因是在合同问题，合同没有很好的列出项目范围。其实，合同的范围只是一般的范围，详细内容应该不属于合同的一部分。所以我觉得项目最大的问题还是需求没做好。需求没有做好，主要表现在以下几个方面： </p>
<p><br><strong>一、需求采集与分析</strong> </p>
<p>&nbsp; 1、需求采集分析时，没有从完整的业务流程出发，容易关注主要业务需求，而造成次要业务需求块的遗漏。
<p>&nbsp;&nbsp; 之前检查了我们公司一个重要项目的需求做得咋样，光看需求提问单，就发现大部分问题是关于功能需求的。而问起业务需求时，他们说都很清楚了，但问起业务上细节处理时，大家都恍然大悟：&#8220;哦，这里需要再问下客户...&#8221;。
<p>&nbsp; 2、开发人员除了关注采集功能需求、外部接口需求、性能需求和一般的标准需求外，往往容易忽略系统领域的背景、操作环境需求、用户特殊需求（例如用户熟练使用的工具与方法）等。
<p><strong>二、需求定义与确认</strong>
<p>&nbsp;&nbsp; 需求规格说明书是将人们思想中的概念和目标转换成正式的文档，在这个过程中，很容易产生错误，例如表达不完整，不正确的事实，不一致或模糊的需求等。因此，一定要正确详细的进行需求定义与验证，确保规格化的内容确实是用户所需求的东西。
<p><strong>三、需求变更</strong>
<p>&nbsp; 需求变更管理有两个方面，一是与客户就怎样变更达成一致，一个是进行变更流程控制活动。在这两个方面都容易出错。
<p>&nbsp; 1、与客户达成一致方面，需要让客户意识到变更对项目影响的后果，要技巧性+友好性的将变更加入到协商条款中。在评估需求变更达到一定的影响时，要试图协商控制变更，以保证在需求变更下，项目可以继续成功。
<p>&nbsp; 2、变更流程控制活动，包括怎么进行变更请求，怎么进行变更批准等过程控制，还要考虑为处理变更估计留出时间等等方面的问题。这方面不遵循过程控制流程来走，很容易导致花大功夫补救的后果。
<p>&nbsp; 我们公司已经对变更没有做很好的控制，就吃了很多亏。我们项目组是驻客户所在地办公，开发人员经常接到客户电话来提出一些功能性的小变更，考虑到是小变更，又受&#8220;客户是上帝、提高客户满意度&#8221;等思想的影响，也就痛快答应，甚至当场修改程序发布。客户是高兴了，短期来看，效率高，而且还与客户打好关系。可长期来看，上此以往，这种行为就变成&#8220;没有跟客户计算成本&#8221;的花费，这还是小事，更严重的问题是，这种没有经过整体评估、影响分析、风险识别与分析的行为，有可能改了东家，拆坏了西家，到最后要花费更大的财力去弥补，吃力不讨好，更甚的后果是因为这些漏洞，迟迟拖延项目验收时间，从而导致项目失败。 </p>
<img src ="http://www.cppblog.com/epubcn/aggbug/42359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/epubcn/" target="_blank">深蓝色系统</a> 2008-02-01 17:16 <a href="http://www.cppblog.com/epubcn/archive/2008/02/01/42359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转载)WM_DESTROY 和 WM_NCDESTROY 消息之间有什么区别?</title><link>http://www.cppblog.com/epubcn/archive/2008/01/23/41732.html</link><dc:creator>深蓝色系统</dc:creator><author>深蓝色系统</author><pubDate>Wed, 23 Jan 2008 10:20:00 GMT</pubDate><guid>http://www.cppblog.com/epubcn/archive/2008/01/23/41732.html</guid><wfw:comment>http://www.cppblog.com/epubcn/comments/41732.html</wfw:comment><comments>http://www.cppblog.com/epubcn/archive/2008/01/23/41732.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/epubcn/comments/commentRss/41732.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/epubcn/services/trackbacks/41732.html</trackback:ping><description><![CDATA[<p>原文链接 <a href="http://blogs.msdn.com/oldnewthing/archive/2005/07/26/443384.aspx">What is the difference between WM_DESTROY and WM_NCDESTROY?</a><br>在窗口销毁时有两个紧密关联的 windows 消息, 就是 WM_DESTROY 和 WM_NCDESTROY. 它们有何区别? <br>区别就是 WM_DESTROY 消息是在窗口销毁动作序列中的开始被发送的, 而 WM_NCDESTROY 消息是在结尾. 这在你的窗口拥有子窗口时是个重大区别. 如果你有一个带子窗口的父窗口, 那么消息的发送序列 (在没有怪诞行为影响的前提下) 就像这样: <br>hwnd = parent, uMsg = WM_DESTROY<br>hwnd = child, uMsg = WM_DESTROY<br>hwnd = child, uMsg = WM_NCDESTROY<br>hwnd = parent, uMsg = WM_NCDESTROY<br>注意, 父窗口是在子窗口被销毁之前收到 WM_DESTROY 消息, 在子窗口被销毁之后收到 WM_NCDESTROY 消息. <br>两个销毁消息, 一个在开头, 一个在结尾, 这意味着, 对于你自己的模块, 你可以通过处理相应的消息来执行清理操作. <br>例如, 如果有些东西必须在开头清理, 那么你可以使用 WM_DESTROY 消息. <br>WM_NCDESTROY 消息是你窗口将会收到的最后一个消息 (在没有怪诞行为影响的前提下), 因此, 这里是做 "最终清理" 的最佳场所. <br>这就是为什么我们的 <a href="http://blogs.msdn.com/oldnewthing/archive/2005/04/22/410773.aspx">new scratch</a> 程序会一直等到 WM_NCDESTROY 销毁它的实例变量, 才会返回. <br>与这两个销毁消息配对的, 是 WM_CREATE 和 WM_NCCREATE 这两个类似的消息. 与 WM_NCDESTROY 是你窗口收到的最后一条消息类似, <br>WM_NCCREATE 消息是第一条消息, 这是一个创建你自己的实例变量的好地方. 需要注意的是, 如果你导致 WM_NCCREATE 消息返回失败, <br>那么所有你将收到的消息就只有 WM_NCDESTROY 了; 不会有 WM_DESTROY 消息了, 因为你根本就没有收到相应的 WM_CREATE 消息. <br>那么什么是我一直在暗示的 "怪诞行为" 呢? 下一次 (<a href="http://blogs.msdn.com/oldnewthing/archive/2005/07/27/443824.aspx">When the normal window destruction messages are thrown for a loop</a>) 我们再说. </p>
<img src ="http://www.cppblog.com/epubcn/aggbug/41732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/epubcn/" target="_blank">深蓝色系统</a> 2008-01-23 18:20 <a href="http://www.cppblog.com/epubcn/archive/2008/01/23/41732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转载)微软研发75条心得</title><link>http://www.cppblog.com/epubcn/archive/2008/01/23/41724.html</link><dc:creator>深蓝色系统</dc:creator><author>深蓝色系统</author><pubDate>Wed, 23 Jan 2008 08:55:00 GMT</pubDate><guid>http://www.cppblog.com/epubcn/archive/2008/01/23/41724.html</guid><wfw:comment>http://www.cppblog.com/epubcn/comments/41724.html</wfw:comment><comments>http://www.cppblog.com/epubcn/archive/2008/01/23/41724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/epubcn/comments/commentRss/41724.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/epubcn/services/trackbacks/41724.html</trackback:ping><description><![CDATA[<p><strong>[一．奠定基础]<br></strong>1. 任何不能改善产品的工作，都是浪费时间或是偏离方向。<br><strong>2. 领导者的任务是努力消除程序设计师工作上的一切障碍，让程序设计师全力专注在真正重要的工作─改善产品。</strong><br>3. 千万不要把程序设计师的时间浪费在改善产品以外的工作上。<br>4. 永远记得自己真正的目标，然后让团队用最有效又最愉快的方法把它完成。<br>5. 理清详细的项目目标，可以避免在不必要的工作上浪费时间。<br>6. 不要因为制定目标需要花很多时间，或是别人都没有做，就省略了目标的制定。制定明确详尽的目标所花的时间，绝对会让团队得到更大的好处。<br>7. 事前决定最合适的优先考虑顺序，以及各考虑点的质量规范，能够指引开发团队的工作。
<p><strong>[二．策略性的作业方式]</strong><br><strong>8. 错虫愈晚清除，时间花得愈多。毕竟，您得知道程序是怎么写的，才能判断那里出了错虫；刚写完的程序记忆犹新，一年前写的程序可能早就忘了</strong>。<br>9. 在开发的过程就立即除虫，可以让您早些学到经验，然后就不会再犯同样的错误；相反地，如果到了项目后期才发现，您可能已经犯过多次同样的错误而不自知。<br>10. 发现错虫而立即除错是一种缓冲器，提醒那些讲求快速而不够谨慎的程序设计师，以后多加小心。如果您坚持错虫全都清除了才能开发新的功能，就可以防止所有的程序处于半完成状态，因为错虫太多而使项目延误乃至无法推出；相反地，如果您允许错虫的存在，等于是埋下了项目失控的地雷，最后看似完成的项目，其实已经失控。<br>11. 若能保持没有任何错虫，您就能比较准确估出项目的完成时间。不必猜测3 2项功能和1 742个错虫共要花费多少时间，只要估算3 2项功能的工作时间就行了。更重要的时，万一到时候有些功能做不完，您可以做多少算多少，因为软件一直保持在无错误状态。<br>12. 不要把策略性工作方式当作训练的教条，应该向组员解释这些工作方式的内涵与用意。<br>13. 提出精确详尽的问题，可以引导出真正有效的策略性工作方式，帮助项目目标顺利完成。<br>14. 策略不是死的定律，要把它当作指导原则来活用。大部分的时候都应该遵循，但也有例外的时候。
<p><strong>[三．保持进度]</strong><br>15. 定期暂停手边的工作，然后往前思考，随时做必要的修正，以避免未来的大障碍。<br><strong>16. 有什么事情是我今天能做，而且可以帮助项目在未来几个月内顺利进行的？</strong><br>17. 不要浪费时间在错误的问题上，一定要先确定真正的问题在哪里，然后才去改正它。<br><strong>18. 人们开口要求的东西未必是他真正想要的。处理他的要求之前，请务必确定他究竟想要做什么。</strong><br>19. 绝对不要答应别人自己做不到的事情，这样对双方都有益无害。<br>20. 不要为了讨好别人而伤害双方的工作进程，您永远要根据自己的目标，做适当的决策。<br>21. 是您在为项目负责。不要让任何人的建议阻碍项目的进行，包括上级的建议。<br>22. 天下没有真正免费的软件<br>23. 应该开发策略上具有重要性的功能，而不是把媒体的评比项目都做齐全。<br>24. 软件产品的开发，不能只为了有趣、挑战性，或是够有个性够令人眩目。<br>25. 不要把时间浪费在无法改善产品的工作上，即使这么做在将来会有潜在的利益，也要与现在投入的时间成本做个衡量。
<p><strong>[四．走向极端的狂热]</strong><br>26. 确定您所要求的报告真的值得属下暂停工作，花那么多时间去写。<br>27. 利用项目检查报告来改进软件开发的工作程序。为了使报告发生作用，报告中必须确实描述我们这次解决问题的每一个详细步骤，以及将来应该如何运用这项新发现。<br>28. 请注意定期会议的价值，确定它值得每个人放下手上的工作。<br><strong>29. 召开任何会议之前，请确定本次会议的目的是什么，达成这个目的的条件是什么，然后，务必达到开会的目的。</strong><br>30. 试着排除不必要的后续工作。
<p><strong>[五．进度狂]</strong><br>31. 不要利用进程表来驱使项目的进行，这对小组的士气伤害太大了。<br>32. 让日程表维持适度的紧迫，但又是可以做到的，好让组员振奋、不松懈，专心致力于项目的推进。<br><strong>33. 绝对不要草率定出不可能的期限，导致组员为了赶进度而损害产品的质量。</strong><br>34. 把长期的大项目，分成几个完整而独立的小项目，各小项目必须有一个主题。<br>35. 为了保持创意的活力和团队士气，必须让每一个小项目都有令人兴奋的结果。<br><strong>36. 产品的质量远比遵守期限重要.</strong>
<p><strong>[六．学无止境]</strong><br><strong>37. 不要让程序设计师的学习停滞不前，要让程序设计师有机会磨练不同领域的技术，培养十八般武艺样样精通的组员。<br></strong>38. 训练新进程序设计师时，先培养他对整个公司所有项目都有价值的技术，然后才培养本项目独有的技术。<br>39. 不要舍不得放您最优秀的程序设计师到别的项目去。如果他在您的项目已经没有新的东西可学，为了公司和他个人的前途，您应该把他推荐到别的项目，让他的成长永不间断。<br>40. 确定每位组员、每两个月都有一项技术上进步。<br>41. 一发现某处需要改进，就立即采取更正的行动。<br><strong>42.不要用年终考评来订立学习目标，要利用年终考评来记录个人的成长。</strong><br>43. 绝对不要让组员一直做同样的工作，这样是限制了他的学习，使他停滞在原来的领<br>域。一旦程序设计师精通了某一个领域，就让他换别的领域做做看，永远让他们学习新的技术。<br>44. 各种技术的用途范围有所不同，有的技术在一般的项目都用得上，有的技术只有在特定性质的项目才用得上。当您训练您的组员时，必须让他们的技术能在公司发挥最大的用处，最好的办法就是，把应用范围最广的技术放在训练的最前期，应用范围最小的技术放在最后训练。<br><strong>45. 优秀的程序设计师是项目经理最需要的，所以经理们通常舍不得让自己手下功力最强的人到别组去，但是如果这位第一高手在本组内再也没有新东西可学时，经理就应该让他到别的项目去，一方面他个人可以重新开始另一次的成长，一方面让接替他的人学着承担重要的工作，最后公司的平均程序技术水准因而提升，对大家都很有好处。</strong><br>46. 为了确保每位程序设计师的技术都在稳定地进步，一定要让每个人有个努力的目标，最好的方法是把个人的成长和项目每两个月的阶段性目标相结合，这样一年就有至少六次的进步了。假定一位组员在公司待了五年，那么他就学了3 0种新技术、或是读了3 0本好书、或是1 5项技术加1 5本书，对他的工作能力影响多大啊。<br>47. 最好的成长目标是出于当时的需要。如果您发现有位组员工作缺乏效率，或总是在犯同样的错误，最好抓住机会立即为他立一个目标，并且要求他立刻开始改进。这种当时设立的目标让人印象深刻，又是马上寻求改善，效果通常会非常好。比起年终考评那种模模糊糊的建议，更能引起程序设计师的重视。
<p><strong>[七．态度问题]</strong><br>48. 要让每一位程序设计师都明白，写出零错误程序是很不容易的，所以应该多花功夫用各种方法做最彻底的测试。<br>49. 纠正程序设计师以为加除错码会花太多时间的观念，应该训练程序设计师第一个反应是考虑加上除错码是否有道理，第二是考虑加除错码是否符合项目的目标与工作的优先级。<br><strong>50. 当某人说&#8220;某件事不可能做到&#8221;时，他往往是错的</strong>。<br>51. 不要让凡事不能的态度阻碍了创新。<br>52. 使用者和程序的撰写者一样关心速度和品质的问题。<br>53. 不要让程序设计师以为使用者并不在乎软件的质量。<br>54. 不要给使用者次品，宁愿延期交货，务必追求质量完美。<br>55. 程序设计师必须经常以使用者的观点来看自己写的程序，程序设计师必须能体会使用者的感受。<br>56. 在包装盒里的每一件东西，都是产品的一部分。<br>57. 将程序的重用性当作优先考虑的目标之一，否则程序设计师将经常做重复的工作。<br>58. 充分利用现有资源或创造新资源，以便从每一项工作中获得更大的价值。程序代码的再利用，就是很好的例子，当然，还有其他的地方可以运用&#8220;杠杆原理&#8221;。<br>59. 如果您创造了一项资源，并且让别人知道，那么总有一天会派上用场。<br>60. 从您的每件工作中创造最大的资源，不管是利用现有的杠杆，或是创造新的杠杆。<br>61. 小心那种&#8220;太难了&#8221;、&#8220;太花时间&#8221;或是&#8220;太麻烦&#8221;的反射性反应。当您遇到别人有这种反应，请先问自己他有没有认真思考过这件事的重要性、以及是否符合项目目标，如果您认为他其实未经深思熟虑，只是直觉的反应，那您就应该把您的想法告诉他，请他重新评估，也许就会有公平的答案。<br>62. 人们遇到经验范围之外的事情，多少有恐惧感，就会认为&#8220;这完全不可能&#8221;而强烈反对。试着消除这种习惯性的反应，设法给组员灌输&#8220;只要花时间想想看，大部分的事情都做得到&#8221;的观念。您不妨以这个问题来对付那种&#8220;凡事不能&#8221;的态度：&#8220;我了解这是做不到的，但是&#8216;如果&#8217;做得到，那你会怎么做？&#8221;然后您就会发现惊人的转变，您马上就会听到组员七嘴八舌地说应该这样做、那样做，说的是他们刚刚坚持做不到的事情。这个&#8220;如果&#8221;把他们带离直觉的反应，带到全新的思考模式，这才是他们应该做的。<br><strong>63. 把使用者当作什么都不懂的外行人，是非常不好的观念。每当您发现有人表露出这种心理，一定要立即纠正，提醒他们使用者才是真正受产品好坏影响最深的人，他们和程序设计师一样关心软件的执行速度和质量。<br></strong>64. 杠杆原理是您最有用的观念，找到您工作中的杠杆，您可以为小组、项目、公司、甚至软件业创造无可限量的价值。无论如何，尽量利用资源并创造资源，这个原则是绝对错不了的。在您写程序的时候注意程序代码的共享性、训练组员的时候注意到他对公司的价值，即使是像函数命名这种小事，都有杠杆的存在。不管做任何事，都要想到&#8220;善用资源&#8221;，为未来做好准备。
<p><strong>[八．沉船的感觉]<br></strong>65. 如果进度发生落后，那表示有个地方出错了。您应该找出问题，并加以解决，不要一味要求组员加班，在问题没有解决之前，加班是没有用的。<br>66. 别误信加班等于增加生产能力，长期的加班只会伤害生产能力，对项目没有帮助。<br><strong>67. 周末是属于组员私人的时间，不是公司的。公司不应该以打败竞争对手为理由，要求员工周末加班。</strong><br><strong>68. 强调思考的重要性，而不是长时间工作。</strong><br>69. 训练开发小组懂得在正常工作时间内掌握好工作的效率，不要让他们超时工作，因为超时工作只是浪费时间的假面具。<br>70. 与程序设计师共同研拟出一份每日活动的时间表，把无法预期的临时公务变成固定时间处理的事情，并且把程序开发的工作放在最优先的地位，不要让其他次要的事情干扰到写程序。<br>71. 经常加班就是项目出问题的明显信号，也许是因为主管的观念错误或是目标不够清楚，不论是什么原因，项目经理绝对不能忽视这种现象，要对这个问题正确处理，项目经理必须协助组员在每周4 0小时的工作时间里，把事情做得更有效率。<br><strong>72. 我经常听到高层主管称赞组员每天为公司工作很长的时间：&#8220;您对公司的贡献值得嘉奖，做得很好！&#8221;这绝对是错误的信息，员工应该是因为工作做得好而受到称赞，而不是因为在办公室待得久，管理者不该把&#8220;生产效率&#8221;和&#8220;工作时间&#8221;混为一谈，有的人也许可以用更少的时间，完成两倍的工作呢。</strong><br>73. 为了让组员把办公时间用在正确的地方，并提高部门的工作效率，项目经理不但要为他们排除任何不必要的会议、报告和杂事，还要协助他们好好运用宝贵的上班时间。您应该协助组员安排适当的每日活动表，用一些小技巧，让组员有长段又不受干扰的时间，适合进行开发工作。<br>74. 如果您关心组员的生活，就不要让他们把全部的时间都投入在工作。每天只要确定他们卖力工作了八小时，就可以把他们赶出办公室了，当然这样做也许会有老板看不顺眼，但是如果您像我一样相信均衡、健康的生活是一切创意的原动力，就坚持这份理念吧！<br>75. 每周工作4 0小时并不是金科玉律，只不过是美国的传统，而软件开发项目大都以此为前提编定日程表。所以如果一个项目需要程序设计师每周工作40 小时以上才能赶上进度，就表示有问题，也许是日程表定得太乐观，也许是程序设计师需要再训练。不管怎么说，这个问题一定要认真解决，绝对不应该让程序设计师加班来弥补这个漏洞。</p>
<img src ="http://www.cppblog.com/epubcn/aggbug/41724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/epubcn/" target="_blank">深蓝色系统</a> 2008-01-23 16:55 <a href="http://www.cppblog.com/epubcn/archive/2008/01/23/41724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转载)程序员生产力的提高</title><link>http://www.cppblog.com/epubcn/archive/2008/01/23/41723.html</link><dc:creator>深蓝色系统</dc:creator><author>深蓝色系统</author><pubDate>Wed, 23 Jan 2008 08:54:00 GMT</pubDate><guid>http://www.cppblog.com/epubcn/archive/2008/01/23/41723.html</guid><wfw:comment>http://www.cppblog.com/epubcn/comments/41723.html</wfw:comment><comments>http://www.cppblog.com/epubcn/archive/2008/01/23/41723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/epubcn/comments/commentRss/41723.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/epubcn/services/trackbacks/41723.html</trackback:ping><description><![CDATA[<p>如何使生产力加倍呢？美国职业生涯规划与时间管理专家Brian Tracy，集20年实务工作经验与研究，发现能使你生产力加倍的7个工作秘诀：
<p><strong>一、全心投入工作（work harder at what you do）：</strong>当你工作时，一定要全心投入，不要浪费时间，不要把工作场所当成社交场合。光这个秘诀，如果你能长期实践，就能使你的生产力加倍。
<p><strong>二、工作步调快（work faster）：</strong>养成一种紧迫感，一次专心做一件事，并且用最快的速度完成，之后，立刻进入下一件工作。养成这习惯后，你会惊讶地发现，一天所能完成的工作量居然是如此地惊人。
<p><strong>三、专注于高附加值的工作（work on higher-value activities）：</strong>你要记住工作时数的多寡不见得与工作成果成正比。精明的老板或是上司关心的是你的工作数量及工作品质，工作时数并非重点。因此聪明的员工，会想办法找出对达成工作目标及绩效标准有帮助的活动，然后投入最多时间与心力在这些事情上面。投入的时间愈多，每分钟的生产力就愈高，工作绩效也就提高，自然赢得老板及上司的赏识与重用，加薪与升迁在望。
<p><strong>四、熟练工作（do things you are better at）：</strong>你找出最有价值的工作项目后，接着要想办法，通过不断学习、应用、练习，熟练所有工作流程与技巧，累积工作经验（一句话解决KNOW HOW的问题）。你的工作愈纯熟，工作所需的时间就愈短；你的技能愈熟练，生产力就提升得愈快。
<p><strong>五、集中处理（bunch your tasks）：</strong>一个有技巧的工作人，会把许多性质相近的工作或是活动，例如，收发E-MAIL、写信、填写工作报表、填写备忘录等等，集中在同一个时段来处理，这样会比一件一件分开在不同时段处理，节省一半以上的时间，同时也能提高效率与效能。
<p><strong>六、简化工作（simplify your work）：</strong>尽量简化工作流程，将许多分开的工作步骤加以整合，变成单一任务，以减少工作的复杂度，另外，运用授权或是外包的方式，避免把时间花费在低价值的工作上。
<p><strong>七、比别人工作时间长一些（work longer hours）：</strong>早一点起床，早点去上班，避开交通高峰；中午晚一点出去用餐，继续工作，避开排队用餐的人潮；晚上稍微留晚一些，直到交通高峰时间已过，再下班回家。如此一天可以比一般人多出2至3个小时的工作时间，而且不会影响正常的生活步调。善用这些多出来的时间，可以使你的生产力加倍，进而使你的收入加倍。一个成功的人，通常是一个行动派的人，一旦懂得提升生产力的方法，就会将这7个小秘诀，默记在心，不断地应用、练习，直到成为工作、生活的习惯为止。只要养成这个习惯，你的生产力一定会提高，收入也会加倍。</p>
<img src ="http://www.cppblog.com/epubcn/aggbug/41723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/epubcn/" target="_blank">深蓝色系统</a> 2008-01-23 16:54 <a href="http://www.cppblog.com/epubcn/archive/2008/01/23/41723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转载)用C++实现的加、减、乘、除表达式计算</title><link>http://www.cppblog.com/epubcn/archive/2008/01/23/41717.html</link><dc:creator>深蓝色系统</dc:creator><author>深蓝色系统</author><pubDate>Wed, 23 Jan 2008 07:03:00 GMT</pubDate><guid>http://www.cppblog.com/epubcn/archive/2008/01/23/41717.html</guid><wfw:comment>http://www.cppblog.com/epubcn/comments/41717.html</wfw:comment><comments>http://www.cppblog.com/epubcn/archive/2008/01/23/41717.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/epubcn/comments/commentRss/41717.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/epubcn/services/trackbacks/41717.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原帖地址：http://www.cppblog.com/jb8164/archive/2008/01/02/40211.html// 头文件 Calc.h#ifndef&nbsp;__CALC_H__#define&nbsp;__CALC_H__#include&nbsp;&lt;stack&gt;#define&nbsp;ascii_int(x)&nbsp;(x&nbsp;&gt;=&n...&nbsp;&nbsp;<a href='http://www.cppblog.com/epubcn/archive/2008/01/23/41717.html'>阅读全文</a><img src ="http://www.cppblog.com/epubcn/aggbug/41717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/epubcn/" target="_blank">深蓝色系统</a> 2008-01-23 15:03 <a href="http://www.cppblog.com/epubcn/archive/2008/01/23/41717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Type traits简单应用：__uuidof的模拟</title><link>http://www.cppblog.com/epubcn/archive/2008/01/21/41588.html</link><dc:creator>深蓝色系统</dc:creator><author>深蓝色系统</author><pubDate>Mon, 21 Jan 2008 13:29:00 GMT</pubDate><guid>http://www.cppblog.com/epubcn/archive/2008/01/21/41588.html</guid><wfw:comment>http://www.cppblog.com/epubcn/comments/41588.html</wfw:comment><comments>http://www.cppblog.com/epubcn/archive/2008/01/21/41588.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/epubcn/comments/commentRss/41588.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/epubcn/services/trackbacks/41588.html</trackback:ping><description><![CDATA[<p>在VC++中，__uuidof是一个扩展操作符用于取得组件或接口的uuid，在COM编程中经常用到。那么在其它编译器中我们如何实现这个很有用的功能呢？<br>方法也许不只一种，这介绍用type traits的方式来实现，为了简单起见，并不使用GUID结构来表示uuid以省去GUID的定义和其繁琐的初始化操作，这里用一个字符串来表示一个类的uuid，有点类似于COM编程中的ProgID（Programme ID，编程ID，COM编程中指表示接口或组件的容易记忆的名字，以下uuid都是指这个ID）<br>首先来定义一个模板类来存储uuid<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">typename&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;_UuidTraits<br><img id=Codehighlighter1_40_42_Open_Image onclick="this.style.display='none'; Codehighlighter1_40_42_Open_Text.style.display='none'; Codehighlighter1_40_42_Closed_Image.style.display='inline'; Codehighlighter1_40_42_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_40_42_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_40_42_Closed_Text.style.display='none'; Codehighlighter1_40_42_Open_Image.style.display='inline'; Codehighlighter1_40_42_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_40_42_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_40_42_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p>这个类没有任何实现，uuid数据将存储于其特化版本，看以下的代码<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;ClassA;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>template</span><span style="COLOR: #000000">&lt;&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>_UuidTraits</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">ClassA</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_45_88_Open_Image onclick="this.style.display='none'; Codehighlighter1_45_88_Open_Text.style.display='none'; Codehighlighter1_45_88_Closed_Image.style.display='inline'; Codehighlighter1_45_88_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_45_88_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_45_88_Closed_Text.style.display='none'; Codehighlighter1_45_88_Open_Image.style.display='inline'; Codehighlighter1_45_88_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_45_88_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_45_88_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;uuid&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ClassA</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;ClassA<br><img id=Codehighlighter1_104_131_Open_Image onclick="this.style.display='none'; Codehighlighter1_104_131_Open_Text.style.display='none'; Codehighlighter1_104_131_Closed_Image.style.display='inline'; Codehighlighter1_104_131_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_104_131_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_104_131_Closed_Text.style.display='none'; Codehighlighter1_104_131_Open_Image.style.display='inline'; Codehighlighter1_104_131_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_104_131_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_104_131_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">any&nbsp;code&nbsp;of&nbsp;ClassA</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;</span></div>
<p><br>现在我们可以通过 _UuidTraits&lt;TheClass&gt;::uuid 来取类ClassA的uuid来，方便使用我们定义一个宏<br>#define __uuidof(x) (_UuidTraits&lt;x&gt;::uuid)<br>但这样只实现了ClassA的uuid，如果为每个类都写一个_UuidTraits的特化版本有点累，但我们可以用宏来简化<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;DEFINE_UUID(x,&nbsp;uuidofx)&nbsp;\</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;x;&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>template</span><span style="COLOR: #000000">&lt;&gt;</span><span style="COLOR: #000000">&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>_UuidTraits</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">x</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;\<br><img id=Codehighlighter1_79_124_Open_Image onclick="this.style.display='none'; Codehighlighter1_79_124_Open_Text.style.display='none'; Codehighlighter1_79_124_Closed_Image.style.display='inline'; Codehighlighter1_79_124_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_79_124_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_79_124_Closed_Text.style.display='none'; Codehighlighter1_79_124_Open_Image.style.display='inline'; Codehighlighter1_79_124_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_79_124_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_79_124_Open_Text><span style="COLOR: #000000">{&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;uuid&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;#uuidofx;&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;&nbsp;\</span></div>
<p><br>这样我们就可以方便的为类定义uuid了，比如：<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">DEFINE_UUID(ClassB,&nbsp;&nbsp;ClassB)&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;ClassB<br><img id=Codehighlighter1_43_66_Open_Image onclick="this.style.display='none'; Codehighlighter1_43_66_Open_Text.style.display='none'; Codehighlighter1_43_66_Closed_Image.style.display='inline'; Codehighlighter1_43_66_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_43_66_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_43_66_Closed_Text.style.display='none'; Codehighlighter1_43_66_Open_Image.style.display='inline'; Codehighlighter1_43_66_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_43_66_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_43_66_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">any&nbsp;code&nbsp;of&nbsp;ClassB</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;</span></div>
<p><br>OK，现在试试__uuidof(ClassB)，应该返回字符串"ClassB"了。<br>还有一点要说明的是，为了能兼容UNICODE，可以定义两个版本的DEFINE_UUID：<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#ifdef&nbsp;UNICODE<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;DEFINE_UUID(x,&nbsp;uuidofx)&nbsp;\</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;x;&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>template</span><span style="COLOR: #000000">&lt;&gt;</span><span style="COLOR: #000000">&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>_UuidTraits</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">x</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;\<br><img id=Codehighlighter1_94_143_Open_Image onclick="this.style.display='none'; Codehighlighter1_94_143_Open_Text.style.display='none'; Codehighlighter1_94_143_Closed_Image.style.display='inline'; Codehighlighter1_94_143_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_94_143_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_94_143_Closed_Text.style.display='none'; Codehighlighter1_94_143_Open_Image.style.display='inline'; Codehighlighter1_94_143_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_94_143_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_94_143_Open_Text><span style="COLOR: #000000">{&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;wchar_t&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;uuid&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;L#uuidofx;&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#else</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;DEFINE_UUID(x,&nbsp;uuidofx)&nbsp;\</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;x;&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>template</span><span style="COLOR: #000000">&lt;&gt;</span><span style="COLOR: #000000">&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>_UuidTraits</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">x</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;\<br><img id=Codehighlighter1_234_279_Open_Image onclick="this.style.display='none'; Codehighlighter1_234_279_Open_Text.style.display='none'; Codehighlighter1_234_279_Closed_Image.style.display='inline'; Codehighlighter1_234_279_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_234_279_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_234_279_Closed_Text.style.display='none'; Codehighlighter1_234_279_Open_Image.style.display='inline'; Codehighlighter1_234_279_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_234_279_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_234_279_Open_Text><span style="COLOR: #000000">{&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;uuid&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;#uuidofx;&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#endif</span></div>
<p><br>这样在使用UNICODE字符编码编译时，__uuidof返回的就是unicode字符串了</p>
<img src ="http://www.cppblog.com/epubcn/aggbug/41588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/epubcn/" target="_blank">深蓝色系统</a> 2008-01-21 21:29 <a href="http://www.cppblog.com/epubcn/archive/2008/01/21/41588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载] 使用CDC的四个派生类：CClientDC,CPaintDC,CWindowDC,CMetaFileDC</title><link>http://www.cppblog.com/epubcn/archive/2008/01/20/41542.html</link><dc:creator>深蓝色系统</dc:creator><author>深蓝色系统</author><pubDate>Sun, 20 Jan 2008 14:13:00 GMT</pubDate><guid>http://www.cppblog.com/epubcn/archive/2008/01/20/41542.html</guid><wfw:comment>http://www.cppblog.com/epubcn/comments/41542.html</wfw:comment><comments>http://www.cppblog.com/epubcn/archive/2008/01/20/41542.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/epubcn/comments/commentRss/41542.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/epubcn/services/trackbacks/41542.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 【转自】http://blog.chinaunix.net/u/28371/showart.php?id=4046871．首先介绍一下什么是DC（设备描述表）Windows应用程序通过为指定设备（屏幕，打印机等）创建一个设备描述表（Device Context, DC）在DC表示的逻辑意义的&#8220;画布&#8221;上进行图形的绘制。DC是一种包含设备信息的数据结构，它包含了物理设备...&nbsp;&nbsp;<a href='http://www.cppblog.com/epubcn/archive/2008/01/20/41542.html'>阅读全文</a><img src ="http://www.cppblog.com/epubcn/aggbug/41542.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/epubcn/" target="_blank">深蓝色系统</a> 2008-01-20 22:13 <a href="http://www.cppblog.com/epubcn/archive/2008/01/20/41542.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载] 堆（heap）和栈(stack)的区别</title><link>http://www.cppblog.com/epubcn/archive/2008/01/20/41540.html</link><dc:creator>深蓝色系统</dc:creator><author>深蓝色系统</author><pubDate>Sun, 20 Jan 2008 14:02:00 GMT</pubDate><guid>http://www.cppblog.com/epubcn/archive/2008/01/20/41540.html</guid><wfw:comment>http://www.cppblog.com/epubcn/comments/41540.html</wfw:comment><comments>http://www.cppblog.com/epubcn/archive/2008/01/20/41540.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/epubcn/comments/commentRss/41540.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/epubcn/services/trackbacks/41540.html</trackback:ping><description><![CDATA[<p><strong>一、预备知识—程序的内存分配</strong></p>
<p>一个由C/C++编译的程序占用的内存分为以下几个部分:</p>
<ol>
    <li>栈区（stack）—由编译器自动分配释放，存放函数的参数值，局部变量的值等。其操作方式类似于数据结构中的栈。
    <li>堆区（heap）—一般由程序员分配释放，若程序员不释放，程序结束时可能由OS回收。注意它与数据结构中的堆是两回事，分配方式倒是类似于链表，呵呵。
    <li>全局区（静态区）（static）—全局变量和静态变量的存储是放在一块的，初始化的全局变量和静态变量在一块区域，未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
    <li>文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。
    <li>程序代码区—存放函数体的二进制代码。 </li>
</ol>
<p>&nbsp;</p>
<p><strong>二、例子程序</strong></p>
<p>这是一个前辈写的，非常详细。</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000">main.cpp</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">全局初始化区</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p1;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">全局未初始化区</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">main()<br><img id=Codehighlighter1_61_349_Open_Image onclick="this.style.display='none'; Codehighlighter1_61_349_Open_Text.style.display='none'; Codehighlighter1_61_349_Closed_Image.style.display='inline'; Codehighlighter1_61_349_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_61_349_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_61_349_Closed_Text.style.display='none'; Codehighlighter1_61_349_Open_Image.style.display='inline'; Codehighlighter1_61_349_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_61_349_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_61_349_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;b;栈<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;s[]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">abc</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">栈</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">栈</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p3</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">123456</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">123456\0在常量区，p3在栈上。</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">；&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">全局（静态）初始化区</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;p1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)malloc(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;p2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)malloc(</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">分配得来得10和20字节的区域就在堆区。</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;strcpy(p1,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">123456</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">123456\0放在常量区，编译器可能会将它与p3所向"123456"优化成一个地方。</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #000000">}</span></span></div>
<p>&nbsp;</p>
<p><strong>三、堆和栈的理论知识</strong></p>
<p><strong>2.1 申请方式<br></strong>stack:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由系统自动分配。例如，声明在函数中一个局部变量int b;系统自动在栈中为b开辟空间<br>heap:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需要程序员自己申请，并指明大小，在c中malloc函数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如p1=(char*)malloc(10);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在C++中用new运算符<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如p2=(char*)malloc(10);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但是注意p1、p2本身是在栈中的。
<p><strong>2.2 申请后系统的响应</strong><br>栈：只要栈的剩余空间大于所申请空间，系统将为程序提供内存，否则将报异常提示栈<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 溢出。<br>堆：首先应该知道操作系统有一个记录空闲内存地址的链表，当系统收到程序的申请时，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 会遍历该链表，寻找第一个空间大于所申请空间的堆结点，然后将该结点从空闲结点<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 链表中删除，并将该结点的空间分配给程序，另外，对于
<p>大多数系统，会在这块内存空间中的首地址处记录本次分配的大小，这样，代码中的delete语句才能正确的释放本内存空间。另外，由于找到的堆结点的大小不一定正好等于申请的大小，系统会自动的将多余的那部分重新放入空闲链表中。
<p><strong>2.3 申请大小的限制</strong><br>栈：在Windows下,栈是向低地址扩展的数据结构，是一块连续的内存的区域。这句话的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 意思是栈顶的地址和栈的最大容量是系统预先规定好的，在WINDOWS下，栈的大<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 小是2M（也有的说是1M，总之是一个编译时就确定的常数），如果申请的空间超<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 过栈的剩余空间时，将提示overflow。因此，能从栈获得的空间较小。<br>堆：堆是向高地址扩展的数据结构，是不连续的内存区域。这是由于系统是用链表来存<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 储的空闲内存地址的，自然是不连续的，而链表的遍历方向是由低地址向高地址。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 堆的大小受限于计算机系统中有效的虚拟内存。由此可见，堆获得的空间比较灵活，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 也比较大。
<p><strong>2.4申请效率的比较</strong><br>栈:由系统自动分配，速度较快。但程序员是无法控制的。<br>堆:是由new分配的内存，一般速度比较慢，而且容易产生内存碎片,不过用起来最方便.<br>&nbsp;&nbsp;&nbsp;&nbsp; 另外，在WINDOWS下，最好的方式是用Virtual Alloc分配内存，他不是在堆，也不是在&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; 栈,而是直接在进程的地址空间中保留一块内存，虽然用起来最不方便。但是速度快，<br>&nbsp;&nbsp;&nbsp;&nbsp; 也最灵活。
<p><strong>2.5 堆和栈中的存储内容</strong><br>栈：在函数调用时，第一个进栈的是主函数中后的下一条指令（函数调用语句的下一条可&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 执行语句）的地址，然后是函数的各个参数，在大多数的C编译器中，参数是由右向左<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 入栈的，然后是函数中的局部变量。注意静态变量是不入栈的。当本次函数调用结束<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 后，局部变量先出栈，然后是参数，最后栈顶指针指向最开始存的地址，也就是主函<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数中的下一条指令，程序由该点继续运行。<br>堆：一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。
<p><strong>2.6 存取效率的比较</strong>
<p>char s1[]="aaaaaaaaaaaaaaa";<br>char *s2="bbbbbbbbbbbbbbbbb";<br>aaaaaaaaaaa是在运行时刻赋值的；<br>而bbbbbbbbbbb是在编译时就确定的；<br>但是，在以后的存取中，在栈上的数组比指针所指向的字符串(例如堆)快。<br>比如：<br>#include<br>voidmain()<br>{<br>char a=1;<br>char c[]="1234567890";<br>char *p="1234567890";<br>a = c[1];<br>a = p[1];<br>return;<br>}<br>对应的汇编代码<br>10:a=c[1];<br>004010678A4DF1movcl,byteptr[ebp-0Fh]<br>0040106A884DFCmovbyteptr[ebp-4],cl<br>11:a=p[1];<br>0040106D8B55ECmovedx,dwordptr[ebp-14h]<br>004010708A4201moval,byteptr[edx+1]<br>004010738845FCmovbyteptr[ebp-4],al<br>第一种在读取时直接就把字符串中的元素读到寄存器cl中，而第二种则要先把指针值读到edx中，在根据edx读取字符，显然慢了。
<p><strong>2.7 小结<br></strong>堆和栈的区别可以用如下的比喻来看出：<br>使用栈就象我们去饭馆里吃饭，只管点菜（发出申请）、付钱、和吃（使用），吃饱了就走，不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作，他的好处是快捷，但是自由度小。使用堆就象是自己动手做喜欢吃的菜肴，比较麻烦，但是比较符合自己的口味，而且自由度大。</p>
<img src ="http://www.cppblog.com/epubcn/aggbug/41540.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/epubcn/" target="_blank">深蓝色系统</a> 2008-01-20 22:02 <a href="http://www.cppblog.com/epubcn/archive/2008/01/20/41540.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于VisualFC</title><link>http://www.cppblog.com/epubcn/archive/2008/01/17/41372.html</link><dc:creator>深蓝色系统</dc:creator><author>深蓝色系统</author><pubDate>Thu, 17 Jan 2008 14:07:00 GMT</pubDate><guid>http://www.cppblog.com/epubcn/archive/2008/01/17/41372.html</guid><wfw:comment>http://www.cppblog.com/epubcn/comments/41372.html</wfw:comment><comments>http://www.cppblog.com/epubcn/archive/2008/01/17/41372.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/epubcn/comments/commentRss/41372.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/epubcn/services/trackbacks/41372.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: courier new">前段时间偶然看到VisualFC这个东东，然后又到WINXGUI（<a href="http://www.winxgui.cn/">http://www.winxgui.cn/</a>）上看了看，似乎人气不是很高，或许跟许多人不怎么使用WTL这东东有关吧。</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: courier new">大概看了一下，似乎就是对WTL的一些东西的封装，并添加了可视化向导对话框，使用起来更方便，上手起来比较容易。但是我现在还没搞清楚他整个的目录结构。</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: courier new">先记录下来，有空的时候研究研究。:)<br></p>
<img src ="http://www.cppblog.com/epubcn/aggbug/41372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/epubcn/" target="_blank">深蓝色系统</a> 2008-01-17 22:07 <a href="http://www.cppblog.com/epubcn/archive/2008/01/17/41372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>