﻿<?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++博客-曲径通幽-随笔分类-Windows Generic</title><link>http://www.cppblog.com/chinloon/category/14089.html</link><description>programming_with_fun();</description><language>zh-cn</language><lastBuildDate>Tue, 03 Jul 2012 23:35:07 GMT</lastBuildDate><pubDate>Tue, 03 Jul 2012 23:35:07 GMT</pubDate><ttl>60</ttl><item><title>Windows下编译 libevent 64位静态库</title><link>http://www.cppblog.com/chinloon/archive/2012/06/26/180322.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Tue, 26 Jun 2012 06:54:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2012/06/26/180322.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/180322.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2012/06/26/180322.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/180322.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/180322.html</trackback:ping><description><![CDATA[按照libevent的文档，使用VC的nmake -f Makefile.nmake即可编译32位release模式。<br />因为项目中要求编译64位的版本，需要在Makefile.nmake中添加一个LIBFLAGS选项 /MACHINE:X64<br />如果要加调试信息，可以在 CFLAGS中加入/Zi，32位加调试选项是 CFLAGS中加/ZI，当然要调整优化选项/Ox<img src ="http://www.cppblog.com/chinloon/aggbug/180322.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2012-06-26 14:54 <a href="http://www.cppblog.com/chinloon/archive/2012/06/26/180322.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>再遇 SQLITE_BUSY</title><link>http://www.cppblog.com/chinloon/archive/2012/06/06/177803.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Wed, 06 Jun 2012 08:35:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2012/06/06/177803.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/177803.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2012/06/06/177803.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/177803.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/177803.html</trackback:ping><description><![CDATA[记得以前解决过这个问题，现在帮助同事查BUG的时候，再次遇到，记录一下省的下次再苦苦回忆。<br />遇到这个问题，一般而言是3种情况造成：<br />1) 其他线程、进程正在执行一次写操作<br />&nbsp; &nbsp; 根据SQLITE文档，所有写操作(当然SELECT不算写操作)，SQLITE内部都会自动添加事务，这样在线程同时写有依赖关系的表的时候，自然会发生冲突<br />2) 当前SQLITE被&#8220;BEGIN TRANSACTION&#8221; lock住了，这个问题其实包含了1)中的隐形调用，另外别忘了自己的代码一定要在执行完BEGIN 后 COMMIT<br />3) 有statement对象未finalize，且未reset(出错时)<br />&nbsp; &nbsp; 这个情况占多数，我项目中遇到两次都是这个情况，<br /><div style="text-align: justify;">&nbsp; &nbsp; 当然，要注意即使自己未直接调用 prepare-step-finalize，在某些API执行的时候会隐式调用(比如sqlite3_exec)，当然这种情况一般会归在1)里</div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div style="text-align: justify;">&nbsp;&nbsp;&nbsp;</div></blockquote><img src ="http://www.cppblog.com/chinloon/aggbug/177803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2012-06-06 16:35 <a href="http://www.cppblog.com/chinloon/archive/2012/06/06/177803.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c/c++ 可变参数在函数中的传递</title><link>http://www.cppblog.com/chinloon/archive/2012/06/05/177672.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Tue, 05 Jun 2012 09:53:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2012/06/05/177672.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/177672.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2012/06/05/177672.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/177672.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/177672.html</trackback:ping><description><![CDATA[@note: 只在windows中测试，未在linux上跑过<br />
方法一： 通过宏传递<br />
例如<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->1&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;myprintf(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;format,&nbsp;);<br />
2&nbsp;<br />
3&nbsp;#ifndef&nbsp;PASS_ARGS<br />
4&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;PASS_ARGS(_fmt,)&nbsp;\<br />
5&nbsp;&nbsp;&nbsp;myprintf(fmt,__VA_ARGS__)<br />
6&nbsp;<span style="color: #0000FF; ">#endif</span></div>
<br />
这种方式最简单最直接，但不利于函数的封装调用。<br />
<br />
方法二： 通过函数传递<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->&nbsp;2&nbsp;<br />
&nbsp;3&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;myprintf(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;fmt,&nbsp;)<br />
&nbsp;4&nbsp;{<br />
&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;va_list&nbsp;args;<br />
&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;va_start(args,&nbsp;fmt);<br />
&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myprintf_internal(fmt,&nbsp;args);<br />
&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;va_end(args);<br />
&nbsp;9&nbsp;}</div>
<span style="font-size: small; ">这种方法可以在函数内传递 va_list</span><br />
<span><font size="2"><br />
至于 myprintf(const char*, ...) 传给 myprintf_internal(const char*, ...)这种方式，貌似只能通过循环解析出实参个数和内容，再传递给下一个函数，感觉上这样做可能会存在性能损耗</font></span><img src ="http://www.cppblog.com/chinloon/aggbug/177672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2012-06-05 17:53 <a href="http://www.cppblog.com/chinloon/archive/2012/06/05/177672.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windbg open &amp; read dump file</title><link>http://www.cppblog.com/chinloon/archive/2012/03/30/169514.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Fri, 30 Mar 2012 06:30:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2012/03/30/169514.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/169514.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2012/03/30/169514.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/169514.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/169514.html</trackback:ping><description><![CDATA[在工作中遇到windbg需要打开mini dump文件，MARK一下。<br /><span style="background-color: #eeeeee; font-size: 13px; ">!</span><span style="style=&quot;color:"  #000000;="" background-color:=""  #eeeeee;="" font-size:=""  13px;="" "="">analyze&nbsp;</span><span style="color: #000000;background-color: #eeeeee; font-size: 13px; ">-</span><span style="color: #000000;" background-color:=""  #eeeeee;="" font-size:=""  13px;="" "="">v</span>&nbsp;<img src ="http://www.cppblog.com/chinloon/aggbug/169514.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2012-03-30 14:30 <a href="http://www.cppblog.com/chinloon/archive/2012/03/30/169514.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于 SQLite 优化</title><link>http://www.cppblog.com/chinloon/archive/2012/01/19/164380.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Thu, 19 Jan 2012 09:58:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2012/01/19/164380.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/164380.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2012/01/19/164380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/164380.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/164380.html</trackback:ping><description><![CDATA[项目里遇到一个问题，在我们程序客户端运行时，sqlite数据库会不断自动生成/删除 journal 文件，高峰时候会占用大量的IO，导致程序很慢。<br />由于客户端本身的数据完整性不重要，性能非常重要，所以想禁止这个文件的生成。<br />后来查了一下文档，并实践过后，发现网络上所有的关于关闭/打开某些宏来防止生成的方法都不管用。情急之下，只有改源码了。<br />改的地方是在main.c 的&nbsp;sqlite3BtreeFactory 里，直接加个宏就好了&nbsp;omitJournal<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; "><strong>&nbsp;</strong>1</span>&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;<span style="color: #000000; ">sqlite3BtreeFactory(</span><br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">const</span>&nbsp;<span style="color: #000000; ">sqlite3&nbsp;*db,</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Main&nbsp;database&nbsp;when&nbsp;opening&nbsp;aux&nbsp;otherwise&nbsp;0&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">const</span>&nbsp;<span style="color: #0000ff; ">char</span>&nbsp;<span style="color: #000000; ">*zFilename</span>,&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Name&nbsp;of&nbsp;the&nbsp;file&nbsp;containing&nbsp;the&nbsp;BTree&nbsp;database&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;<span style="color: #000000; ">omitJournal</span><span style="color: #000000; ">,&nbsp;&nbsp;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;if&nbsp;TRUE&nbsp;then&nbsp;do&nbsp;not&nbsp;journal&nbsp;this&nbsp;file&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;<span style="color: #000000; ">nCache,</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;How&nbsp;many&nbsp;pages&nbsp;in&nbsp;the&nbsp;page&nbsp;cache&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;<span style="color: #000000; ">vfsFlags,</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Flags&nbsp;passed&nbsp;through&nbsp;to&nbsp;vfsOpen&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;<span style="color: #000000; ">Btree&nbsp;**ppBtree&nbsp;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Pointer&nbsp;to&nbsp;new&nbsp;Btree&nbsp;object&nbsp;written&nbsp;here&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">){</span><br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;<span style="color: #000000; ">btFlags&nbsp;=&nbsp;0;</span><br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">int</span>&nbsp;<span style="color: #000000; ">rc;</span><br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;<span style="color: #000000; ">assert(&nbsp;sqlite3_mutex_held(db-&gt;mutex)&nbsp;);</span><br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;<span style="color: #000000; ">assert(&nbsp;ppBtree&nbsp;!=&nbsp;0);</span><br /><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000ff; ">#ifdef&nbsp;OMIT_JOURNAL</span><br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;<span style="color: #000000; ">omitJournal&nbsp;=&nbsp;1;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">!&lt;&nbsp;turn&nbsp;off&nbsp;journal&nbsp;file</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #008000; "></span><span style="color: #0000ff; ">#endif</span></div><hr /><img src ="http://www.cppblog.com/chinloon/aggbug/164380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2012-01-19 17:58 <a href="http://www.cppblog.com/chinloon/archive/2012/01/19/164380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost::python 遇到的一些问题总结</title><link>http://www.cppblog.com/chinloon/archive/2011/09/20/156313.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Tue, 20 Sep 2011 06:29:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2011/09/20/156313.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/156313.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2011/09/20/156313.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/156313.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/156313.html</trackback:ping><description><![CDATA[环境:<br />&nbsp;&nbsp; WinXP-SP3(chs) + VS2010-SP1(en-us) + boost 1.47.0 + python 2.7(ActivePython2.7 携带)<br /><br />&nbsp;&nbsp; boost编译时，boost::python库编译为 stage debug release link=static runtime-link=shared<br /><br />问题1:<br />&nbsp;&nbsp; python27 不认dll作为extension<br />解决方案：<br />&nbsp;&nbsp; project的output file 和 extension 都设置为 .pyd<br /><br />问题2：<br />&nbsp;&nbsp; 需要在导出类函数时，支持带指针的参数 （重头戏）<br />解决方案：<br />&nbsp;&nbsp; 这个问题似乎网上没有一个完整的答案，零零碎碎的问题有一堆，但感觉都不到位，接下来我就给个方案吧。(我对boost::python也不熟，如有错误希望好言指正:) )<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">boost</span><span style="color: #000000; ">/</span><span style="color: #000000; ">python.hpp</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;boost::python;<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;World<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;simpleHello(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">this&nbsp;is&nbsp;simple&nbsp;hello\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;hello(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">data)<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">World&nbsp;say&nbsp;hello&nbsp;:%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">data);<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;ready(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">(</span><span style="color: #000000; ">1234</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">};<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">BOOST_PYTHON_MODULE(sample)<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;class_</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">World</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">World</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">simpleHello</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">World::simpleHello)<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">hello</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">World::hello,&nbsp;arg(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">data</span><span style="color: #000000; ">"</span><span style="color: #000000; ">))<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;.def(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ready</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">World::ready,&nbsp;return_value_policy</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">return_opaque_pointer</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">())<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;;<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">}</span></div><br />这里要说明二点：<br />1）这个例子既有传指针参数，又有返回指针对象，算是把boost::python两个典型问题囊括了。<br />2）return_opaque_pointer 是我查官方文档后得到的一个变通（官方推荐这里用 manage_new_object，但不管你编不编的过，反正我是编不过，在翻了Reference manual后看到了 opaque_pointer，看名字觉得有戏，就拿来用了。貌似opaque_pointer的严格性更低一点。编译通过，运行OK，反正就这样了）<span style="color: #000000; "></span><img src ="http://www.cppblog.com/chinloon/aggbug/156313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2011-09-20 14:29 <a href="http://www.cppblog.com/chinloon/archive/2011/09/20/156313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>研究了一天ZeroMQ，有个严重的问题还没解决</title><link>http://www.cppblog.com/chinloon/archive/2011/06/14/148641.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Tue, 14 Jun 2011 08:59:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2011/06/14/148641.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/148641.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2011/06/14/148641.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/148641.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/148641.html</trackback:ping><description><![CDATA[&nbsp; ZeroMQ是一个Message Queue的实现方案，支持超多种语言的Binding，今天研究了一下，起初对它的N:N模型很感兴趣，后来试用了其自带的 Load Balance特性，结果发现一个非常严重的问题，在Server Cluster中，如果有一台服务器在接收消息后Blocking，或者服务器崩溃了，没来得及send response，则客户端的请求一直就停留在这次send req上，永远无法检测出error，我查了关于timeout的文档，后来改用poll模型试了很久，还是没法解决。接下来可能要花时间仔细研读一下Guide了。<img src ="http://www.cppblog.com/chinloon/aggbug/148641.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2011-06-14 16:59 <a href="http://www.cppblog.com/chinloon/archive/2011/06/14/148641.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一段 汇编代码</title><link>http://www.cppblog.com/chinloon/archive/2011/01/06/138068.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Thu, 06 Jan 2011 04:48:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2011/01/06/138068.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/138068.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2011/01/06/138068.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/138068.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/138068.html</trackback:ping><description><![CDATA[这是从别人博客上摘的一段C嵌汇编码 <br>(&nbsp;http://www.cppblog.com/kevinlynx/archive/2011/01/02/137886.html
)<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px; color: #220000;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">__declspec(naked)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">void&nbsp;caller(void*&nbsp;pfn,&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">)&nbsp;<br><img id="Codehighlighter1_45_172_Open_Image" onclick="this.style.display='none'; codehighlighter1_45_172_open_text.style.display=" none="" ;="" codehighlighter1_45_172_closed_image.style.display="'inline';" codehighlighter1_45_172_closed_text.style.display="'inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_45_172_Closed_Image" onclick="this.style.display='none'; codehighlighter1_45_172_closed_text.style.display=" none="" ;="" codehighlighter1_45_172_open_image.style.display="'inline';" codehighlighter1_45_172_open_text.style.display="'inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"><img src="http://www.cppblog.com/Images/dot.gif">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;__asm&nbsp;<br><img id="Codehighlighter1_62_170_Open_Image" onclick="this.style.display='none'; codehighlighter1_62_170_open_text.style.display=" none="" ;="" codehighlighter1_62_170_closed_image.style.display="'inline';" codehighlighter1_62_170_closed_text.style.display="'inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_62_170_Closed_Image" onclick="this.style.display='none'; codehighlighter1_62_170_closed_text.style.display=" none="" ;="" codehighlighter1_62_170_open_image.style.display="'inline';" codehighlighter1_62_170_open_text.style.display="'inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;eax;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;eax,&nbsp;3;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xchg&nbsp;dword&nbsp;ptr[esp],&nbsp;eax;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;eax;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</div>
下面是调用方法<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;"><img style="color: #220000;" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #220000;">void&nbsp;print_str(&nbsp;const&nbsp;char&nbsp;*s&nbsp;)</span><br style="color: #220000;"><img style="color: #220000;" id="Codehighlighter1_32_60_Open_Image" onclick="this.style.display='none'; codehighlighter1_32_60_open_text.style.display=" none="" ;="" codehighlighter1_32_60_closed_image.style.display="'inline';" codehighlighter1_32_60_closed_text.style.display="'inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_32_60_Closed_Image" onclick="this.style.display='none'; codehighlighter1_32_60_closed_text.style.display=" none="" ;="" codehighlighter1_32_60_open_image.style.display="'inline';" codehighlighter1_32_60_open_text.style.display="'inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"><img style="color: #220000;" src="http://www.cppblog.com/Images/dot.gif"><span style="color: #220000;">{</span><br style="color: #220000;"><img style="color: #220000;" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><span style="color: #220000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;"%s\n",&nbsp;s&nbsp;);</span><br style="color: #220000;"><img style="color: #220000;" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"><span style="color: #220000;">}</span><br style="color: #220000;"><br style="color: #220000;"><span style="color: #220000;">{</span><br style="color: #220000;"><span style="color: #220000;">&nbsp;&nbsp; ...</span><br style="color: #220000;"><img style="color: #220000;" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #220000;">caller(&nbsp;print_str,&nbsp;"a&nbsp;string"&nbsp;);</span><br style="color: #220000;"><span style="color: #220000;">&nbsp;&nbsp; __asm&nbsp; add&nbsp;esp,&nbsp;4</span><br style="color: #220000;"><span style="color: #220000;">&nbsp;&nbsp;
...</span><br style="color: #220000;"><span style="color: #220000;">}</span><br></div>
<br>&nbsp; 原作者讲了一些基础，这里就不提了<br>看了一遍，发现 "ADD EAX, 3" 的用法有点奇怪（我相信搞破解的人一定比较熟悉，但正常的程序不会这么写。）<br>初看 EAX 是地址，+3是很危险的，但仔细一看，发现代码是为了从最外层主调函数一路穿越"caller" 直达 print_str，这里牵涉到一个重要问题，就是在CALL指令时，会有将&#8220;CALL指令下一条地址压栈&#8221;的操作，那么代码思路很明了了，就是为了要造出 调用print_str时，ESP(+0) 指向 caller(..)调用的下一个地址。<br>&nbsp; 第一关已经顺利搞定，但又碰到个问题，由于 print_str 的入参是可变的，所以必须用 cdecl调用，那RET之后 如何平栈呢？ 如果直接跳到 caller下一条地址，就丧失了平栈的机会，最终会在某个主调函数上被微软的 stack cookie捕获抛个SEH。<br>&nbsp; 这里就用到文章开头提到的 ADD EAX, 3。<br>&nbsp; 必须要造一个环境，让 caller 调用完成后，给个机会清理现场。于是乎，caller之后就有了 ADD ESP, 4。其实这里的4是与print_str的入参数目相关的，每个参数要多加 4字节，如此一来，整个代码就理顺了。<br>&nbsp; 那为什么 是 ADD EAX, 3呢？ 应该是预估出一条ADD指令占用多少长度，和具体的环境有关。因为没看INTEL手册，这里只能认为ADD 寄存器+WORD的长度是3个字节。我用VC试验了一下，的确是如此，我也尝试了ADD 寄存器+DWORD，长度变为了5个字节。<br>   <img src ="http://www.cppblog.com/chinloon/aggbug/138068.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2011-01-06 12:48 <a href="http://www.cppblog.com/chinloon/archive/2011/01/06/138068.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>64-bit Win2003 &amp; 2008的目录映射问题</title><link>http://www.cppblog.com/chinloon/archive/2010/11/01/131934.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Sun, 31 Oct 2010 16:07:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2010/11/01/131934.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/131934.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2010/11/01/131934.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/131934.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/131934.html</trackback:ping><description><![CDATA[&nbsp; 最近发生一件有趣的事。过去一段代码在64位windows系统上运行有问题。一个 CopyFile的API返回正确，但目标目录system32下却没有相应文件。<br>&nbsp; 查找了一遍，发现syswow64目录下有该文件，于是猜测OS做了目录映射。<br>&nbsp; 后来找到了依据：http://support.microsoft.com/kb/942589
<br>&nbsp; 32-bit APP在64-bit OS上运行，很多方面都需要学习。<br><br><img src ="http://www.cppblog.com/chinloon/aggbug/131934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2010-11-01 00:07 <a href="http://www.cppblog.com/chinloon/archive/2010/11/01/131934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用C++对象模型通过父类调用子类特有的虚函数</title><link>http://www.cppblog.com/chinloon/archive/2010/10/18/130301.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Mon, 18 Oct 2010 10:07:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2010/10/18/130301.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/130301.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2010/10/18/130301.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/130301.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/130301.html</trackback:ping><description><![CDATA[&nbsp; 最近QQ游戏开发群里有一位朋友出了一道题，&#8220;如何在基类中调用子类独有的函数，而不调用强制转换&#8221;。这道题我一时间没做出来，但是如果放宽限制，其实可以玩一个有趣的游戏。<br>&nbsp; 如果题目改为&#8220;如何在基类中调用子类独有的虚函数，而不调用Class类型强制转换&#8221;，那就可以利用C++对象模型中的虚表的直接访问来实现父类调用子类的特有虚函数。（注意，这里特有是指子类有而基类没有。）<br>&nbsp; 以下是我的解法，也在QQ群里发了，想不到引起群成员小小的轰动，看来游戏开发还是有很多同学对底层不感兴趣啊。<br><br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CFather{<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">CFather(){}<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;CSon&nbsp;:&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;CFather{<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">CSon(){}<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;DoSomething(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">){&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">son&nbsp;is&nbsp;crying\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;}<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;_tmain(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,&nbsp;_TCHAR</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;argv[])<br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;CFather</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;fa&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;CSon();<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwDoSomething&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">(DWORD</span><span style="color: #000000;">*</span><span style="color: #000000;">)(</span><span style="color: #000000;">*</span><span style="color: #000000;">(DWORD</span><span style="color: #000000;">*</span><span style="color: #000000;">)fa</span><span style="color: #000000;">+</span><span style="color: #000000;">4</span><span style="color: #000000;">));<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;_asm&nbsp;MOV&nbsp;ecx,&nbsp;fa<br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;_asm&nbsp;CALL&nbsp;dwDoSomething<br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="color: #000000;">"</span><span style="color: #000000;">pause</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;"></span></div>
<br><br> <img src ="http://www.cppblog.com/chinloon/aggbug/130301.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2010-10-18 18:07 <a href="http://www.cppblog.com/chinloon/archive/2010/10/18/130301.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>慎用文件 I/O 的 Flush系列函数</title><link>http://www.cppblog.com/chinloon/archive/2010/08/24/124571.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Tue, 24 Aug 2010 11:14:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2010/08/24/124571.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/124571.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2010/08/24/124571.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/124571.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/124571.html</trackback:ping><description><![CDATA[&nbsp; 由于自己是写Server端程序的。最近有个别客户反映在服务端负载量大的情况下，经常有客户端的TCP请求处理超时。看了log文件，发现是服务端接收请求之后，未能及时处理请求并回复客户端应答造成。<br>&nbsp; 仔细观察了请求的处理过程，唯一耗时的就是文件I/O的Flush操作，因为这个操作会强制要求OS提交IO请求，而不是用OS自带的IO缓冲。如果在IO处理非常频繁的情况下，的确会导致服务端I/O告急，磁盘压力过大，性能大幅下降，<br><br><img src ="http://www.cppblog.com/chinloon/aggbug/124571.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2010-08-24 19:14 <a href="http://www.cppblog.com/chinloon/archive/2010/08/24/124571.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>伟大的pdb</title><link>http://www.cppblog.com/chinloon/archive/2010/07/22/121008.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Thu, 22 Jul 2010 00:26:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2010/07/22/121008.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/121008.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2010/07/22/121008.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/121008.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/121008.html</trackback:ping><description><![CDATA[&nbsp; 昨晚有客户反应，产品中的某个进程启动后1分钟内会消失，看了log未发现异常。<br>&nbsp; 于是远程过去，想看本溃报告，很遗憾的是，没有生成任何本溃报告（我们用的是Debug系列的api写的Crash Reporter）。情急之下，唯有求助伟大的Windbg了。<br>&nbsp; attach，g，过一会儿，果然发现是有一处seh。但随即发现缺symbols，于是马上去发布服务器上找相应的pdb文件，放到远程上去，.reload，果然，未知地址被准确地翻译成代码中的标识符。<br>&nbsp; 原来，崩溃的地方是动态加载的一个dll中的一个回调函数，怪不得没捕获到Crash Report。<br>&nbsp; 总结下来，Release版本的PDB生成是个关键，单有Windbg仍旧是巧妇难为无米之炊啊。<br><br> <img src ="http://www.cppblog.com/chinloon/aggbug/121008.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2010-07-22 08:26 <a href="http://www.cppblog.com/chinloon/archive/2010/07/22/121008.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ 与 Delphi交互的一个问题</title><link>http://www.cppblog.com/chinloon/archive/2010/06/20/118328.html</link><dc:creator>Meiosis</dc:creator><author>Meiosis</author><pubDate>Sun, 20 Jun 2010 15:34:00 GMT</pubDate><guid>http://www.cppblog.com/chinloon/archive/2010/06/20/118328.html</guid><wfw:comment>http://www.cppblog.com/chinloon/comments/118328.html</wfw:comment><comments>http://www.cppblog.com/chinloon/archive/2010/06/20/118328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinloon/comments/commentRss/118328.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinloon/services/trackbacks/118328.html</trackback:ping><description><![CDATA[&nbsp; 最近拿到一个第三方厂家的库，由于Delphi的同事看不懂c++的例子，所以让我用C++封装一个简单的Wrapper给其调用。<br>&nbsp; 后来发现一个问题，由于原始的函数声明中的参数使用字符数组 (char szData[MAX_PATH])&nbsp; 而不是用常用的指针(char *)，给Delphi同事调用后，发现函数调用完退栈时候程序本溃，原因是访问违例，非法地址访问0x72。<br>&nbsp; 这么一来感觉比较奇怪，0x72 这个地址显然是个垃圾地址，一般如果是空指针的话因该是 0x00，如果是野指针，一般也不至于会那么小，0x72与程序加载地址都相去甚远。<br>&nbsp;
在vc6（公司只准用vc6）里跟了一下反汇编，感觉信息缺少比较多，能看到的地方已经堆栈被破坏了。于是用了OD跟一下。发现Delphi调用我封装的
函数时，明明2个入参，却传入了3个。多传了个260。260对于vc程序员应该比较熟悉了，就是MAX_PATH的值。于是乎，告知了Delphi程序
员，方才得知，原来Delphi是可以在声明时指定数组长度的，也就是说，函数的入参，数组和指针是两种声明，如此一来，水落石出了。 <img src ="http://www.cppblog.com/chinloon/aggbug/118328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinloon/" target="_blank">Meiosis</a> 2010-06-20 23:34 <a href="http://www.cppblog.com/chinloon/archive/2010/06/20/118328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>