﻿<?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还是Linux？</title><link>http://www.cppblog.com/cj1205/</link><description>人生是无法阻止的前进！
酒醒诗残梦断，南国正清秋。把剑凄然望，无处归舟。</description><language>zh-cn</language><lastBuildDate>Wed, 08 Apr 2026 01:27:59 GMT</lastBuildDate><pubDate>Wed, 08 Apr 2026 01:27:59 GMT</pubDate><ttl>60</ttl><item><title>[WTL编程] CListViewCtrl和CListCtrl的LPSTR_TEXTCALLBACK虚拟化机制(分頁顯示數據)</title><link>http://www.cppblog.com/cj1205/archive/2012/06/20/179525.html</link><dc:creator>向前看勿回头</dc:creator><author>向前看勿回头</author><pubDate>Wed, 20 Jun 2012 12:46:00 GMT</pubDate><guid>http://www.cppblog.com/cj1205/archive/2012/06/20/179525.html</guid><wfw:comment>http://www.cppblog.com/cj1205/comments/179525.html</wfw:comment><comments>http://www.cppblog.com/cj1205/archive/2012/06/20/179525.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cj1205/comments/commentRss/179525.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cj1205/services/trackbacks/179525.html</trackback:ping><description><![CDATA[引用自:<a href="http://www.aiseminar.cn/bbs/forum.php?mod=viewthread&amp;tid=1550">http://www.aiseminar.cn/bbs/forum.php?mod=viewthread&amp;tid=1550<br /><table cellspacing="0" cellpadding="0" style="word-wrap: break-word; empty-cells: show; border-collapse: collapse; table-layout: fixed; width: 757px; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; font-size: 12px; line-height: 18px; background-color: #ffffff; "><tbody style="word-wrap: break-word; "><tr style="word-wrap: break-word; "><td id="postmessage_4750" style="word-wrap: break-word; font-size: 14px; ">在ListCtrl中，如果把一个Item（或subITem）的文字设置为LPSTR_TEXTCALLBACK，当列表控件需要显示这个文字时会向其父控件发LVN_GETDISPINFO消息，父控件必须响应这个消息，并返回要显示的文字。</td></tr></tbody></table><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: #000000; ">lvi.iItem&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;i;<br />lvi.iSubItem&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />lvi.pszText&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;LPSTR_TEXTCALLBACK;<br />lvi.cchTextMax&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;MAX_PATH;<br />lvi.iImage&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;I_IMAGECALLBACK;<br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;m_wndListView.InsertItem(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">lvi);</span></div><br /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">这是列表控件的一种机制，这种机制是为了支持大量数据而设计的，这就是虚拟化CListCtrl的一种应用。例如用列表控件显示数据库中的数据，数据库中的数据可能非常多，不太可能把所有数据添加到列表控件里面（因为需要大量内存和时间），这时可以只向列表控件中添加少量数据，例如只添加1页数据，把各个子项的文字都设置为LPSTR_TEXTCALLBACK，当列表控件要显示文字时，会向父控件发送TVN_GETDISPINFO，在响应TVN_GETDISPINFO消息时，根据当前的排序方式和要显示的页从数据库中查找相关的数据，并返回给列表控件显示。当数据项数相对较小时，也可以使用虚拟列表的形式。</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">如：在资源编辑器中选好了ListCtrl的owner data选项，代码中设置好了列，之后调用SetITemCount(1000);触发重画。1000是你实际的数据行数，而行数据可以根据当前显示的位置来重画。例如有1000行数据，但实际上用户可以看到的假设是10列（每屏幕显示10行），响应相应LVN_GETDISPINFO消息，我们就可以只重画1～10行，这样就大大节省了资源，不需要每次都重画CListCtrl中的所有1000行数据。这样效率得到明显的提高。</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">LPSTR_TEXTCALLBACK 是如何请求字符串的？</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">关于动态提供结点所显示的字符：首先你在项时需要指明lpszITem参数为：LPSTR_TEXTCALLBACK。在控件显示该结点时会通过发送TVN_GETDISPINFO来取得所需要的字符，在处理该消息时先将参数pNMHDR转换为LPNMLVDISPINFO，然后填充其中item.pszText。通过item中的iItem,iSubITem可以知道当前显示的为哪一项。下面的代码演示了这种方法：</span>&nbsp;<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: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;szOut[</span><span style="color: #000000; ">8</span><span style="color: #000000; ">][</span><span style="color: #000000; ">3</span><span style="color: #000000; ">]</span><span style="color: #000000; ">=</span><span style="color: #000000; ">{</span><span style="color: #000000; ">"</span><span style="color: #000000; ">No.1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">No.2</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">No.3</span><span style="color: #000000; ">"</span><span style="color: #000000; ">};&nbsp;&nbsp;<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">添加结点&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">m_list.InsertITem(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;LPSTR_TEXTCALLBACK)&nbsp;&nbsp;<br />m_list.InsertITem(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;LPSTR_TEXTCALLBACK)&nbsp;&nbsp;<br />m_list.InsertITem(</span><span style="color: #000000; ">3</span><span style="color: #000000; ">,&nbsp;LPSTR_TEXTCALLBACK)&nbsp;<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">处理消息&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;CParentWnd::OnGetDispInfoList(NMHDR</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pNMHDR,&nbsp;LRESULT</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pResult)&nbsp;&nbsp;<br />{&nbsp;&nbsp;<br />　　　　LV_DISPINFO</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pLVDI&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(LV_DISPINFO</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)pNMHDR;&nbsp;&nbsp;<br />　　　　pLVDI</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">item.pszText&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;szOut[pTVDI</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">item.iItem];</span><span style="color: #008000; ">//</span><span style="color: #008000; ">通过iITem得到需要显示的字符在数组中的位置&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">　　　　</span><span style="color: #000000; ">*</span><span style="color: #000000; ">pResult&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;&nbsp;<br />}&nbsp;</span></div><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">你可以在MSDN中输入LVN_GETDISPINFO查看详细的说明：</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><a href="http://msdn2.microsoft.com/en-us/library/ye4z8x58(VS.80).ASPx" target="_blank" style="word-wrap: break-word; color: #336699; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">http://msdn2.microsoft.com/en-us/library/ye4z8x58(VS.80).ASPx</a>&nbsp;<br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">相关程序：</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><a href="http://www.codeproject.com/KB/list/virtuallist.aspx" target="_blank" style="word-wrap: break-word; color: #336699; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">http://www.codeproject.com/KB/list/virtuallist.aspx</a><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><span style="color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">Modified from:</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; " /><a href="http://blog.csdn.net/jia_xiaoxin/archive/2008/07/25/2711855.aspx" target="_blank" style="word-wrap: break-word; color: #336699; font-family: Tahoma, Helvetica, SimSun, sans-serif; background-color: #ffffff; ">http://blog.csdn.net/jia_xiaoxin/archive/2008/07/25/2711855.aspx</a>&nbsp;<br /></a><img src ="http://www.cppblog.com/cj1205/aggbug/179525.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cj1205/" target="_blank">向前看勿回头</a> 2012-06-20 20:46 <a href="http://www.cppblog.com/cj1205/archive/2012/06/20/179525.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于网络编程（服务端）的一些笔记</title><link>http://www.cppblog.com/cj1205/archive/2011/02/25/140627.html</link><dc:creator>向前看勿回头</dc:creator><author>向前看勿回头</author><pubDate>Fri, 25 Feb 2011 01:23:00 GMT</pubDate><guid>http://www.cppblog.com/cj1205/archive/2011/02/25/140627.html</guid><wfw:comment>http://www.cppblog.com/cj1205/comments/140627.html</wfw:comment><comments>http://www.cppblog.com/cj1205/archive/2011/02/25/140627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cj1205/comments/commentRss/140627.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cj1205/services/trackbacks/140627.html</trackback:ping><description><![CDATA[转载自：http://bbs.chinaunix.net/thread-443179-1-1.html
<br>
针对服务器处理网络连接的几种方式，unix网络编程里给出了９种方案，并且对服务器进程／线程的开销做了一个量化的比较。从个人经验出发，觉得以下几种方式是比较实用的：<br>
<br>
1.最简单的是堵塞Accept，收到连接后fork进程（unix)或创建Thread.原进程/线程继续堵塞Accept，创出来的进程线程只处理新
连接上的客户请求。如果忽略创建进程/线程的开销，以及每个连接必须对应一个进程/线程的话，做成这样已经可以满足绝大部分简单的应用服务器需要了。qmail的tcpserver用的也是这种模式。要注意的是，如果子进程不监听连接，最好关掉继承自父进程的原来listen的socket.由于fork的开销比较大，如果对服务器的响应非常苛求，这种方式还是不实用的。另外，fork一个单线程的进程，会比fork一个多线程的进程要快的多。<br>
<br>
2.引入进程/线程池概念，也就是先创建一堆进程/线程，让这些进程/线程来处理连接事件和客户端业务。在有多线程支持的系统里，
实现线程池还是很容易的，只让一个线程在accept上堵塞，收到连接后，唤醒一个本来堵塞在某个互斥量上的线程来处理之或将其放入队列等待处理。这样处
理客户端连接的线程可以无限多（系统容量范围内）。但在进程模式里，因为除非使用fork让子进程继承连接句柄，否则跨进程处理accept返回的连
接。（某些unix可以实现进程间传递句柄，win32也有进程复制句柄的做法，但这跟操作系统结合太紧，而且不是所有操作系统都支持，忽略之）<br>
<br>
<br>
3.解决上述进程问题就是让所有进程都能监听同一个端口并accept连接，可以通过一个进程创建了listen
socket,并fork同样进行listen/accept的子进程来实现。这里要考虑惊群效应，也就是说有连接到来，所有堵塞在监听socket上的
进程可能都会被系统唤醒,但只有一个进程能够从tcp协议栈里获得连接。惊群效应引入了进程调度开销，解决办法是在accept上加锁。同时只有一个进程
在调用accept.在获得连接后，该进程不再调用Accept，而是处理客户端业务，直到客户端退出，才重新回归调用accept。
Apache1.3.x使用的是类似的模式，可以从其http_main.c里看到。我觉得虽然这个方案没有解决一个连接对应一个进程的&#8220;浪费&#8221;，但已经
是比其他方案要高效实用的多了。<br>
<br>
典型代码如下<br>
while(true)<br>
{<br>
&nbsp; &nbsp; mutex_lock<br>
&nbsp; &nbsp; newcliet=accept(listener)<br>
&nbsp; &nbsp; mutex_unlock<br>
&nbsp; &nbsp; while(true)<br>
&nbsp; &nbsp; {<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;/*处理客户端任务直到客户端断开*/<br>
&nbsp; &nbsp; } <br>
<br>
}<br>
4.以上都只考虑了一个进程/线程对应一个连接的情况，当有大量的连接时，就可能会产生大量的线程。使用select可以让一个线程/进程处理多个连接。如下代码<br>
<br>
if(&nbsp;&nbsp;select( .... ) ) &gt;; 0 )　/*&gt;;０表示select集合里有事件发生*/<br>
{<br>
/*依次检查各有效的socket*/<br>
for()<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;{<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if(FD_ISSET( sock... )/**/<br>
&nbsp; &nbsp; {<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if(sock ==&nbsp;&nbsp;ServerSocket){ /*是监听socket，调用accept，得到新socket,并加到本进程的select集合里*/ }<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; else{/*其他socket*/}<br>
&nbsp; &nbsp; }<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;}<br>
}<br>
结合3的模式，比如创建１０个都能监听的进程，每个进程最多处理１０个客户端连接，那么进程／连接数比就降低了１０倍。但这种情况下就不能对监听
socket加锁，无法避免惊群问题。可以看到，在select后的for，同样可能占用不少cpu，比起系统的进程调度可能是有过之而无不及。在必须用
单进程处理多个连接的case里，是可以考虑这样实现的。PS:unix网络编程里提到，如果有多个进程需要堵塞在同一个socket上，那么堵塞在
accept上比堵塞在select上要好。<br>
<br>
5:说到select，在合适的地方使用select还是不错的,尤其是读socket,使用select可以有效的实现可超时的堵塞方式，而不是永久性
堵塞。在网络编程里冒把进程／线程堵塞致死的风险是很不应该的。所以最好把socket设置成非堵塞的，这样读函数可以立刻返回，读到数据或产生错误，错误码EAGAIN／EINTR／EINVAL表示连接应该没有断开，可以继续使用。<br>
<br>
<br>
6:在windows上可以采用IOCP的做法（参见N年前翻译的文档：http://blog.csdn.net/vcbear/archive
/2001/08/29/5987.aspx）。用单进程处理多个连接，让操作系统去操心网络上的事件，并挑出来是哪个连接上产生了IO。这样把任务调度
的细节放到了操作系统内核，避免了在应用层上的进程／线程开销。据说LINUX/UNIX上有类似的EPOLL，怀疑Apache2.0采用了这个技术，还没有来得及研究。但如果通用代码方案已经可以满足要求，我觉得应该尽量避免使用和操作系统极度相关的代码，比如WIN32的IOCP。<br>
<br>
7:考虑服务器上的进程调度，进程限制，信息共享是比较精细的事情。一般的实现就是做个共享内存公告板，进程竞争的读写公告板上的信息，报告自己的状态或获取其他信息。apache在这一块是做的很漂亮的，它可以根据连接的忙闲程度，由一个主进程来创建更多处理进程或控制空闲进程退出。过多的进程／线程存在还是会影响系统效率的（量化计算参考unix网络编程卷一的第27章)<br>
<br>
8:一点注意：服务器编程一定要设置　linger,否则客户端主动socket关闭的时候，服务器会持续2*TIME_WAIT的时间才真正断开，造成大量的废连接负担。<br>
&nbsp; &nbsp;&nbsp;&nbsp;rLinger.l_onoff&nbsp;&nbsp;= 1;&nbsp; &nbsp;// 打开linegr开关<br>
&nbsp; &nbsp;&nbsp;&nbsp;rLinger.l_linger = 0;&nbsp; &nbsp;// 设置延迟时间为 0 秒, 注意 TCPIP立即关闭，但是有可能出现化身<br>
&nbsp; &nbsp;&nbsp;&nbsp;setsockopt(nSockfd, SOL_SOCKET, SO_LINGER, (char *)&amp;rLinger, sizeof(rLinger)))<br>
另外一个选项SO_REUSEADDR也是server socket必须设置的。<br>
<br>
无论采用什么模式来编写服务器，需要关注的问题除了网络事件响应，进程／线程调度之外，还有服务器本身的容量问题。最短的木板其实并不在于处理网络连接的
模型本身，而是服务器上的数据处理能力或网络带宽，如果一台服务器及其网络带宽受理100个客户端的业务就已经很吃力了（比如ftp,mud，p2p,其他应用服务...)，那么其socket服务器就算能轻松处理10000个连接也没有意义了。
<br><img src ="http://www.cppblog.com/cj1205/aggbug/140627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cj1205/" target="_blank">向前看勿回头</a> 2011-02-25 09:23 <a href="http://www.cppblog.com/cj1205/archive/2011/02/25/140627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>制作托盘图标（不包含气泡）</title><link>http://www.cppblog.com/cj1205/archive/2011/01/11/138324.html</link><dc:creator>向前看勿回头</dc:creator><author>向前看勿回头</author><pubDate>Tue, 11 Jan 2011 03:21:00 GMT</pubDate><guid>http://www.cppblog.com/cj1205/archive/2011/01/11/138324.html</guid><wfw:comment>http://www.cppblog.com/cj1205/comments/138324.html</wfw:comment><comments>http://www.cppblog.com/cj1205/archive/2011/01/11/138324.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cj1205/comments/commentRss/138324.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cj1205/services/trackbacks/138324.html</trackback:ping><description><![CDATA[<pre id="best-answer-content">在头文件MainFrm.h中声明NOTIFYICONDATA nid;<br><br>int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)<br><br>{<br><br>       //***** 初始化系统托盘图标 *****//<br><br>       nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);<br><br>       nid.hWnd=this-&gt;m_hWnd;<br><br>       nid.uID=IDR_MAINFRAME;<br><br>       nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;<br><br>       nid.uCallbackMessage=WM_USER+1;//自定义的消息名称<br><br>       nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));<br><br>       strcpy(nid.szTip,"双击打开多功能电子钟");//信息提示条<br><br>       Shell_NotifyIcon(NIM_ADD,&amp;nid);//在托盘区添加图标<br><br>        //***** 初始化系统托盘图标 *****//<br><br>       //CenterWindow();<br><br>}<br><br>LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) <br><br>{<br><br>       switch(message){<br><br>       case WM_USER+1:       //如果是用户定义的消息<br><br>              <br><br>              if(lParam==WM_LBUTTONDOWN) //WM_LBUTTONDBLCLK不怎么灵 <br><br>              {  <br><br>                     //鼠标单击时主窗口出现<br><br>                     ::SetForegroundWindow(this-&gt;m_hWnd); //::SetWindowPos(this-&gt;m_hWnd,HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);<br><br>                     AfxGetApp()-&gt;m_pMainWnd-&gt;ShowWindow(SW_SHOW);<br><br>                     WindowIsHide=false;<br><br>                     return 0;<br><br>              }<br><br>              else if(lParam==WM_RBUTTONDOWN) // &amp;&amp; WindowIsHide<br><br>              { <br><br>                     ::SetForegroundWindow(this-&gt;m_hWnd);   //将主框架窗口置前，左击其他地方，菜单消失<br><br> <br><br>                     //鼠标右键单击弹出菜单<br><br>                     CMenu menu;<br><br>                     menu.LoadMenu(IDR_MAINFRAME);<br><br>                     CMenu* pMenu=menu.GetSubMenu(0);<br><br>                     CPoint point;<br><br>                     GetCursorPos(&amp;point);<br><br>                     pMenu-&gt;TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,AfxGetMainWnd());<br><br>                     <br><br>                     ::PostMessage(this-&gt;m_hWnd, WM_NULL, 0,0);   //左击其他地方，菜单消失<br><br> <br><br>                     menu.DestroyMenu();<br><br>                     return 0;<br><br>              }<br><br>              break;<br><br>       case WM_SYSCOMMAND:     //如果是系统消息<br><br>              if(wParam==SC_MINIMIZE||wParam==SC_CLOSE||wParam==SC_MAXIMIZE||wParam==SC_SIZE)<br><br>              { <br><br>                     //主窗口隐藏<br><br>                     AfxGetApp()-&gt;m_pMainWnd-&gt;ShowWindow(SW_HIDE);<br><br>                     WindowIsHide=true;<br><br>                     return 0;<br><br>              }<br><br>              break;<br><br>       }<br><br>       return CFrameWnd::WindowProc(message, wParam, lParam);<br><br>}<br><br>void CMainFrame::OnDestroy() <br><br>{<br><br>       CFrameWnd::OnDestroy();<br><br>       ::Shell_NotifyIcon(NIM_DELETE,&amp;nid);       <br><br>}</pre>
<br><img src ="http://www.cppblog.com/cj1205/aggbug/138324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cj1205/" target="_blank">向前看勿回头</a> 2011-01-11 11:21 <a href="http://www.cppblog.com/cj1205/archive/2011/01/11/138324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>#pragma 完全 详细 介绍</title><link>http://www.cppblog.com/cj1205/archive/2011/01/05/137994.html</link><dc:creator>向前看勿回头</dc:creator><author>向前看勿回头</author><pubDate>Wed, 05 Jan 2011 02:25:00 GMT</pubDate><guid>http://www.cppblog.com/cj1205/archive/2011/01/05/137994.html</guid><wfw:comment>http://www.cppblog.com/cj1205/comments/137994.html</wfw:comment><comments>http://www.cppblog.com/cj1205/archive/2011/01/05/137994.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cj1205/comments/commentRss/137994.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cj1205/services/trackbacks/137994.html</trackback:ping><description><![CDATA[<div id="blog_text" class="cnt">
<p><font size="3">Pragma<br>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></font></p>
<p><font size="3">Pragma是什么?<br>
翻译:Rogers后附英文原文。</font></p>
<p><br>
<font size="3">(译者注:<br>
一句话，pragma就是为了让编译器编译出的C或C++程序与机器硬件和操作系统保持完全兼容而定义的宏扩展，<br>
#pragma是和特定编译器相关的。)<br>
两部分:<br>
1.Pragma说明;<br>
2.Pragma的语法。</font></p>
<p><font size="3">一、Pragma说明(Directives)</font></p>
<p><font size="3">C和C++程序的每次执行都支持其所在的主机或操作系统所具有的一些独特的特点。<br>
一些程序,例如，需要精确控制数据存放的内存区域或控制某个函数接收的参数。<br>
#pragma指示为编译器提供了一种在不同机器和操作系统上编译以保持C和C++完全兼容的方法。?<br>
Pragmas是由机器和相关的操作系统定义的，通常对每个编译器来说是不同的。</font></p>
<p><br>
<font size="3">二、语法(Syntax)</font></p>
<p><font size="3">#pragma token-string(特征字符串)</font></p>
<p><font size="3">特征字符串是一连串的字符，就是要给一个特定编译器提供说明和编译意见。</font></p>
<p><font size="3">符号(#)必须是pragma所在那一行的第一个非空格字符;<br>
#号和pragma之间可以有任意个空格符。<br>
在#pragma之后，是可以被编译器解析的预处理特征字符。<br>
一般认为,#pragma属于宏扩展。<br>
如果编译器发现不认识的pragma,会提出警告，但继续编译下去。</font></p>
<p><font size="3">Pragmas可以用在条件声明上，提供最新的功能性的预处理程序，或者提供给编译器定义执行的信息。<br>
C和C++编译器认可如下pragmas:<br>
alloc_text<br>
comment //注释<br>
init_seg1 <wbr><br>
optimize <wbr>//最优化<br>
auto_inline<br>
component <wbr>//组成部件<br>
inline_depth<br>
pack <wbr><wbr><wbr><wbr><wbr><wbr>//包<br>
bss_seg<br>
data_seg<br>
inline_recursion <wbr>//内嵌递归<br>
pointers_to_members1<br>
check_stack<br>
function <wbr><wbr><wbr><br>
intrinsic <wbr>//内在的<br>
setlocale<br>
code_seg<br>
hdrstop<br>
message <wbr><br>
vtordisp1<br>
const_seg<br>
include_alias<br>
once <wbr><wbr>#pragma <wbr><wbr>once的意思是要求编译器在编译过程中只将包含此命令文件编译（打开）一次，从而避免重复包含此文件。</font></p>
<p><font size="3">warning</font></p>
<p><br>
<font size="3">这是MSDN的一篇文章，原作者曾经想使用<br>
#pragma pack(1) // 用GCC在MIPS平台上将结构体成员结合到一块连续的内存块，但是没有做到。</font></p>
<p><font size="3">在linux环境下使用intel-based GCC,#pragma pack(1)可以工作。</font></p>
<p><font size="3">建议参考具体编译器的文档，在里面应该有pragma的说明。</font></p>
<p><font size="3">---------------------------------------原文-------------------------------------------</font></p>
<p><font size="3">Pragma Directives<br>
Each implementation of C and C++ supports some features unique to its host machine or operating system.</font></p>
<p><font size="3">Some programs, for instance, need to exercise precise control over the memory areas where data is placed or</font></p>
<p><font size="3">to control the way certain functions receive parameters.<br>
The #pragma directives offer a way for each compiler<br>
to offer machine- and operating-system-specific features<br>
while retaining overall compatibility with the C and C++<br>
languages. Pragmas are machine- or operating-system-specific by definition,<br>
and are usually different for every compiler.</font></p>
<p><font size="3">Syntax</font></p>
<p><font size="3">#pragma token-string</font></p>
<p><font size="3">The token-string is a series of characters that gives a specific compiler instruction and arguments,<br>
if any.</font></p>
<p><font size="3">The number sign (#) must be the first non-white-space character on the line containing the pragma;</font></p>
<p><font size="3">white-space characters can separate the number sign and the word pragma.<br>
Following #pragma, write any text that the translator can parse as preprocessing tokens.<br>
The argument to #pragma is subject to macro expansion.</font></p>
<p><font size="3">If the compiler finds a pragma it does not recognize, it issues a warning, but compilation continues.</font></p>
<p><font size="3">Pragmas can be used in conditional statements, to provide new preprocessor functionality,<br>
or to provide implementation-defined information to the compiler.<br>
The C and C++ compilers recognize the following pragmas:</font></p>
<p><font size="3">alloc_text comment init_seg1 optimize<br>
auto_inline component inline_depth pack<br>
bss_seg data_seg inline_recursion pointers_to_members1<br>
check_stack function intrinsic setlocale<br>
code_seg hdrstop message vtordisp1<br>
const_seg include_alias once warning</font></p>
<p><br>
<font size="3">This is an article from MSDN, I ever wanted to use<br>
#pragma pack(1) //which can combine structure members to one continuous memory block<br>
on MIPS platform using GCC, but it doesn't work.</font></p>
<p><br>
<font size="3">See the compiler's document, it should be illustrated there.</font></p>
<p><font size="3">Under linux env using intel-based GCC, it works.</font></p>
<p><font size="3">解析#pragma指令<br>
在所有的预处理指令中，#Pragma
指令可能是最复杂的了，它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C
++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。<br>
其格式一般为: #Pragma Para<br>
其中Para 为参数，下面来看一些常用的参数。</font></p>
<p><font size="3">(1)message 参数。 Message 参数是我最喜欢的一个参数，它能够在编译信息输出窗<br>
口中输出相应的信息，这对于源代码信息的控制是非常重要的。其使用方法为：<br>
#Pragma message(&#8220;消息文本&#8221;)<br>
当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。<br>
当我们在程序中定义了许多宏来控制源代码版本的时候，我们自己有可能都会忘记有没有正确的设置这些宏，此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法<br>
#ifdef _X86<br>
#Pragma message(&#8220;_X86 macro activated!&#8221;)<br>
#endif<br>
当我们定义了_X86这个宏以后，应用程序在编译时就会在编译输出窗口里显示&#8220;_<br>
X86 macro activated!&#8221;。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了<br>
。</font></p>
<p><font size="3">(2)另一个使用得比较多的pragma参数是code_seg。格式如：<br>
#pragma code_seg( ["section-name"[,"section-class"] ] )<br>
它能够设置程序中函数代码存放的代码段，当我们开发驱动程序的时候就会使用到它。</font></p>
<p><font size="3">(3)#pragma once (比较常用）<br>
只要在头文件的最开始加入这条指令就能够保证头文件被编译一次，这条指令实际上在VC6中就已经有了，但是考虑到兼容性并没有太多的使用它。</font></p>
<p><font size="3">(4)#pragma hdrstop表示预编译头文件到此为止，后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度，但如果所有头文件都进行预编译又可能占太多磁盘空间，所以使用这个选项排除一些头文件。<br>
有时单元之间有依赖关系，比如单元A依赖单元B，所以单元B要先于单元A编译。你可以用#pragma startup指定编译优先级，如果使用了#pragma package(smart_init) ，BCB就会根据优先级的大小先后编译。</font></p>
<p><font size="3">(5)#pragma resource "*.dfm"表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体<br>
外观的定义。</font></p>
<p><font size="3">(6)#pragma warning( disable : 4507 34; once : 4385; error : 164 )<br>
等价于：<br>
#pragma warning(disable:4507 34) // 不显示4507和34号警告信息<br>
#pragma warning(once:4385) // 4385号警告信息仅报告一次<br>
#pragma warning(error:164) // 把164号警告信息作为一个错误。<br>
同时这个pragma warning 也支持如下格式：<br>
#pragma warning( push [ ,n ] )<br>
#pragma warning( pop )<br>
这里n代表一个警告等级(1---4)。<br>
#pragma warning( push )保存所有警告信息的现有的警告状态。<br>
#pragma warning( push, n)保存所有警告信息的现有的警告状态，并且把全局警告<br>
等级设定为n。<br>
#pragma warning( pop )向栈中弹出最后一个警告信息，在入栈和出栈之间所作的<br>
一切改动取消。例如：<br>
#pragma warning( push )<br>
#pragma warning( disable : 4705 )<br>
#pragma warning( disable : 4706 )<br>
#pragma warning( disable : 4707 )<br>
//.......<br>
#pragma warning( pop )<br>
在这段代码的最后，重新保存所有的警告信息(包括4705，4706和4707)。<br>
（7）pragma comment(...)<br>
该指令将一个注释记录放入一个对象文件或可执行文件中。<br>
常用的lib关键字，可以帮我们连入一个库文件。</font></p>
<p><font size="3">(8)#pragma pack()<br>
我们知道在VC中，对于想结构体Struct这样的类型，VC采用8字节对齐的方式，如果我们不想使用8字节对齐（在网络变成中经常需要这样），我们可以在结构体前面加上<br>
#pragma pack(1)<br>
struct<br>
{<br>
......<br>
}<br>
#pragma pack( )</font></p>
<p><font size="3">以下是另一个转载：</font></p>
<p><font size="3">在vc6的时代头文件一般使用ifndef define endif<br>
在vc7的时代头文件一般成了pragma once<br>
不知道有没有人深究其中的意义<br>
为什么有这样的代码，是为了头文件不被重复引用，那样编译器抱错的，这两种方法都是同样的目的，有没有区别呢？<br>
还是举例来说明，可能有好几个库，每个库内部可能都有public.h这个文件，如果使用<br>
ifndef public_h<br>
define public_h<br>
...<br>
endif<br>
那么当一个文件同时引用两个这样的库时，后一个库里的文件就不被编译了，而pragma once可以保证文件只被编译一次<br>
看起来pragma once比ifndef define endif要好，那么ifndef define endif<br>
的 地方都pragma
once好了。今天碰到了又一个例子，比如你有一个zlib.h在几个库都用到，而为了方便，把zlib每个目录下copy了一分，因为这个文件不会作修
改，已经很完整了，这个时候如果使用pragma once，就会重复定义，看来ifndef define endif还是又派上用场的地方。<br>
所以对于公有或者接口的文件，使用ifndef define endif，对于内部的文件使用pragma once.</font></p>
<p><font size="3">#pragma once 与 #ifndef #define #endif 的区别</font></p>
<p><font size="3">对于#pragma once,根据MSDN解说，能够防止一个文件被多次包含。与#ifndef #define
#endif形式的文件保护相比，前者是平台相关的，可移植性比较差，但是它效率更高，因为它不需要去打开包含的文件，就可以判断这个文件有没有被包含。
当然这个工作是系统帮我们完成的。<br>
后者的优点在于它是语言相关的特性，所以可移植性好。但是在包含一个文件的时候，只有打开这个文件，根据文件的保护宏是否已经被定义来判断此文件是否已经
被包含过。效率相对较低。当然在＃i
nclude的时候，程序员也可以自己判断所要包含的文件的保护宏是否已经被定义，来决定是否要包含这个文件。类似下面的代码：<br>
#ifndef FILE_H_<br>
＃i nclude "file.h"<br>
#endif<br>
这样作可以得到较高的效率，而且保证可移植性。但是文件之间的依赖性较高，如果一个文件的保护宏改变的话，所有使用如上形式包含这个文件的文件都要修改。有悖于模块化的思想。</font></p>
</div>
<br><img src ="http://www.cppblog.com/cj1205/aggbug/137994.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cj1205/" target="_blank">向前看勿回头</a> 2011-01-05 10:25 <a href="http://www.cppblog.com/cj1205/archive/2011/01/05/137994.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[必须掌握].bss段和.data段的区别</title><link>http://www.cppblog.com/cj1205/archive/2011/01/05/137993.html</link><dc:creator>向前看勿回头</dc:creator><author>向前看勿回头</author><pubDate>Wed, 05 Jan 2011 02:20:00 GMT</pubDate><guid>http://www.cppblog.com/cj1205/archive/2011/01/05/137993.html</guid><wfw:comment>http://www.cppblog.com/cj1205/comments/137993.html</wfw:comment><comments>http://www.cppblog.com/cj1205/archive/2011/01/05/137993.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cj1205/comments/commentRss/137993.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cj1205/services/trackbacks/137993.html</trackback:ping><description><![CDATA[<p>转载自：http://blogger.org.cn/blog/more.asp?name=FoxWolf&amp;id=29997
<br></p>
<p>【例一】</p>
<p>用cl编译两个小程序如下：<br><br>程序1:</p>
<p>int&nbsp;ar[30000];<br>void&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;......<br>} </p>
<p><br>程序2:</p>
<p>int&nbsp;ar[300000]&nbsp;=&nbsp; {1,&nbsp;2,&nbsp;3,&nbsp;4,&nbsp;5,&nbsp;6&nbsp;};<br>void&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;......<br>} </p>
<p><br>发现程序2编译之后所得的.exe文件比程序1的要大得多。当下甚为不解，于是手工编译了一下，并使用了/FAs编译选项来查看了一下其各自的.asm，发现在程序1.asm中ar的定义如下：</p>
<p>_BSS&nbsp;SEGMENT<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?ar@@3PAHA&nbsp;DD&nbsp;0493e0H&nbsp;DUP&nbsp;(?)&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;ar<br>_BSS&nbsp;ENDS </p>
<p><br>而在程序2.asm中，ar被定义为：</p>
<p>_DATA&nbsp;SEGMENT<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?ar@@3PAHA&nbsp;DD&nbsp;01H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;ar<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DD&nbsp;02H<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DD&nbsp;03H<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORG&nbsp;$+1199988<br>_DATA&nbsp;ENDS </p>
<p style="background-color: white; background-image: none; background-repeat: repeat; background-attachment: scroll; background-position: 0% 50%; -moz-background-size: auto auto; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; line-height: 160%;"><br><font face="宋体">区别很明显，一个位于</font>.bss<font face="宋体">段，而另一个位于</font>.data<font face="宋体">段，两者的区别在于：全局的未初始化变量存在于</font>.bss<font face="宋体">段中，具体体现为一个占位符；全局的已初始化变量存于</font>.data<font face="宋体">段中；而函数内的自动变量都在栈上分配空间。</font>.bss<font face="宋体">是不占用</font>.exe<font face="宋体">文件空间的，其内容由操作系统初始化（清零）；而</font>.data<font face="宋体">却需要占用，其内容由程序初始化，因此造成了上述情况。</font></p>
<p style="background-color: white; background-image: none; background-repeat: repeat; background-attachment: scroll; background-position: 0% 50%; -moz-background-size: auto auto; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; line-height: 160%;"><font face="宋体">【例二】</font></p>
<p style="background-color: white; background-image: none; background-repeat: repeat; background-attachment: scroll; background-position: 0% 50%; -moz-background-size: auto auto; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; line-height: 160%;"><font face="宋体">编译如下程序（</font>test.cpp<font face="宋体">）</font>:<br>#include &lt;stdio.h&gt;<br><br>#define LEN 1002000<br><br>int inbss[LEN];<br>float fA;<br>int indata[LEN]={1,2,3,4,5,6,7,8,9};<br>double dbB = 100.0;<br><br>const int cst = 100;<br><br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp; int run[100] = {1,2,3,4,5,6,7,8,9};<br>&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;LEN; ++i)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("%d ", inbss[i]);<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br><br><font face="宋体">命令：</font>cl /FA&nbsp; test.cpp <font face="宋体">回车</font> (/FA:<font face="宋体">产生汇编代码</font>)<br><font face="宋体">产生的汇编代码</font>(test.asm):<br>&nbsp;&nbsp;&nbsp; TITLE&nbsp;&nbsp; &nbsp;test.cpp<br>&nbsp;&nbsp;&nbsp; .386P<br>include listing.inc<br>if @Version gt 510<br>.model FLAT<br>else<br>_TEXT&nbsp;&nbsp; &nbsp;SEGMENT PARA USE32 PUBLIC 'CODE'<br>_TEXT&nbsp;&nbsp; &nbsp;ENDS<br>_DATA&nbsp;&nbsp; &nbsp;SEGMENT DWORD USE32 PUBLIC 'DATA'<br>_DATA&nbsp;&nbsp; &nbsp;ENDS<br>CONST&nbsp;&nbsp; &nbsp;SEGMENT DWORD USE32 PUBLIC 'CONST'<br>CONST&nbsp;&nbsp; &nbsp;ENDS<br>_BSS&nbsp;&nbsp; &nbsp;SEGMENT DWORD USE32 PUBLIC 'BSS'<br>_BSS&nbsp;&nbsp; &nbsp;ENDS<br>_TLS&nbsp;&nbsp; &nbsp;SEGMENT DWORD USE32 PUBLIC 'TLS'<br>_TLS&nbsp;&nbsp; &nbsp;ENDS<br>FLAT&nbsp;&nbsp; &nbsp;GROUP _DATA, CONST, _BSS<br>&nbsp;&nbsp;&nbsp; ASSUME&nbsp;&nbsp; &nbsp;CS: FLAT, DS: FLAT, SS: FLAT<br>endif<br>PUBLIC&nbsp;&nbsp; &nbsp;?inbss@@3PAHA&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;; inbss<br>PUBLIC&nbsp;&nbsp; &nbsp;?fA@@3MA&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;; fA<br>PUBLIC&nbsp;&nbsp; &nbsp;?indata@@3PAHA&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;; indata<br>PUBLIC&nbsp;&nbsp; &nbsp;?dbB@@3NA&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;; dbB<br>_BSS&nbsp;&nbsp; &nbsp;SEGMENT<br>?inbss@@3PAHA DD 0f4a10H DUP (?)&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;; inbss<br>?fA@@3MA DD&nbsp;&nbsp; &nbsp;01H DUP (?)&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;; fA<br>_BSS&nbsp;&nbsp; &nbsp;ENDS<br>_DATA&nbsp;&nbsp; &nbsp;SEGMENT<br>?indata@@3PAHA DD 01H&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;; indata<br>&nbsp;&nbsp;&nbsp; DD&nbsp;&nbsp; &nbsp;02H<br>&nbsp;&nbsp;&nbsp; DD&nbsp;&nbsp; &nbsp;03H<br>&nbsp;&nbsp;&nbsp; DD&nbsp;&nbsp; &nbsp;04H<br>&nbsp;&nbsp;&nbsp; DD&nbsp;&nbsp; &nbsp;05H<br>&nbsp;&nbsp;&nbsp; DD&nbsp;&nbsp; &nbsp;06H<br>&nbsp;&nbsp;&nbsp; DD&nbsp;&nbsp; &nbsp;07H<br>&nbsp;&nbsp;&nbsp; DD&nbsp;&nbsp; &nbsp;08H<br>&nbsp;&nbsp;&nbsp; DD&nbsp;&nbsp; &nbsp;09H<br>&nbsp;&nbsp;&nbsp; ORG $+4007964<br>?dbB@@3NA DQ&nbsp;&nbsp; &nbsp;04059000000000000r&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;; 100&nbsp;&nbsp; &nbsp;; dbB<br>_DATA&nbsp;&nbsp; &nbsp;ENDS<br>PUBLIC&nbsp;&nbsp; &nbsp;_main<br>EXTRN&nbsp;&nbsp; &nbsp;_printf:NEAR<br>_DATA&nbsp;&nbsp; &nbsp;SEGMENT<br>$SG537&nbsp;&nbsp; &nbsp;DB&nbsp;&nbsp; &nbsp;'%d ', 00H<br>_DATA&nbsp;&nbsp; &nbsp;ENDS<br>_TEXT&nbsp;&nbsp; &nbsp;SEGMENT<br>_run$ = -400<br>_i$ = -404<br>_main&nbsp;&nbsp; &nbsp;PROC NEAR<br>; File test.cpp<br>; Line 13<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; &nbsp;ebp<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; &nbsp;ebp, esp<br>&nbsp;&nbsp;&nbsp; sub&nbsp;&nbsp; &nbsp;esp, 404&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;; 00000194H<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; &nbsp;edi<br>; Line 14<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; &nbsp;DWORD PTR _run$[ebp], 1<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; &nbsp;DWORD PTR _run$[ebp+4], 2<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; &nbsp;DWORD PTR _run$[ebp+8], 3<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; &nbsp;DWORD PTR _run$[ebp+12], 4<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; &nbsp;DWORD PTR _run$[ebp+16], 5<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; &nbsp;DWORD PTR _run$[ebp+20], 6<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; &nbsp;DWORD PTR _run$[ebp+24], 7<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; &nbsp;DWORD PTR _run$[ebp+28], 8<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; &nbsp;DWORD PTR _run$[ebp+32], 9<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; &nbsp;ecx, 91&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;; 0000005bH<br>&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp; &nbsp;eax, eax<br>&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp; &nbsp;edi, DWORD PTR _run$[ebp+36]<br>&nbsp;&nbsp;&nbsp; rep stosd<br>; Line 15<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; &nbsp;DWORD PTR _i$[ebp], 0<br>&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp; &nbsp;SHORT $L534<br>$L535:<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; &nbsp;eax, DWORD PTR _i$[ebp]<br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp; &nbsp;eax, 1<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; &nbsp;DWORD PTR _i$[ebp], eax<br>$L534:<br>&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp; &nbsp;DWORD PTR _i$[ebp], 1002000&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;; 000f4a10H<br>&nbsp;&nbsp;&nbsp; jge&nbsp;&nbsp; &nbsp;SHORT $L536<br>; Line 16<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; &nbsp;ecx, DWORD PTR _i$[ebp]<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; &nbsp;edx, DWORD PTR ?inbss@@3PAHA[ecx*4]<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; &nbsp;edx<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; &nbsp;OFFSET FLAT:$SG537<br>&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp; &nbsp;_printf<br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp; &nbsp;esp, 8<br>&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp; &nbsp;SHORT $L535<br>$L536:<br>; Line 17<br>&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp; &nbsp;eax, eax<br>; Line 18<br>&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; &nbsp;edi<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; &nbsp;esp, ebp<br>&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; &nbsp;ebp<br>&nbsp;&nbsp;&nbsp; ret&nbsp;&nbsp; &nbsp;0<br>_main&nbsp;&nbsp; &nbsp;ENDP<br>_TEXT&nbsp;&nbsp; &nbsp;ENDS<br>END<br>&nbsp;<font face="宋体">－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</font><br><font face="宋体">通过汇编文件可以看到，数组</font>inbss<font face="宋体">和</font>indata<font face="宋体">位于不同的段（</font>inbss<font face="宋体">位于</font>bss<font face="宋体">段，而</font>indata<font face="宋体">位于</font>data<font face="宋体">段）</font><br><font face="宋体">若把</font>test.cpp<font face="宋体">中的</font>indata<font face="宋体">数组拿掉，查看生成的</font>exe<font face="宋体">文件的大小，可以发现，</font>indata<font face="宋体">拿掉之后</font>exe<font face="宋体">文件的大小小了很多。而若拿掉的是</font>inbss<font face="宋体">数组，</font>exe<font face="宋体">文件大小跟没拿掉时相差无几。</font><br><br><font face="宋体">说明了：</font><br>bss<font face="宋体">段（未手动初始化的数据）并不给该段的数据分配空间，只是记录数据所需空间的大小。</font><br>data<font face="宋体">（已手动初始化的数据）段则为数据分配空间，数据保存在目标文件中。</font></p>
<font face="宋体">数据段包含经过初始化的全局变量以及它们的值。</font>BSS<font face="宋体">段的大小从可执行文件中得到</font> <font face="宋体">，然后链接器得到这个大小的内存块，紧跟在数据段后面。当这个内存区进入程序的地址空间后全部清零。包含数据段和</font>BSS<font face="宋体">段的整个区段此时通常称为数据区。</font>
<br><img src ="http://www.cppblog.com/cj1205/aggbug/137993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cj1205/" target="_blank">向前看勿回头</a> 2011-01-05 10:20 <a href="http://www.cppblog.com/cj1205/archive/2011/01/05/137993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>整理：如何打开独占文件</title><link>http://www.cppblog.com/cj1205/archive/2010/11/11/133288.html</link><dc:creator>向前看勿回头</dc:creator><author>向前看勿回头</author><pubDate>Thu, 11 Nov 2010 03:17:00 GMT</pubDate><guid>http://www.cppblog.com/cj1205/archive/2010/11/11/133288.html</guid><wfw:comment>http://www.cppblog.com/cj1205/comments/133288.html</wfw:comment><comments>http://www.cppblog.com/cj1205/archive/2010/11/11/133288.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cj1205/comments/commentRss/133288.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cj1205/services/trackbacks/133288.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转载自：http://apps.hi.baidu.com/share/detail/15620617#content方法一：修改句柄访问权限 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  所有被占用的文件通常都可以用读属性（FILE_READ_ATTRIBUTES）打开，这样就可以读取文件的属性，取得它的大小，枚举NTSF &nbsp;&nbsp;&nbsp;&nbs...&nbsp;&nbsp;<a href='http://www.cppblog.com/cj1205/archive/2010/11/11/133288.html'>阅读全文</a><img src ="http://www.cppblog.com/cj1205/aggbug/133288.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cj1205/" target="_blank">向前看勿回头</a> 2010-11-11 11:17 <a href="http://www.cppblog.com/cj1205/archive/2010/11/11/133288.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用SDK截图</title><link>http://www.cppblog.com/cj1205/archive/2010/11/02/132160.html</link><dc:creator>向前看勿回头</dc:creator><author>向前看勿回头</author><pubDate>Tue, 02 Nov 2010 08:56:00 GMT</pubDate><guid>http://www.cppblog.com/cj1205/archive/2010/11/02/132160.html</guid><wfw:comment>http://www.cppblog.com/cj1205/comments/132160.html</wfw:comment><comments>http://www.cppblog.com/cj1205/archive/2010/11/02/132160.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cj1205/comments/commentRss/132160.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cj1205/services/trackbacks/132160.html</trackback:ping><description><![CDATA[<p>转载自：http://blog.csdn.net/Lsaint/archive/2006/11/05/1367832.aspx</p>
<p><br></p>
<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: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">windows.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;std;<br><br></span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;SaveBitmapToFile(HDC&nbsp;hDC&nbsp;,&nbsp;HBITMAP&nbsp;hBitmap&nbsp;,&nbsp;LPCTSTR&nbsp;name)<br>{<br>&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">BITMAP是个结构，记录了已调入内存的BMP图象的宽高，颜色等信息以及图象数据<br>&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">与系统当前得显示模式，色深有关。</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;BITMAP&nbsp;bm;&nbsp;<br>&nbsp;DWORD&nbsp;size;<br>&nbsp;GetObject(hBitmap,</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(bm),(LPBYTE)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">bm);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;SDK中从HBITMAP获得BITMAP的方法&nbsp;MFC中用GetBitmap</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;size&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;bm.bmWidthBytes</span><span style="color: #000000;">*</span><span style="color: #000000;">bm.bmHeight;<br><br>&nbsp;HGLOBAL&nbsp;hMen&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;GlobalAlloc(GMEM_FIXED</span><span style="color: #000000;">|</span><span style="color: #000000;">GMEM_ZEROINIT,size);</span><span style="color: #008000;">//</span><span style="color: #008000;">从堆中分配内存</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(hMen</span><span style="color: #000000;">==</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br><br>&nbsp;LPSTR&nbsp;lpData&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(LPSTR)GlobalLock(hMen);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;锁定分配的内存并获得指针</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;BITMAPINFOHEADER&nbsp;bih;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;位图信息头</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;bih.biSize&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(BITMAPINFOHEADER);<br>&nbsp;bih.biWidth&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;bm.bmWidth;<br>&nbsp;bih.biHeight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;bm.bmHeight;<br>&nbsp;bih.biPlanes&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;bih.biBitCount&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;bm.bmBitsPixel;<br>&nbsp;bih.biCompression&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;bih.biSizeImage&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;bih.biXPelsPerMeter&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;bih.biYPelsPerMeter&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;bih.biClrUsed&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;bih.biClrImportant&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><br>&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(GetDIBits(hDC,hBitmap,</span><span style="color: #000000;">0</span><span style="color: #000000;">,bih.biHeight,lpData,(BITMAPINFO</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">bih,DIB_RGB_COLORS)</span><span style="color: #000000;">==</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br>&nbsp;{</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;将位图中的数据以bits的形式放入lpData指向的内存单元</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;GlobalFree(hMen);<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br>&nbsp;}<br><br>&nbsp;BITMAPFILEHEADER&nbsp;bfh;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;位图文件头</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;bfh.bfType&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;((WORD)(</span><span style="color: #000000;">'</span><span style="color: #000000;">M</span><span style="color: #000000;">'</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">8</span><span style="color: #000000;">)</span><span style="color: #000000;">|</span><span style="color: #000000;">'</span><span style="color: #000000;">B</span><span style="color: #000000;">'</span><span style="color: #000000;">);<br>&nbsp;bfh.bfReserved1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;bfh.bfReserved2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;bfh.bfSize&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(bfh)</span><span style="color: #000000;">+</span><span style="color: #000000;">size;<br>&nbsp;bfh.bfOffBits&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(bfh);<br><br>&nbsp;HANDLE&nbsp;hFile;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;MFC中用CFile</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;DWORD&nbsp;dWrittenNum;<br>&nbsp;hFile&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;CreateFile(name,GENERIC_READ</span><span style="color: #000000;">|</span><span style="color: #000000;">GENERIC_WRITE,</span><span style="color: #000000;">0</span><span style="color: #000000;">,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);<br>&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;hFile&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;INVALID_HANDLE_VALUE&nbsp;)<br>&nbsp;{<br>&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">CREATE&nbsp;FILE&nbsp;FALSE</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br>&nbsp;}<br>&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">SetFilePointer(hFile,0,0,FILE_BEGIN);<br>&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">MFC&nbsp;用WriteHuge()<br>&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。&nbsp;&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;WriteFile(hFile,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">bfh,</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(bfh),</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">dWrittenNum,</span><span style="color: #000000;">0</span><span style="color: #000000;">);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;文件头<br>&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">SetFilePointer(hFile,sizeof(bfh),0,FILE_BEGIN);</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;WriteFile(hFile,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">bih,</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(bih),</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">dWrittenNum,</span><span style="color: #000000;">0</span><span style="color: #000000;">);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;位图信息头</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;WriteFile(hFile,lpData,size,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">dWrittenNum,</span><span style="color: #000000;">0</span><span style="color: #000000;">);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;图形数据</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;CloseHandle(hFile);<br>&nbsp;GlobalFree(hMen);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;打扫</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br>&nbsp;<br>}<br><br>&nbsp;<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br>{<br><br>&nbsp;HDC&nbsp;hDC&nbsp;,&nbsp;hmDC;<br>&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nWidth&nbsp;,&nbsp;nHeight;<br>&nbsp;HBITMAP&nbsp;hBitmap&nbsp;;<br>&nbsp;<br>&nbsp;hDC&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;CreateDC(</span><span style="color: #000000;">"</span><span style="color: #000000;">DISPLAY</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;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">);&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;用DISPLAY参数获得整个屏幕DC</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;nWidth&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;GetDeviceCaps(hDC,HORZRES);<br>&nbsp;nHeight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;GetDeviceCaps(hDC,VERTRES);<br>&nbsp;hmDC&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;CreateCompatibleDC(hDC);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;内存DC</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;hBitmap&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;CreateCompatibleBitmap(hDC,nWidth,nHeight);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;内存位图</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;SelectObject(hmDC&nbsp;,&nbsp;hBitmap);<br>&nbsp;BitBlt(hmDC,</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">,nWidth,nHeight,hDC,</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">,SRCCOPY);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;把屏幕DC的内容BitBlt到内存DC&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br><br>#ifdef&nbsp;STORE_IN_CLIPBOARD<br>&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">((OpenClipboard(NULL)</span><span style="color: #000000;">!=</span><span style="color: #000000;">0</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">(EmptyClipboard()</span><span style="color: #000000;">!=</span><span style="color: #000000;">0</span><span style="color: #000000;">))&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;打开&amp;清空剪贴板</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;SetClipboardData(CF_BITMAP,hBitmap);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;写入剪贴板</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;CloseClipboard();<br>&nbsp;}<br></span><span style="color: #0000ff;">#else</span><span style="color: #000000;"><br>&nbsp;LPCTSTR&nbsp;name;<br>&nbsp;name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">C:\\lsaint.bmp</span><span style="color: #000000;">"</span><span style="color: #000000;">;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;文件保存路径</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;<br>&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">SaveBitmapToFile(hDC,hBitmap,name))<br>&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">false</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br></span><span style="color: #0000ff;">#endif</span><span style="color: #000000;"><br><br>&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br><br>}&nbsp;</span></div>
<br>
<p>&nbsp;</p>
<p>参考：</p>
<p>《编写自己的屏幕捕获木马》&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作者：RITATV<br>《GetBitmapBits和GetDIBits的区别》 作者：笨笨</p>
<p><a href="http://dev.csdn.net/develop/article/12/12484.shtm">http://dev.csdn.net/develop/article/12/12484.shtm</a><br><a href="http://dev.csdn.net/develop/article/7/7293.shtm">http://dev.csdn.net/develop/article/7/7293.shtm</a></p><img src ="http://www.cppblog.com/cj1205/aggbug/132160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cj1205/" target="_blank">向前看勿回头</a> 2010-11-02 16:56 <a href="http://www.cppblog.com/cj1205/archive/2010/11/02/132160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用TinyXml</title><link>http://www.cppblog.com/cj1205/archive/2010/10/26/131339.html</link><dc:creator>向前看勿回头</dc:creator><author>向前看勿回头</author><pubDate>Tue, 26 Oct 2010 07:53:00 GMT</pubDate><guid>http://www.cppblog.com/cj1205/archive/2010/10/26/131339.html</guid><wfw:comment>http://www.cppblog.com/cj1205/comments/131339.html</wfw:comment><comments>http://www.cppblog.com/cj1205/archive/2010/10/26/131339.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cj1205/comments/commentRss/131339.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cj1205/services/trackbacks/131339.html</trackback:ping><description><![CDATA[<p>使用TinyXml的两种方法。</p>
<p>第一，导入所需的头文件和cpp文件</p>
<p>TinyXml
由两个头文件（.h文件）和四个CPP文件（.cpp文件）构成，用的时候，只要将（tinyxml.h、tinystr.h、tinystr.cpp、
tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp）导入工程就可以用它的东西了。
这就是开源的好处，就跟你自己写的程序一样，想怎么用都行。<br></p>
<p>当然，每次都导入这些文件也有点麻烦，这时你可以采用第二种方法。</p>
<p>&nbsp;</p>
<p>第二 ，编译TinyXml的工程文件生成所需的lib库<br></p>
<p>从网上下载下来的TinyXml库会有现成的工程文件，编译后可以生成你所需的lib库，Debug、Release或是stl版的Debug、Release</p>
<p>在你的编译器的附加包含目录里添加tinyxml/include(目录自己建，放入这两个头文件tinyxml.h、tinystr.h) <br></p>
<p>附加库目录里添加tinyxml/lib（放入你编译好的lib库） <br></p>
<p>在属性-&gt;附加库里填上所需的库文件名 就OK了。<br></p>
<p>另外，要将开发的项目设成多线程的，否则会出现链接错误，这样就应该没什么问题了。</p><img src ="http://www.cppblog.com/cj1205/aggbug/131339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cj1205/" target="_blank">向前看勿回头</a> 2010-10-26 15:53 <a href="http://www.cppblog.com/cj1205/archive/2010/10/26/131339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>合并排序法（转载自csdn）</title><link>http://www.cppblog.com/cj1205/archive/2010/10/11/129449.html</link><dc:creator>向前看勿回头</dc:creator><author>向前看勿回头</author><pubDate>Mon, 11 Oct 2010 08:57:00 GMT</pubDate><guid>http://www.cppblog.com/cj1205/archive/2010/10/11/129449.html</guid><wfw:comment>http://www.cppblog.com/cj1205/comments/129449.html</wfw:comment><comments>http://www.cppblog.com/cj1205/archive/2010/10/11/129449.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/cj1205/comments/commentRss/129449.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cj1205/services/trackbacks/129449.html</trackback:ping><description><![CDATA[合并排序的关键步骤在于合并步骤中的合并两个已排序子序列。为做排序，引入一个辅助过程merger(A,p,q,r)，其中A是个数组，pqr是下标，
满足p&lt;= q &lt;
r。该过程假设A[p..q]和A[q+1..r]都已排序，并将它们合并成一个已经排好序的子数组代替当前子数组A[p..r]<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</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;">#include</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdlib.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;">void</span><span style="color: #000000;">&nbsp;merger(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;A,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;p,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;q,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;r);<br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;mergerSort(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;A,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;p,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;r);<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;A[</span><span style="color: #000000;">10</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">0</span><span style="color: #000000;">};<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%d</span><span style="color: #000000;">"</span><span style="color: #000000;">,A&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;i);<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">15</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;">输入为：\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%d</span><span style="color: #000000;">"</span><span style="color: #000000;">,A[i]);<br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mergerSort(A,</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">9</span><span style="color: #000000;">);<br></span><span style="color: #008080;">22</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;">\n排序后:\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">;i</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;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%d</span><span style="color: #000000;">"</span><span style="color: #000000;">,A[i]);<br></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">27</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;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #008080;">28</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: #000000;">0</span><span style="color: #000000;">;<br></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;merger(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;A,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;p,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;q,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;r)<br></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;q&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;p&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br></span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;r&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;q&nbsp;;<br></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,k&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br></span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;L&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">*</span><span style="color: #000000;">)malloc(</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;n1&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br></span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;R&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)malloc(</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;n2&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br></span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;n1;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br></span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;L[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;A[p&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;i];<br></span><span style="color: #008080;">40</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;L[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">99999</span><span style="color: #000000;">;<br></span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;n2;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br></span><span style="color: #008080;">43</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">44</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;A[q&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">];<br></span><span style="color: #008080;">45</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">46</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">99999</span><span style="color: #000000;">;<br></span><span style="color: #008080;">47</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br></span><span style="color: #008080;">48</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">49</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(k&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p;k&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;r;k</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br></span><span style="color: #008080;">50</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">51</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(L[i]&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;R[j])<br></span><span style="color: #008080;">52</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">53</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A[k]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;L[i];<br></span><span style="color: #008080;">54</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br></span><span style="color: #008080;">55</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">56</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br></span><span style="color: #008080;">57</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">58</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A[k]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;R[j];<br></span><span style="color: #008080;">59</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br></span><span style="color: #008080;">60</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">61</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">62</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(R);<br></span><span style="color: #008080;">63</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(L);<br></span><span style="color: #008080;">64</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">65</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;mergerSort(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;A,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;p,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;r)<br></span><span style="color: #008080;">66</span>&nbsp;<span style="color: #000000;">{<br></span><span style="color: #008080;">67</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;mid&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br></span><span style="color: #008080;">68</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(p&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;r)<br></span><span style="color: #008080;">69</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="color: #008080;">70</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mid&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(r&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;p)&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br></span><span style="color: #008080;">71</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mergerSort(A,p,mid);<br></span><span style="color: #008080;">72</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mergerSort(A,mid&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,r);&nbsp;<br></span><span style="color: #008080;">73</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;merger(A,p,mid,r);<br></span><span style="color: #008080;">74</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">75</span>&nbsp;<span style="color: #000000;">}&nbsp;</span></div>
<br>运行结果：<br>chu@szcdebian:~/code/merge-sort$ gcc -o merge merge-sort.c<br>chu@szcdebian:~/code/merge-sort$ ./merge<br>9 0 6 8 7 3 4 2 5 1<br>输入为：<br>9068734251<br>排序后:<br>0123456789<br>chu@szcdebian:~/code/merge-sort$&nbsp;  <img src ="http://www.cppblog.com/cj1205/aggbug/129449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cj1205/" target="_blank">向前看勿回头</a> 2010-10-11 16:57 <a href="http://www.cppblog.com/cj1205/archive/2010/10/11/129449.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>