﻿<?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/returnnull/</link><description /><language>zh-cn</language><lastBuildDate>Mon, 13 Apr 2026 09:37:22 GMT</lastBuildDate><pubDate>Mon, 13 Apr 2026 09:37:22 GMT</pubDate><ttl>60</ttl><item><title>fatal error C1083: Cannot open include file: 'config-win.h' 终极解决方案</title><link>http://www.cppblog.com/returnnull/archive/2017/11/03/215325.html</link><dc:creator>修一居士</dc:creator><author>修一居士</author><pubDate>Fri, 03 Nov 2017 13:56:00 GMT</pubDate><guid>http://www.cppblog.com/returnnull/archive/2017/11/03/215325.html</guid><wfw:comment>http://www.cppblog.com/returnnull/comments/215325.html</wfw:comment><comments>http://www.cppblog.com/returnnull/archive/2017/11/03/215325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/returnnull/comments/commentRss/215325.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/returnnull/services/trackbacks/215325.html</trackback:ping><description><![CDATA[ 64位操作系统安装 MySQL-python-1.2.3.win 失败，提示 fatal error C1083: Cannot open include file: 'config-win.h'，网上方案均不可行，实际上只需要直接下载 MySQL-python-1.2.3.win-amd64-py2.7.exe 安装即可。下载地址请自行搜索。<img src ="http://www.cppblog.com/returnnull/aggbug/215325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/returnnull/" target="_blank">修一居士</a> 2017-11-03 21:56 <a href="http://www.cppblog.com/returnnull/archive/2017/11/03/215325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让Sublime Text2 支持Python编译</title><link>http://www.cppblog.com/returnnull/archive/2012/09/16/190910.html</link><dc:creator>修一居士</dc:creator><author>修一居士</author><pubDate>Sun, 16 Sep 2012 14:03:00 GMT</pubDate><guid>http://www.cppblog.com/returnnull/archive/2012/09/16/190910.html</guid><wfw:comment>http://www.cppblog.com/returnnull/comments/190910.html</wfw:comment><comments>http://www.cppblog.com/returnnull/archive/2012/09/16/190910.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/returnnull/comments/commentRss/190910.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/returnnull/services/trackbacks/190910.html</trackback:ping><description><![CDATA[1、增加windows环境变量以下路径<br /><div>D:\Python26;D:\Python26\Tools\Scripts;D:\Program Files\Sublime Text 2<br />2、注销并重新登录，使用命令行敲入python可显示出python的版本信息<br />3、使用ctrl+b 如果仍然未出现编译信息，要查看ctrl+&#183; &nbsp;是否有错误信息，将错误的插件remove掉</div><img src ="http://www.cppblog.com/returnnull/aggbug/190910.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/returnnull/" target="_blank">修一居士</a> 2012-09-16 22:03 <a href="http://www.cppblog.com/returnnull/archive/2012/09/16/190910.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初探ogre</title><link>http://www.cppblog.com/returnnull/archive/2007/07/28/28909.html</link><dc:creator>修一居士</dc:creator><author>修一居士</author><pubDate>Sat, 28 Jul 2007 14:47:00 GMT</pubDate><guid>http://www.cppblog.com/returnnull/archive/2007/07/28/28909.html</guid><wfw:comment>http://www.cppblog.com/returnnull/comments/28909.html</wfw:comment><comments>http://www.cppblog.com/returnnull/archive/2007/07/28/28909.html#Feedback</comments><slash:comments>20</slash:comments><wfw:commentRss>http://www.cppblog.com/returnnull/comments/commentRss/28909.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/returnnull/services/trackbacks/28909.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一直以来都说ogre渲染效率很高，最近想研究一下3d，就下来ogre的代码，看看有没有可能改改就能做游戏，没想到试了一个例子就被打击了，SkeletalAnimation 中将#define NUM_JAIQUAS 50 设为渲染50 个角色模型，渲染就只剩下4帧了。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我的机器配置还是不错的3.0的双核intel&nbsp; 2G的内存 GF7600 gs 的显卡。mmorpg中同屏100人以上是很平常的事情，4帧可真的是没法玩。</span> 
<img src ="http://www.cppblog.com/returnnull/aggbug/28909.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/returnnull/" target="_blank">修一居士</a> 2007-07-28 22:47 <a href="http://www.cppblog.com/returnnull/archive/2007/07/28/28909.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不得不看的人生12大领悟</title><link>http://www.cppblog.com/returnnull/archive/2007/07/25/28751.html</link><dc:creator>修一居士</dc:creator><author>修一居士</author><pubDate>Wed, 25 Jul 2007 03:55:00 GMT</pubDate><guid>http://www.cppblog.com/returnnull/archive/2007/07/25/28751.html</guid><wfw:comment>http://www.cppblog.com/returnnull/comments/28751.html</wfw:comment><comments>http://www.cppblog.com/returnnull/archive/2007/07/25/28751.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/returnnull/comments/commentRss/28751.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/returnnull/services/trackbacks/28751.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 10pt">1、父子二人经过五星级饭店门口，看到一辆十分豪华的进口轿车。儿子不屑地对他的父亲说：「坐这种车的人，肚子里一定没有学问！」父亲则轻描淡写地回答：「说这种话的人，口袋里一定没有钱！」&nbsp;<br><br>　　（你对事情的看法，是不是也反映出你内心真正的态度？）&nbsp;<br><br>2、晚饭后，母亲和女儿一块儿洗碗盘，父亲和儿子在客厅看电视。突然，厨房里传来打破盘子的响声，然后一片沉寂。是儿子望着他父亲，说道：「一定是妈妈打破的。」「你怎么知道？」「她没有骂人。」&nbsp;<br><br>　　（我们习惯以不同的标准来看人看己，以致往往是责人以严，待己以宽。）&nbsp;<br><br>3、有两个台湾观光团到日本伊豆半岛旅游，路况很坏，到处都是坑洞。其中一位导游连声抱歉，说路面简直像麻子一样。而另一个导游却诗意盎然地对游客说：诸位先生女士，我们现在走的这条道路，正是赫赫有名的伊豆迷人酒窝大道。」&nbsp;<br><br>　　（虽是同样的情况，然而不同的意念，就会产生不同的态度。思想是何等奇妙的事，如何去想，决定权在你。）&nbsp;<br><br>4、同样是小学三年级的学生，在作文中说他们将来的志愿是当小丑。中国的老师斥之为：「胸无大志，孺子不可教也！」外国的老师则会说：「愿你把欢笑带给全世界！」&nbsp;<br><br>　　（身为长辈的我们，不但容易要求多于鼓励，更狭窄的界定了成功的定义。）&nbsp;<br><br>5、在故宫博物院中，有一个太太不耐烦地对她先生说：「我说你为甚么走得这么慢。原来你老是停下来看这些东西。」&nbsp;<br><br>　　（有人只知道在人生的道路上狂奔，结果失去了观看两旁美丽花朵的机会。）&nbsp;<br><br>6、妻子正在厨房炒菜。丈夫在她旁边一直唠叨不停：慢些。小心！火太大了。赶快把鱼翻过来。快铲起来，油放太多了！把豆腐整平一下！「哎厎」妻子脱口而出，「我懂得怎样炒菜。」「你当然懂，太太，」丈夫平静地答道：「我只是要让你知道，我在开车时，你在旁边喋喋不休，我的感觉如何。」&nbsp;<br><br>　　（学会体谅他人并不困难，只要你愿意认真地站在对方的角度和立场看问题。）&nbsp;<br><br>7、理由充份:一辆载满乘客的公共汽车沿着下坡路快速前进着，有一个人後面紧紧地追赶着这辆车子。一个乘客从车窗中伸出头来对追车子的人说：&#8220;老兄！算啦，你追不上的！&#8221;&#8220;我必须追上它，&#8221;这人气喘吁吁地说：&#8220;我是这辆车的司机！&#8221;&nbsp;<br><br>　　(有些人必须非常认真努力，因为不这样的话，後果就十分悲惨了！然而也正因为必须全力以赴，潜在的本能和不为人知的特质终将充份展现出来。）&nbsp;<br><br>8、原来如此-甲：「新搬来的邻居好可恶，昨天晚上三更半夜、夜深人静之时跑来猛按我家的门铃。」乙：「的确可恶！你有没有马上报警？」甲：「没有。我当他们是疯子，继续吹我的小喇叭。」&nbsp;<br><br>　　（事出必有因，如果能先看到自己的不是，答案就会不一样在你面对冲突和争执时，先想一想是否心中有亏，或许很快就能释怀了。）&nbsp;<br><br>9、误会-某日，张三在山间小路开车，正当他悠哉地欣赏美丽风景时，突然迎面开来一辆货车，而且满囗黑牙的司机还摇下窗户对他大骂一声：&#8220;猪！&#8221;张三越想越纳闷，也越想越气，於是他也摇下车窗回头大骂：&#8220;你才是猪！&#8221;才刚骂完，他便迎头撞上一群过马路的猪。&nbsp;<br><br>　　（不要错误的诠释别人的好意，那只会让自己吃亏，并且使别人受辱。在不明所以之前，先学会按捺情绪，耐心观察，以免事後生发悔意。）&nbsp;<br><br>10、後生可畏-小男孩问爸爸：&#8220;是不是做父亲的总比做儿子的知道得多？&#8221;爸爸回答：&#8220;当然啦！&#8221;小男孩问：&#8220;电灯是谁发明的？&#8221;爸爸：&#8220;是爱迪生。&#8221;小男孩又问：&#8220;那爱迪生的爸爸怎麽没有发明电灯？&#8221;&nbsp;<br><br>　　（很奇怪，喜欢倚老卖老的人，特别容易栽跟斗。权威往往只是一个经不起考验的空壳子，尤其在现今这个多元开放的时代。）&nbsp;<br><br>11、不必紧张-小明洗澡时不小心吞下一小块肥皂，他的妈妈慌慌张张地打电话向家庭医生求助。医生说：&#8220;我现在还有几个病人在，可能要半小时後才能赶过去。&#8221;小明妈妈说：&#8220;在你来之前，我该做甚麽？&#8221;医生说：&#8220;给小明喝一杯白开水，然後用力跳一跳，你就可以让小明用嘴巴吹泡泡消磨时间了。&#8221;&nbsp;<br><br>　　（take&nbsp;it&nbsp;easy，放轻松放轻松些，生活何必太紧张？事情既然已经发生了，何不坦然自在的面对。担心不如宽心，穷紧张不如穷开心。）&nbsp;<br><br>12、钥匙-一把坚实的大锁挂在大门上，一根铁杆费了九牛二虎之力，还是无法将它撬开。钥匙来了，他瘦小的身子钻进锁孔，只轻轻一转，大锁就&#8220;啪&#8221;地一声打开了。铁杆奇怪地问：&#8220;为什麽我费了那麽大力气也打不开，而你却轻而易举地就把它打开了呢？&#8221;钥匙说：&#8220;因为我最了解他的心。&#8221;&nbsp;<br><br>　　（每个人的心，都像上了锁的大门，任你再粗的铁棒也撬不开。唯有关怀，才能把自己变成一只细腻的钥匙，进入别人的心中，了解别人。）</span> 
<img src ="http://www.cppblog.com/returnnull/aggbug/28751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/returnnull/" target="_blank">修一居士</a> 2007-07-25 11:55 <a href="http://www.cppblog.com/returnnull/archive/2007/07/25/28751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用匿名管道在父子进程间传递数据</title><link>http://www.cppblog.com/returnnull/archive/2007/05/11/23855.html</link><dc:creator>修一居士</dc:creator><author>修一居士</author><pubDate>Thu, 10 May 2007 16:24:00 GMT</pubDate><guid>http://www.cppblog.com/returnnull/archive/2007/05/11/23855.html</guid><wfw:comment>http://www.cppblog.com/returnnull/comments/23855.html</wfw:comment><comments>http://www.cppblog.com/returnnull/archive/2007/05/11/23855.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/returnnull/comments/commentRss/23855.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/returnnull/services/trackbacks/23855.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 利用匿名管道在父子进程间传递数据进程间传递数据有很多种方法，常用到的有命令行、共享内存、内存映射文件、剪贴板、windows消息、socket等。命令行的缺点是数据长度限制。Windows2000只能传递256个字节，内存映射文件、共享内存都需要一些进程同步才能很好的配合读写数据，剪贴板可能会被其他进程擦数数据。当多开的时候很难控制进程间的对应关系。一种解决方案是生成随机命名的同步...&nbsp;&nbsp;<a href='http://www.cppblog.com/returnnull/archive/2007/05/11/23855.html'>阅读全文</a><img src ="http://www.cppblog.com/returnnull/aggbug/23855.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/returnnull/" target="_blank">修一居士</a> 2007-05-11 00:24 <a href="http://www.cppblog.com/returnnull/archive/2007/05/11/23855.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让输入法跟随你指定的位置</title><link>http://www.cppblog.com/returnnull/archive/2007/05/11/23853.html</link><dc:creator>修一居士</dc:creator><author>修一居士</author><pubDate>Thu, 10 May 2007 16:16:00 GMT</pubDate><guid>http://www.cppblog.com/returnnull/archive/2007/05/11/23853.html</guid><wfw:comment>http://www.cppblog.com/returnnull/comments/23853.html</wfw:comment><comments>http://www.cppblog.com/returnnull/archive/2007/05/11/23853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/returnnull/comments/commentRss/23853.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/returnnull/services/trackbacks/23853.html</trackback:ping><description><![CDATA[<font face=Verdana>用DX自绘Edit控件往往没有真是的EDIT窗口存在，所以输入法窗口无法跟随，这里给出一个解决方案<br><br>计算当前光标的位置 <br>用API ImmSetCompositionWindow指定IME 窗口到当前光标位置<br>在WM_KEYDOWN消息中处理<br><br>以下是代码:<br><br>------------------------------------------------------------------------------------------------<br>
<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">int</span><span style="COLOR: #000000">&nbsp;nSelStart&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;nSelEnd&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetSel(&nbsp;nSelStart,&nbsp;nSelEnd&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>CPoint&nbsp;pntCursor&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">PosFromChar(&nbsp;nSelEnd&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;pntCursor.x&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_143_237_Open_Image onclick="this.style.display='none'; Codehighlighter1_143_237_Open_Text.style.display='none'; Codehighlighter1_143_237_Closed_Image.style.display='inline'; Codehighlighter1_143_237_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_143_237_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_143_237_Closed_Text.style.display='none'; Codehighlighter1_143_237_Open_Image.style.display='inline'; Codehighlighter1_143_237_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_143_237_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_143_237_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>nSelEnd&nbsp;</span><span style="COLOR: #000000">-=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;nSelEnd&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;)<br><img id=Codehighlighter1_178_193_Open_Image onclick="this.style.display='none'; Codehighlighter1_178_193_Open_Text.style.display='none'; Codehighlighter1_178_193_Closed_Image.style.display='inline'; Codehighlighter1_178_193_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_178_193_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_178_193_Closed_Text.style.display='none'; Codehighlighter1_178_193_Open_Image.style.display='inline'; Codehighlighter1_178_193_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span id=Codehighlighter1_178_193_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_178_193_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>nSelEnd&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>pntCursor&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">PosFromChar(&nbsp;nSelEnd&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>HIMC&nbsp;hImc&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ImmGetContext(m_hWnd);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>COMPOSITIONFORM&nbsp;form;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>form.dwStyle&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CFS_RECT;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>form.ptCurrentPos&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CPoint(pntCursor.x,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>form.rcArea&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CRect(pntCursor.x,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,pntCursor.x</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">300</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>ImmSetCompositionWindow(hImc,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">form);</span></div>
</font>
<img src ="http://www.cppblog.com/returnnull/aggbug/23853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/returnnull/" target="_blank">修一居士</a> 2007-05-11 00:16 <a href="http://www.cppblog.com/returnnull/archive/2007/05/11/23853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Dump调用堆栈的原理以及异常信息的反馈</title><link>http://www.cppblog.com/returnnull/archive/2007/03/27/20714.html</link><dc:creator>修一居士</dc:creator><author>修一居士</author><pubDate>Tue, 27 Mar 2007 08:32:00 GMT</pubDate><guid>http://www.cppblog.com/returnnull/archive/2007/03/27/20714.html</guid><wfw:comment>http://www.cppblog.com/returnnull/comments/20714.html</wfw:comment><comments>http://www.cppblog.com/returnnull/archive/2007/03/27/20714.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/returnnull/comments/commentRss/20714.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/returnnull/services/trackbacks/20714.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center" align="center">
				<strong style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="font-size: 22pt">Dump</span>
				</strong>
				<strong style="mso-bidi-font-weight: normal">
						<span style="font-size: 22pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">调用堆栈的原理以及异常信息的反馈</span>
				</strong>
				<strong style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="font-size: 22pt">
								<!--?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?-->
								<o:p>
								</o:p>
						</span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
				<strong style="mso-bidi-font-weight: normal">
						<span style="font-size: 14pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">动机：</span>
				</strong>
				<strong style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="font-size: 14pt">
								<o:p>
								</o:p>
						</span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left">
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">在游戏开发过程中，我们利用</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">QA</span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">部门来做产品的质量保证，尽可能将绝大部分错误消化在内部，保证游戏的版本质量，但是</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">QA</span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">部门毕竟有他的局限性，尽管经过严格的测试也很难保证将所有的问题一网打尽．</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>&nbsp;</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left">
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">通过在</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Log</span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">中转储的错误信息，我们可以进一步找出问题，但是</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Log</span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">文件产生在终端，我们拿到的也仅仅是公司内部测试部门产生的</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Log</span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">文件，显然公司内部得到的信息是很有限的，如果能从玩家那里拿到异常信息，我们才能最快的去解决问题，尽可能在错误产生重大影响之前将其解决，所以我们有必要从被动的获取异常信息，转为主动去获取．</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>&nbsp;</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
				<strong style="mso-bidi-font-weight: normal">
						<span style="font-size: 14pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可行性</span>
				</strong>
				<strong style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="font-size: 14pt">:<o:p></o:p></span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
				</span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">在错误发生时</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Dump</span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">调用堆栈，可以让我们知道错误发生的位置，这比已往普通的</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">LOG</span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">更加有效的多．我们可以将出错的堆栈地址反馈回来．这一切在终端出现异常的时候自动进行．</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Windows</span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">操作系统提供的</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">SEH</span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">结构化异常机制可能让我们在程序崩溃的瞬间处理这些事情．</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>&nbsp;</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
				<strong style="mso-bidi-font-weight: normal">
						<span style="font-size: 14pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">效率问题</span>
				</strong>
				<strong style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="font-size: 14pt">:<o:p></o:p></span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SEH</span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">是</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">windows</span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">的异常机制，除非在编译时候特别指定不使用，否则总有默认的</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">SEH</span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">处理机制，</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">kernel32.dll </span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">中有默认的</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">SEH</span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">处理接口，当我们需要自己处理异常的时候，我们的处理点会挂接在异常处理链的最前端，这种链类似</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Hook</span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">的链．链的头部放在</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">fs[0] </span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">的位置．也就是说效率的问题是可以不必考虑，</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>&nbsp;</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>&nbsp;</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
				<strong style="mso-bidi-font-weight: normal">
						<span style="font-size: 14pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">具体实现</span>
				</strong>
				<strong style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="font-size: 14pt">:<o:p></o:p></span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
				</span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">通过阅读反汇编代码可以了解函数调用过程中堆栈的结构</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">:<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>1 </span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">函数调用时</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">CALL </span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">将下一行指令地址压入堆栈</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>2 </span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">函数运行第一行会将</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">EBP</span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">压入堆栈</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>3 </span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">保存当前堆栈地址到</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">EBP (mov ebp,esp)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
				</span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">再遇到</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">call</span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">时从第一步执行，所以每次第二步压入堆栈的都是上一层函数调用的</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">ESP</span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">地址，而这个地址</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">+4 </span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">字节偏移则是当前调用函数返回后的下一条指令，也就是上一层函数的地址，所以我们只要知道当前函数的</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">EBP</span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">值</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">(</span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">也就是当前函数的栈顶</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">) </span>
				<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">就能够遍历得到所有调用堆栈层次．</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">
				<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height="542" alt="dumpebp.jpg" src="http://www.cppblog.com/images/cppblog_com/returnnull/dumpebp.jpg" width="640" border="0" /><br /><br /><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">我们将</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">windows SEH </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">结构化异常引入后，可以在异常发生的时候得到当前的</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">EBP</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">值，从而通过这个值得到整个调用堆栈的地址．</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">在发布工程的时候，我们只需要生成</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">map</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">文件，就可以通过这个地址得到崩溃位置．使用</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">HTTP GET 或POST</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">方式可以将我们所需要的崩溃信息提交到我们指定的网站．这种方式只是通过</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">URL</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">参数来提交数据，只需要使用</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">API<strong style="mso-bidi-font-weight: normal"><span style="mso-spacerun: yes">&nbsp;</span></strong></span><strong><span lang="EN-US" style="color: black; font-family: Verdana; mso-bidi-font-size: 10.5pt; mso-font-kerning: 18.0pt">InternetOpenUrl</span></strong><span style="color: black; font-family: 宋体; mso-bidi-font-weight: bold; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-size: 10.5pt; mso-font-kerning: 18.0pt">就可以</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">很方便的将信息提交．此外如果不使用</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">HTTP</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">方式，我们也可以在这个时候创建新的</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">socket </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">对指定的服务器进行连接来传输数据．</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p><div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;TCHAR&nbsp;hdrs[]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_T(</span><span style="color: #000000">"</span><span style="color: #000000">Content-Type:&nbsp;application/x-www-form-urlencoded</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;TCHAR</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;accept</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_T(</span><span style="color: #000000">"</span><span style="color: #000000">Accept:&nbsp;*/*</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;static TCHAR action[]=_T(<span style="color: #000000">"datecomit</span><span style="color: #000000">.aspx</span><span style="color: #000000">"</span><span style="color: #000000">);//预提交的页面<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static TCHAR server[]=_T(<span style="color: #000000">"</span><span style="color: #000000">192.168.9.119</span><span style="color: #000000">"</span><span style="color: #000000">);//提交的server地址</span><br /></span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;TCHAR&nbsp;frmdata[</span><span style="color: #000000">1024</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">{</span><span style="color: #000000">0</span><span style="color: #000000">};&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;_tcscpy(frmdata,_T("message=this is a test message");&nbsp;<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;//提交数据, message为提交名字&nbsp;&nbsp;&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">//</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;clarity,&nbsp;</span><span style="color: #0000ff">error</span><span style="color: #000000">-</span><span style="color: #000000">checking&nbsp;has&nbsp;been&nbsp;removed&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;HINTERNET&nbsp;hSession&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;InternetOpen(</span><span style="color: #000000">"</span><span style="color: #000000">MyAgent</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;INTERNET_OPEN_TYPE_PRECONFIG,&nbsp;</span><span style="color: #0000ff">NULL</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">NULL</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;HINTERNET&nbsp;hConnect&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;InternetConnect(hSession,&nbsp;server</span><span style="color: #000000">,&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;INTERNET_DEFAULT_HTTP_PORT,&nbsp;</span><span style="color: #0000ff">NULL</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">NULL</span><span style="color: #000000">,&nbsp;INTERNET_SERVICE_HTTP,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;HINTERNET&nbsp;hRequest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;HttpOpenRequest(hConnect,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">POST</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;action</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">NULL</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">NULL</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">accept,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;HttpSendRequest(hRequest,&nbsp;hdrs,&nbsp;strlen(hdrs),&nbsp;frmdata,&nbsp;strlen(frmdata));&nbsp;</span></div><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt">&nbsp;</p></o:p></span><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">此后我们只需要定期观察所提交的内容，便可以立即得知是否有异常出现．根据同一异常出现的几率可以得知是否是致命的错误，是否需要紧急更新．</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p>&nbsp;<br /></o:p></span></p><br /><!--?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /?--><v:line id="_x0000_s1055" style="z-index: 1; left: 0px; position: absolute; text-align: left" from="221.1pt,300.7pt" to="302.1pt,300.75pt"></v:line></span>
		</span><img src ="http://www.cppblog.com/returnnull/aggbug/20714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/returnnull/" target="_blank">修一居士</a> 2007-03-27 16:32 <a href="http://www.cppblog.com/returnnull/archive/2007/03/27/20714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用汇编调用成员函数</title><link>http://www.cppblog.com/returnnull/archive/2007/03/12/19667.html</link><dc:creator>修一居士</dc:creator><author>修一居士</author><pubDate>Mon, 12 Mar 2007 15:05:00 GMT</pubDate><guid>http://www.cppblog.com/returnnull/archive/2007/03/12/19667.html</guid><wfw:comment>http://www.cppblog.com/returnnull/comments/19667.html</wfw:comment><comments>http://www.cppblog.com/returnnull/archive/2007/03/12/19667.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/returnnull/comments/commentRss/19667.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/returnnull/services/trackbacks/19667.html</trackback:ping><description><![CDATA[
		<p>成员函数的调用是编译器内部使用的 __thiscall 即需要this指针,<br />所以我们调用成员函数必须满足的条件是<br />1 需要this指针,<br />2 成员函数有固定的函数地址<br /><br />先看条件 1  <br />this指针是在函数调用前用ECX寄存器传入的,<br />所以我们只需要提前讲this指针赋值给ECX即可<br /><br />条件2 <br />成员函数是有固定的地址的,也就是说我们可以直接调用,不过大多数情况下因为要访问成员变量,所以如果没有this指针,会在访问时产生异常.对于不需要this指针的成员函数可以正常调用.<br />如类 CTest</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">class CTest<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000">:<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> CTest() : m_nData (</span>
				<span style="COLOR: #000000">5</span>
				<span style="COLOR: #000000">){}<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> GetNum(){reutrn </span>
				<span style="COLOR: #000000">3</span>
				<span style="COLOR: #000000">;]<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> GetAmount(){return </span>
				<span style="COLOR: #000000">2</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">+</span>
				<span style="COLOR: #000000"> m_nData;}<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000">:<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> </span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> m_nData;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />};<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #000000">//</span>
				<span style="COLOR: #000000">可以这样调用GetNum<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />return ((CTest</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">)</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">)</span>
				<span style="COLOR: #000000">-&gt;</span>
				<span style="COLOR: #000000">GetNum();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
		</div>
		<br />这两个条件都可以满足,所以代码如下:<br /><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">typedef </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> (CTest::</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">GETAMOUNT)();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />void Process(CTest</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"> t , GETAMOUNT GetAmont)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> nResult </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  __asm{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />     mov ecx,[t]      ;传入this指针<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />     </span><span style="COLOR: #0000ff">call</span><span style="COLOR: #000000"> GetAmont    ;调用成员函数<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />     mov nResult, eax ;返回值在EAX中<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        }<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">nResult</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> argv[])<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  CTest test;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  Process(test, </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">CTest::GetAmount);    <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />  return </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}    <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><img src ="http://www.cppblog.com/returnnull/aggbug/19667.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/returnnull/" target="_blank">修一居士</a> 2007-03-12 23:05 <a href="http://www.cppblog.com/returnnull/archive/2007/03/12/19667.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IRQ参照</title><link>http://www.cppblog.com/returnnull/archive/2007/02/02/18282.html</link><dc:creator>修一居士</dc:creator><author>修一居士</author><pubDate>Fri, 02 Feb 2007 14:47:00 GMT</pubDate><guid>http://www.cppblog.com/returnnull/archive/2007/02/02/18282.html</guid><wfw:comment>http://www.cppblog.com/returnnull/comments/18282.html</wfw:comment><comments>http://www.cppblog.com/returnnull/archive/2007/02/02/18282.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/returnnull/comments/commentRss/18282.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/returnnull/services/trackbacks/18282.html</trackback:ping><description><![CDATA[IRQ全称为Interrupt Request，即是“中断请求”的意思（以下使用IRQ称呼）。IRQ的作用就是在我们所用的电脑中，执行硬件中断请求的动作，用来停止其相关硬件的工作状态，比如我们在打印一份图片，在打印结束时就需要由系统对打印机提出相应的中断请求，来以此结束这个打印的操作。在每台电脑的系统中，是由一个中断控制器8259或是8259A的芯片（现在此芯片大都集成到其它的芯片内）来控制系统中每个硬件的中断控制。目前共有16组IRQ，去掉其中用来作桥接的一组IRQ，实际上只有15组IRQ可供硬件调用。这16组IRQ的主要用途如下表： <br /><br />IRQ编号 <br />设备名称 <br />用途 <br /><br />IRQ0 <br />Time <br />电脑系统计时器 <br /><br />IRQ1 <br />KeyBoard <br />键盘 <br /><br />IRQ2 <br />Redirect IRQ9 <br />与IRQ9相接，MPU-401 MDI使用该IRQ <br /><br />IRQ3 <br />COM2 <br />串口设备 <br /><br />IRQ4 <br />COM1 <br />串口设备 <br /><br />IRQ5 <br />LPT2 <br />建议声卡使用该IRQ <br /><br />IRQ6 <br />FDD <br />软驱传输控制用 <br /><br />IRQ7 <br />LPT1 <br />打印机传输控制用 <br /><br />IRQ8 <br />CMOS Alert <br />即时时钟 <br /><br />IRQ9 <br />Redirect IRQ2 <br />与IRQ2相接；可设定给其它硬件使用 <br /><br />IRQ10 <br />Reversed <br />建议保留给网卡使用该IRQ <br /><br />IRQ11 <br />Reversed <br />建议保留给AGP显卡使用 <br /><br />IRQ12 <br />PS/2Mouse <br />接PS/2鼠标，若无也可设定给其他硬件使用 <br /><br />IRQ13 <br />FPU <br />协处理器用，例如FPU（浮点运算器） <br /><br />IRQ14 <br />Primary IDE <br />主硬盘传输控制用 <br /><br />IRQ15 <br />Secondary Ide <br />从硬盘传输控制用 <img src ="http://www.cppblog.com/returnnull/aggbug/18282.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/returnnull/" target="_blank">修一居士</a> 2007-02-02 22:47 <a href="http://www.cppblog.com/returnnull/archive/2007/02/02/18282.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windbg调试Release版exe .dll .ocx 等</title><link>http://www.cppblog.com/returnnull/archive/2007/02/02/18275.html</link><dc:creator>修一居士</dc:creator><author>修一居士</author><pubDate>Fri, 02 Feb 2007 07:47:00 GMT</pubDate><guid>http://www.cppblog.com/returnnull/archive/2007/02/02/18275.html</guid><wfw:comment>http://www.cppblog.com/returnnull/comments/18275.html</wfw:comment><comments>http://www.cppblog.com/returnnull/archive/2007/02/02/18275.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/returnnull/comments/commentRss/18275.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/returnnull/services/trackbacks/18275.html</trackback:ping><description><![CDATA[
		<span class="tpc_content">
				<font size="2">Windbg调试Release版exe .dll .ocx 等 (转)<br />v0.1 2006-6-1(儿童节)<br />1.生成符号信息<br />更改Relase版的设置(2处):<br />一、Project Setting -&gt;C/C++<br />Debug info:<br />选择Program Database<br />二、Project Setting -&gt;Link<br />选中Generate debug info<br />重新编译<br />2.安装Windbg<br />下载安装最新的Windbg<br /></font>
				<a href="http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx" target="_blank">
						<font size="2">http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx</font>
				</a>
				<br />
				<font size="2">3.设定环境变量<br />对于user32.dll等系统文件,Windbg可以自动从微软网站下载所需的符号信息.我们只需设定_NT_SYMBOL_PATH<br />这个环境变量告诉Winddbg.方法如下:<br />我的电脑&gt;右键菜单&gt;属性&gt;高级选项卡&gt;环境变量&gt;系统变量&gt;新建<br />变量名: _NT_SYMBOL_PATH<br />    变量值:SRV*F:\websymbols*</font>
				<a href="http://msdl.microsoft.com/download/symbols" target="_blank">
						<font size="2">http://msdl.microsoft.com/download/symbols</font>
				</a>
				<br />
				<font size="2">解释一下: F:\websymbols用来存储系统符号.你可以指定其他的路径.Windbg会自动创建该文件夹<br />4.设定符号路径<br />新建一个文件夹,譬如C:\MyAppSymbols<br />将第一步中生成的Release目录下&lt;youapp&gt;.pdb文件拷贝到该文件夹,该pdb文件包含了调试所需的符号信息.<br />打开Windbg,选择File&gt;Symbol file path&gt;将C:\MyAppSymbols路径添加进去<br />5.调试程序<br />选择 File &gt; Open Executable 然后选择你需要调试的Exe文件,就可以调试了,其他操作和VC6差不多.</font>
		</span>
		<br />
<img src ="http://www.cppblog.com/returnnull/aggbug/18275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/returnnull/" target="_blank">修一居士</a> 2007-02-02 15:47 <a href="http://www.cppblog.com/returnnull/archive/2007/02/02/18275.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>