﻿<?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++博客-来吧，朋友!-随笔分类-C++开发工具</title><link>http://www.cppblog.com/guying2008/category/11138.html</link><description>为C++疯狂</description><language>zh-cn</language><lastBuildDate>Thu, 30 Jul 2009 06:45:52 GMT</lastBuildDate><pubDate>Thu, 30 Jul 2009 06:45:52 GMT</pubDate><ttl>60</ttl><item><title>观察者模式解析</title><link>http://www.cppblog.com/guying2008/archive/2009/07/22/90864.html</link><dc:creator>yanghaibao</dc:creator><author>yanghaibao</author><pubDate>Wed, 22 Jul 2009 15:19:00 GMT</pubDate><guid>http://www.cppblog.com/guying2008/archive/2009/07/22/90864.html</guid><description><![CDATA[软件设计中会碰到这样的关系：一个对象依赖于另一个对象，必须根据后者的状态更新自己的状态，可以把后者称作目标对象，前者称作观察者对象。不但观察者依赖于目标，当目标的状态改变时也要通知观察者，这就出现了双向的依赖。两个对象互相依赖的后果是它们必须一起复用。如果一个目标有多个观察者，那么目标也依赖所有观察者，从而目标对象无法独立复用。如何消除目标和观察者之间的互相依赖呢？观察者模式帮助我们解决这个问题。<br><br>观察者模式把目标对观察者的依赖进行抽象：使目标只知道自己有若干观察者，但不知道这些观察者具体是谁，可能有多少个；当目标状态改变时只要给这些观察者一个通知，不必作更多的事情。这样目标对观察者的依赖就达到了抽象和最小，而目标对具体观察者的依赖被解除了。<br><br>类图如下：<br><br><img src="http://www.cppblog.com/WebResource.axd?d=pLXXeGbWF7eXU8SMs2-GFZvUWY2JNH05dFx5YzJhGUYAYJAFEaTEq36NAhTPy7_KekvzDFwt8wvQWdByvJIGWdEq6x2KpKD80&amp;t=632780334567500000" width=1 height=1><img border=0 alt=Observer.JPG src="http://www.cppblog.com/images/cppblog_com/zliner/Observer.JPG" width=448 height=340><br><br>Subject 对象保存一个Observer引用的列表，当我们让一个ConcreteObserver对象观察Subject对象时，调用后者的Attach()方法，将前者的引用加入该列表中。当Subject对象状态改变时，它调用自身的Notify方法，该方法调用列表中每一个Observer的 Update()方法。一个ConcreteObserver只要重定义Update()就能收到通知，作为对通知的响应，Update()调用 Subject对象的getStatus()获取数据，然后更新自身。当不需要继续观察时，ConcreteObserver对象调用Subject对象的Detach()方法，其引用被从列表中移除。<br><br>解除目标对具体观察者的依赖以后，很容易增加新的具体观察者，因为不受依赖的方面就可以自由变化；而目标也可以独立地复用，因为无所依赖的方面就可以不受影响。<br><br>以上主要考虑了一个目标有多个观察者的情况，我们设法解除了目标对具体观察者的依赖，使具体观察者的种类和数目容易改变。有时候一个观察者观察多个目标也是有意义的，在前面的类图中，观察者对具体目标的依赖仍然存在，因此无法适应目标方面的变化。怎样抽象这种依赖呢？使观察者只知道若干个目标会向自己发出通知，而不知道这些目标具体是谁，可能有多少个；在目标向观察者发送通知时，将一个自身的引用作为参数，然后观察者调用其抽象方法就可以获得目标状态。这就使得观察者对目标的依赖是抽象的，观察者对具体目标的依赖被解除了。<br><br>类图如下：<br><br><img border=0 alt=Observer2.JPG src="http://www.cppblog.com/images/cppblog_com/zliner/Observer2.JPG" width=541 height=442><br><br>参考资料：<br><br>1.《设计模式-可复用面向对象软件的基础》/Erich Gamma等著，李英军等译 机械工业出版社 
<img src ="http://www.cppblog.com/guying2008/aggbug/90864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guying2008/" target="_blank">yanghaibao</a> 2009-07-22 23:19 <a href="http://www.cppblog.com/guying2008/archive/2009/07/22/90864.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++编程实现计算CPU占用率</title><link>http://www.cppblog.com/guying2008/archive/2009/07/22/90850.html</link><dc:creator>yanghaibao</dc:creator><author>yanghaibao</author><pubDate>Wed, 22 Jul 2009 10:11:00 GMT</pubDate><guid>http://www.cppblog.com/guying2008/archive/2009/07/22/90850.html</guid><description><![CDATA[起学习
<script type=text/javascript><!--
google_ad_client = "pub-7345584400661736";
/* 336x280, 创建于 08-4-7,一起美容 */
google_ad_slot = "6079382880";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type=text/javascript src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"></script>
<script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"></script>
<script>google_protectAndRun("ads_core.google_render_ad", google_handleError, google_render_ad);</script>
<ins style="BORDER-BOTTOM: medium none; POSITION: relative; BORDER-LEFT: medium none; PADDING-BOTTOM: 0pt; MARGIN: 0pt; PADDING-LEFT: 0pt; WIDTH: 336px; PADDING-RIGHT: 0pt; DISPLAY: inline-table; HEIGHT: 280px; VISIBILITY: visible; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0pt"><ins style="BORDER-BOTTOM: medium none; POSITION: relative; BORDER-LEFT: medium none; PADDING-BOTTOM: 0pt; MARGIN: 0pt; PADDING-LEFT: 0pt; WIDTH: 336px; PADDING-RIGHT: 0pt; DISPLAY: block; HEIGHT: 280px; VISIBILITY: visible; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0pt"><iframe style="POSITION: absolute; TOP: 0pt; LEFT: 0pt" id=google_ads_frame1 height=280 marginHeight=0 src="http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-7345584400661736&amp;dt=1248257315881&amp;lmt=1248257308&amp;output=html&amp;slotname=6079382880&amp;correlator=1248257315881&amp;url=http%3A%2F%2Fblog.chinaunix.net%2Fu2%2F67530%2Fshowart_601823.html&amp;cb=1&amp;cd=1&amp;frm=0&amp;ga_vid=2053773672.1248257318&amp;ga_sid=1248257318&amp;ga_hid=1939524883&amp;flash=9.0.124&amp;w=336&amp;h=280&amp;u_h=768&amp;u_w=1024&amp;u_ah=734&amp;u_aw=1024&amp;u_cd=32&amp;u_tz=480&amp;u_his=1&amp;u_nplug=15&amp;u_nmime=47&amp;dtd=M&amp;xpc=zzWxpFM4ja&amp;p=http%3A//blog.chinaunix.net" frameBorder=0 width=336 allowTransparency name=google_ads_frame marginWidth=0 scrolling=no></iframe></ins></ins><!-- 广告完 -->NT/2000方法：<br><br>#include &lt;windows.h&gt;<br>#include &lt;conio.h&gt;<br>#include &lt;stdio.h&gt;<br><br>#define SystemBasicInformation 0<br>#define SystemPerformanceInformation 2<br>#define SystemTimeInformation 3<br><br>#define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 (double)((x).LowPart))<br><br>typedef struct<br>{<br>DWORD dwUnknown1;<br>ULONG uKeMaximumIncrement;<br>ULONG uPageSize;<br>ULONG uMmNumberOfPhysicalPages;<br>ULONG uMmLowestPhysicalPage;<br>ULONG uMmHighestPhysicalPage;<br>ULONG uAllocationGranularity;<br>PVOID pLowestUserAddress;<br>PVOID pMmHighestUserAddress;<br>ULONG uKeActiveProcessors;<br>BYTE bKeNumberProcessors;<br>BYTE bUnknown2;<br>WORD wUnknown3;<br>} SYSTEM_BASIC_INFORMATION;<br><br>typedef struct<br>{<br>LARGE_INTEGER liIdleTime;<br>DWORD dwSpare[76];<br>} SYSTEM_PERFORMANCE_INFORMATION;<br><br>typedef struct<br>{<br>LARGE_INTEGER liKeBootTime;<br>LARGE_INTEGER liKeSystemTime;<br>LARGE_INTEGER liExpTimeZoneBias;<br>ULONG uCurrentTimeZoneId;<br>DWORD dwReserved;<br>} SYSTEM_TIME_INFORMATION;<br><br><br>// ntdll!NtQuerySystemInformation (NT specific!)<br>//<br>// The function copies the system information of the<br>// specified type into a buffer<br>//<br>// NTSYSAPI<br>// NTSTATUS<br>// NTAPI<br>// NtQuerySystemInformation(<br>// IN UINT SystemInformationClass, // information type<br>// OUT PVOID SystemInformation, // pointer to buffer<br>// IN ULONG SystemInformationLength, // buffer size in bytes<br>// OUT PULONG ReturnLength OPTIONAL // pointer to a 32-bit<br>// // variable that receives<br>// // the number of bytes<br>// // written to the buffer <br>// );<br>typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);<br><br>PROCNTQSI NtQuerySystemInformation;<br><br><br>void main(void)<br>{<br>SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;<br>SYSTEM_TIME_INFORMATION SysTimeInfo;<br>SYSTEM_BASIC_INFORMATION SysBaseInfo;<br>double dbIdleTime;<br>double dbSystemTime;<br>LONG status;<br>LARGE_INTEGER liOldIdleTime = {0,0};<br>LARGE_INTEGER liOldSystemTime = {0,0};<br><br>NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(<br>GetModuleHandle("ntdll"),<br>"NtQuerySystemInformation"<br>);<br><br>if (!NtQuerySystemInformation)<br>return;<br><br>// get number of processors in the system<br>status = NtQuerySystemInformation(SystemBasicInformation,&amp;SysBaseInfo,sizeof(SysBaseInfo),NULL);<br>if (status != NO_ERROR)<br>return;<br><br>printf("\nCPU Usage (press any key to exit): ");<br>while(!_kbhit())<br>{<br>// get new system time<br>status = NtQuerySystemInformation(SystemTimeInformation,&amp;SysTimeInfo,sizeof(SysTimeInfo),0);<br>if (status!=NO_ERROR)<br>return;<br><br>// get new CPU's idle time<br>status = NtQuerySystemInformation(SystemPerformanceInformation,&amp;SysPerfInfo,sizeof(SysPerfInfo),NULL);<br>if (status != NO_ERROR)<br>return;<br><br><span class=sp874>// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=424&amp;d=7jw23a</span><br>// if it's a first call - skip it<br>if (liOldIdleTime.QuadPart != 0)<br>{<br>// CurrentValue = NewValue - OldValue<br>dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);<br>dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);<br><br>// CurrentCpuIdle = IdleTime / SystemTime<br>dbIdleTime = dbIdleTime / dbSystemTime;<br><br>// CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors<br>dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SysBaseInfo.bKeNumberProcessors 0.5;<br><br>printf("\b\b\b\b=%%",(UINT)dbIdleTime);<br>}<br><br>// store new CPU's idle and system time<br>liOldIdleTime = SysPerfInfo.liIdleTime;<br>liOldSystemTime = SysTimeInfo.liKeSystemTime;<br><br>// wait one second<br>Sleep(1000);<br>}<br>printf("\n");<br>}<br><br>//-------------------------------------------------------------<br><br>W9X:<br>#include &lt;windows.h&gt;<br>#include &lt;conio.h&gt;<br>#include &lt;stdio.h&gt;<br><br>void main(void)<br>{<br>HKEY hkey;<br>DWORD dwDataSize;<br>DWORD dwType;<br>DWORD dwCpuUsage;<br><br>// starting the counter<br>if ( RegOpenKeyEx( HKEY_DYN_DATA,<br>"PerfStats\\StartStat",<br>0,KEY_ALL_ACCESS,<br>&amp;hkey ) != ERROR_SUCCESS)<br>return;<br><br>dwDataSize=sizeof(DWORD);<br>RegQueryValueEx( hkey,<br>"KERNEL\\CPUUsage",<br>NULL,&amp;dwType,<br>(LPBYTE)&amp;dwCpuUsage,<br>&amp;dwDataSize );<br><br>RegCloseKey(hkey);<br><br>// geting current counter's value<br>if ( RegOpenKeyEx( HKEY_DYN_DATA,<br>"PerfStats\\StatData",<br>0,KEY_READ,<br>&amp;hkey ) != ERROR_SUCCESS)<br>return;<br><br>printf("\nCPU Usage (press any key to exit): ");<br>while(!_kbhit())<br>{<br>dwDataSize=sizeof(DWORD);<br>RegQueryValueEx( hkey,<br>"KERNEL\\CPUUsage",<br>NULL,&amp;dwType,<br>(LPBYTE)&amp;dwCpuUsage,<br>&amp;dwDataSize );<br>Sleep(500);<br>printf("\b\b\b\b=%%",dwCpuUsage);<br>}<br>printf("\n");<br><br>RegCloseKey(hkey);<br><br>// stoping the counter<br>if ( RegOpenKeyEx( HKEY_DYN_DATA,<br>"PerfStats\\StopStat",<br>0,KEY_ALL_ACCESS,<br>&amp;hkey ) != ERROR_SUCCESS)<br>return;<br><br>dwDataSize=sizeof(DWORD);<br>RegQueryValueEx( hkey,<br>"KERNEL\\CPUUsage",<br>NULL,&amp;dwType,<br>(LPBYTE)&amp;dwCpuUsage,<br>&amp;dwDataSize );<br><br>RegCloseKey(hkey);<br>}
<script type=text/javascript><!--
google_ad_client = "pub-7345584400661736";
/* 728x15, 创建于 08-4-7一起美容（文字链接） */
google_ad_slot = "6959625474";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type=text/javascript src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<script>google_protectAndRun("ads_core.google_render_ad", google_handleError, google_render_ad);</script>
<ins style="BORDER-BOTTOM: medium none; POSITION: relative; BORDER-LEFT: medium none; PADDING-BOTTOM: 0pt; MARGIN: 0pt; PADDING-LEFT: 0pt; WIDTH: 728px; PADDING-RIGHT: 0pt; DISPLAY: inline-table; HEIGHT: 15px; VISIBILITY: visible; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0pt"><ins style="BORDER-BOTTOM: medium none; POSITION: relative; BORDER-LEFT: medium none; PADDING-BOTTOM: 0pt; MARGIN: 0pt; PADDING-LEFT: 0pt; WIDTH: 728px; PADDING-RIGHT: 0pt; DISPLAY: block; HEIGHT: 15px; VISIBILITY: visible; BORDER-TOP: medium none; BORDER-RIGHT: medium none; PADDING-TOP: 0pt"><iframe style="POSITION: absolute; TOP: 0pt; LEFT: 0pt" id=google_ads_frame2 height=15 marginHeight=0 src="http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-7345584400661736&amp;dt=1248257318006&amp;lmt=1248257308&amp;prev_slotnames=6079382880&amp;output=html&amp;slotname=6959625474&amp;correlator=1248257315881&amp;url=http%3A%2F%2Fblog.chinaunix.net%2Fu2%2F67530%2Fshowart_601823.html&amp;cb=1&amp;cd=1&amp;frm=0&amp;ga_vid=2053773672.1248257318&amp;ga_sid=1248257318&amp;ga_hid=1939524883&amp;flash=9.0.124&amp;w=728&amp;h=15&amp;u_h=768&amp;u_w=1024&amp;u_ah=734&amp;u_aw=1024&amp;u_cd=32&amp;u_tz=480&amp;u_his=1&amp;u_nplug=15&amp;u_nmime=47&amp;dtd=4&amp;xpc=ivcWVwcBPa&amp;p=http%3A//blog.chinaunix.net" frameBorder=0 width=728 allowTransparency name=google_ads_frame marginWidth=0 scrolling=no></iframe></ins></ins>NT/2000方法：<br><br>#include &lt;windows.h&gt;<br>#include &lt;conio.h&gt;<br>#include &lt;stdio.h&gt;<br><br>#define SystemBasicInformation 0<br>#define SystemPerformanceInformation 2<br>#define SystemTimeInformation 3<br><br>#define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 (double)((x).LowPart))<br><br>typedef struct<br>{<br>DWORD dwUnknown1;<br>ULONG uKeMaximumIncrement;<br>ULONG uPageSize;<br>ULONG uMmNumberOfPhysicalPages;<br>ULONG uMmLowestPhysicalPage;<br>ULONG uMmHighestPhysicalPage;<br>ULONG uAllocationGranularity;<br>PVOID pLowestUserAddress;<br>PVOID pMmHighestUserAddress;<br>ULONG uKeActiveProcessors;<br>BYTE bKeNumberProcessors;<br>BYTE bUnknown2;<br>WORD wUnknown3;<br>} SYSTEM_BASIC_INFORMATION;<br><br>typedef struct<br>{<br>LARGE_INTEGER liIdleTime;<br>DWORD dwSpare[76];<br>} SYSTEM_PERFORMANCE_INFORMATION;<br><br>typedef struct<br>{<br>LARGE_INTEGER liKeBootTime;<br>LARGE_INTEGER liKeSystemTime;<br>LARGE_INTEGER liExpTimeZoneBias;<br>ULONG uCurrentTimeZoneId;<br>DWORD dwReserved;<br>} SYSTEM_TIME_INFORMATION;<br><br><br>// ntdll!NtQuerySystemInformation (NT specific!)<br>//<br>// The function copies the system information of the<br>// specified type into a buffer<br>//<br>// NTSYSAPI<br>// NTSTATUS<br>// NTAPI<br>// NtQuerySystemInformation(<br>// IN UINT SystemInformationClass, // information type<br>// OUT PVOID SystemInformation, // pointer to buffer<br>// IN ULONG SystemInformationLength, // buffer size in bytes<br>// OUT PULONG ReturnLength OPTIONAL // pointer to a 32-bit<br>// // variable that receives<br>// // the number of bytes<br>// // written to the buffer <br>// );<br>typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);<br><br>PROCNTQSI NtQuerySystemInformation;<br><br><br>void main(void)<br>{<br>SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;<br>SYSTEM_TIME_INFORMATION SysTimeInfo;<br>SYSTEM_BASIC_INFORMATION SysBaseInfo;<br>double dbIdleTime;<br>double dbSystemTime;<br>LONG status;<br>LARGE_INTEGER liOldIdleTime = {0,0};<br>LARGE_INTEGER liOldSystemTime = {0,0};<br><br>NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(<br>GetModuleHandle("ntdll"),<br>"NtQuerySystemInformation"<br>);<br><br>if (!NtQuerySystemInformation)<br>return;<br><br>// get number of processors in the system<br>status = NtQuerySystemInformation(SystemBasicInformation,&amp;SysBaseInfo,sizeof(SysBaseInfo),NULL);<br>if (status != NO_ERROR)<br>return;<br><br>printf("\nCPU Usage (press any key to exit): ");<br>while(!_kbhit())<br>{<br>// get new system time<br>status = NtQuerySystemInformation(SystemTimeInformation,&amp;SysTimeInfo,sizeof(SysTimeInfo),0);<br>if (status!=NO_ERROR)<br>return;<br><br>// get new CPU's idle time<br>status = NtQuerySystemInformation(SystemPerformanceInformation,&amp;SysPerfInfo,sizeof(SysPerfInfo),NULL);<br>if (status != NO_ERROR)<br>return;<br><br><span class=sp874>// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=424&amp;d=7jw23a</span><br>// if it's a first call - skip it<br>if (liOldIdleTime.QuadPart != 0)<br>{<br>// CurrentValue = NewValue - OldValue<br>dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);<br>dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);<br><br>// CurrentCpuIdle = IdleTime / SystemTime<br>dbIdleTime = dbIdleTime / dbSystemTime;<br><br>// CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors<br>dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SysBaseInfo.bKeNumberProcessors 0.5;<br><br>printf("\b\b\b\b=%%",(UINT)dbIdleTime);<br>}<br><br>// store new CPU's idle and system time<br>liOldIdleTime = SysPerfInfo.liIdleTime;<br>liOldSystemTime = SysTimeInfo.liKeSystemTime;<br><br>// wait one second<br>Sleep(1000);<br>}<br>printf("\n");<br>}<br><br>//-------------------------------------------------------------<br><br>W9X:<br>#include &lt;windows.h&gt;<br>#include &lt;conio.h&gt;<br>#include &lt;stdio.h&gt;<br><br>void main(void)<br>{<br>HKEY hkey;<br>DWORD dwDataSize;<br>DWORD dwType;<br>DWORD dwCpuUsage;<br><br>// starting the counter<br>if ( RegOpenKeyEx( HKEY_DYN_DATA,<br>"PerfStats\\StartStat",<br>0,KEY_ALL_ACCESS,<br>&amp;hkey ) != ERROR_SUCCESS)<br>return;<br><br>dwDataSize=sizeof(DWORD);<br>RegQueryValueEx( hkey,<br>"KERNEL\\CPUUsage",<br>NULL,&amp;dwType,<br>(LPBYTE)&amp;dwCpuUsage,<br>&amp;dwDataSize );<br><br>RegCloseKey(hkey);<br><br>// geting current counter's value<br>if ( RegOpenKeyEx( HKEY_DYN_DATA,<br>"PerfStats\\StatData",<br>0,KEY_READ,<br>&amp;hkey ) != ERROR_SUCCESS)<br>return;<br><br>printf("\nCPU Usage (press any key to exit): ");<br>while(!_kbhit())<br>{<br>dwDataSize=sizeof(DWORD);<br>RegQueryValueEx( hkey,<br>"KERNEL\\CPUUsage",<br>NULL,&amp;dwType,<br>(LPBYTE)&amp;dwCpuUsage,<br>&amp;dwDataSize );<br>Sleep(500);<br>printf("\b\b\b\b=%%",dwCpuUsage);<br>}<br>printf("\n");<br><br>RegCloseKey(hkey);<br><br>// stoping the counter<br>if ( RegOpenKeyEx( HKEY_DYN_DATA,<br>"PerfStats\\StopStat",<br>0,KEY_ALL_ACCESS,<br>&amp;hkey ) != ERROR_SUCCESS)<br>return;<br><br>dwDataSize=sizeof(DWORD);<br>RegQueryValueEx( hkey,<br>"KERNEL\\CPUUsage",<br>NULL,&amp;dwType,<br>(LPBYTE)&amp;dwCpuUsage,<br>&amp;dwDataSize );<br><br>RegCloseKey(hkey);<br>} 
<img src ="http://www.cppblog.com/guying2008/aggbug/90850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guying2008/" target="_blank">yanghaibao</a> 2009-07-22 18:11 <a href="http://www.cppblog.com/guying2008/archive/2009/07/22/90850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式解析和实现(C++) Observer 模式</title><link>http://www.cppblog.com/guying2008/archive/2009/07/22/90830.html</link><dc:creator>yanghaibao</dc:creator><author>yanghaibao</author><pubDate>Wed, 22 Jul 2009 06:44:00 GMT</pubDate><guid>http://www.cppblog.com/guying2008/archive/2009/07/22/90830.html</guid><description><![CDATA[<div id=memo>作用：
<p>定义对象间的一种一对多的依赖关系，当一个对象的状态发生改变时，所有依赖于它的对象都得到通知并被自动更新。</p>
<p>UML结构图：</p>
<p align=center><img src="http://soft6.com/upload/news/13/136078/1512000010s.jpeg"></p>
<p>&#160;</p>
<p>解析：</p>
<p>Observer模式定义的是一种一对多的关系，这里的一就是图中的Subject类，而多则是Obesrver类，当Subject类的状态发生变化的时候通知与之对应的Obesrver类们也去相应的更新状态，同时支持动态的添加和删除Observer对象的功能。Obesrver模式的实现要点是，第一一般subject类都是采用链表等容器来存放Observer对象，第二抽取出Observer对象的一些公共的属性形成Observer基类，而Subject中保存的则是Observer类对象的指针，这样就使Subject和具体的Observer实现了解耦，也就是Subject不需要去关心到底是哪个Observer对放进了自己的容器中。生活中有很多例子可以看做是Observer模式的运用，比方说，一个班有一个班主任（Subject），他管理手下的一帮学生（Observer），当班里有一些事情发生需要通知学生的时候，班主任要做的不是逐个学生挨个的通知而是把学生召集起来一起通知，实现了班主任和具体学生的关系解耦。</p>
<p>实现：</p>
<p>1）Observer.h<br></p>
<p>
<p>/**//********************************************************************<br>　　　 created:　　　 2006/07/20<br>　　　 filename:　　　　 Observer.h<br>　　　 author:　　　　　　　 李创<br>　　　　　　　　　　　　　　　 http://www.cppblog.com/converse/</p>
<p>　　　 purpose:　　　 Observer模式的演示代码<br>*********************************************************************/</p>
<p>#ifndef OBSERVER_H<br>#define OBSERVER_H</p>
<p>#include &lt;list&gt;</p>
<p>typedef int STATE;</p>
<p>class Observer;</p>
<p>// Subject抽象基类,只需要知道Observer基类的声明就可以了<br>class Subject<br>{<br>public:<br>　　　 Subject() : m_nSubjectState(-1){}<br>　　　 virtual ~Subject();</p>
<p>　　　 void Notify();　　　　　　　　　　　　　　　　　　　　　　　　　　　 // 通知对象改变状态<br>　　　 void Attach(Observer *pObserver);　　　　　　　 // 新增对象<br>　　　 void Detach(Observer *pObserver);　　　　　　　 // 删除对象</p>
<p>　　　 // 虚函数,提供默认的实现,派生类可以自己实现来覆盖基类的实现<br>　　　 virtual void　　　 SetState(STATE nState);　　　 // 设置状态<br>　　　 virtual STATE　　　 GetState();　　　　　　　 // 得到状态</p>
<p>protected:<br>　　　 STATE m_nSubjectState;　　　　　　　　　　　　　　　　　　　 // 模拟保存Subject状态的变量<br>　　　 std::list&lt;Observer*&gt;　　　 m_ListObserver;　　　 // 保存Observer指针的链表<br>};</p>
<p>// Observer抽象基类<br>class Observer<br>{<br>public:<br>　　　 Observer() : m_nObserverState(-1){}<br>　　　 virtual ~Observer(){}</p>
<p>　　　 // 纯虚函数,各个派生类可能有不同的实现<br>　　　 // 通知Observer状态发生了变化<br>　　　 virtual void Update(Subject* pSubject) = 0;</p>
<p>protected:<br>　　　 STATE m_nObserverState;　　　　　　　　　　　　　　　　　　　 // 模拟保存Observer状态的变量<br>};</p>
<p>// ConcreateSubject类,派生在Subject类<br>class ConcreateSubject<br>　　　 : public Subject<br>{<br>public:<br>　　　 ConcreateSubject() : Subject(){}<br>　　　 virtual ~ConcreateSubject(){}</p>
<p>　　　 // 派生类自己实现来覆盖基类的实现<br>　　　 virtual void　　　 SetState(STATE nState);　　　 // 设置状态<br>　　　 virtual STATE　　　 GetState();　　　　　　　 // 得到状态</p>
<p>};</p>
<p>// ConcreateObserver类派生自Observer<br>class ConcreateObserver<br>　　　 : public Observer<br>{<br>public:<br>　　　 ConcreateObserver() : Observer(){}<br>　　　 virtual ~ConcreateObserver(){}</p>
<p>　　　 // 虚函数,实现基类提供的接口<br>　　　 virtual void Update(Subject* pSubject);<br>};</p>
<p>#endif<br></p>
<p>&#160;</p>
2）Observer.cpp<br>
<p>/**//********************************************************************<br>　　　 created:　　　 2006/07/20<br>　　　 filename:　　　　 Observer.cpp<br>　　　 author:　　　　　　　 李创<br>　　　　　　　　　　　　　　　 http://www.cppblog.com/converse/</p>
<p>　　　 purpose:　　　 Observer模式的演示代码<br>*********************************************************************/</p>
<p>#include "Observer.h"<br>#include &lt;iostream&gt;<br>#include &lt;algorithm&gt;</p>
<p>/**//* --------------------------------------------------------------------<br>|　　　 Subject类成员函数的实现<br>|<br>　----------------------------------------------------------------------*/</p>
<p>void Subject::Attach(Observer *pObserver)<br>{<br>　　　 std::cout &lt;&lt; "Attach an Observern";</p>
<p>　　　 m_ListObserver.push_back(pObserver);<br>}</p>
<p>void Subject::Detach(Observer *pObserver)<br>{<br>　　　 std::list&lt;Observer*&gt;::iterator iter;<br>　　　 iter = std::find(m_ListObserver.begin(), m_ListObserver.end(), pObserver);</p>
<p>　　　 if (m_ListObserver.end() != iter)<br>　　　 {<br>　　　　　　　 m_ListObserver.erase(iter);<br>　　　 }</p>
<p>　　　 std::cout &lt;&lt; "Detach an Observern";<br>}</p>
<p>void Subject::Notify()<br>{<br>　　　 std::cout &lt;&lt; "Notify Observers''s Staten";</p>
<p>　　　 std::list&lt;Observer*&gt;::iterator iter1, iter2;</p>
<p>　　　 for (iter1 = m_ListObserver.begin(), iter2 = m_ListObserver.end();<br>　　　　　　　　 iter1 != iter2;<br>　　　　　　　　 ++iter1)<br>　　　 {<br>　　　　　　　 (*iter1)-&gt;Update(this);<br>　　　 }<br>}</p>
<p>void Subject::SetState(STATE nState)<br>{<br>　　　 std::cout &lt;&lt; "SetState By Subjectn";<br>　　　 m_nSubjectState = nState;<br>}</p>
<p>STATE Subject::GetState()<br>{<br>　　　 std::cout &lt;&lt; "GetState By Subjectn";<br>　　　 return m_nSubjectState;<br>}</p>
<p>Subject::~Subject()<br>{<br>　　　 std::list&lt;Observer*&gt;::iterator iter1, iter2, temp;</p>
<p>　　　 for (iter1 = m_ListObserver.begin(), iter2 = m_ListObserver.end();<br>　　　　　　　 iter1 != iter2;<br>　　　　　　　 )<br>　　　 {<br>　　　　　　　 temp = iter1;<br>　　　　　　　 ++iter1;<br>　　　　　　　 delete (*temp);<br>　　　 }</p>
<p>　　　 m_ListObserver.clear();<br>}</p>
<p>/**//* --------------------------------------------------------------------<br>|　　　 ConcreateSubject类成员函数的实现<br>|<br>----------------------------------------------------------------------*/<br>void ConcreateSubject::SetState(STATE nState)<br>{<br>　　　 std::cout &lt;&lt; "SetState By ConcreateSubjectn";<br>　　　 m_nSubjectState = nState;<br>}</p>
<p>STATE ConcreateSubject::GetState()<br>{<br>　　　 std::cout &lt;&lt; "GetState By ConcreateSubjectn";<br>　　　 return m_nSubjectState;<br>}</p>
<p>/**//* --------------------------------------------------------------------<br>|　　　 ConcreateObserver类成员函数的实现<br>|<br>----------------------------------------------------------------------*/<br>void ConcreateObserver::Update(Subject* pSubject)<br>{<br>　　　 if (NULL == pSubject)<br>　　　　　　　 return;</p>
<p>　　　 m_nObserverState = pSubject-&gt;GetState();</p>
<p>　　　 std::cout &lt;&lt; "The ObeserverState is " &lt;&lt; m_nObserverState &lt;&lt; std::endl;<br>}<br></p>
<br>3）Main.cpp<br>
<p>/**//********************************************************************<br>　　　 created:　　　 2006/07/21<br>　　　 filename:　　　　 Main.cpp<br>　　　 author:　　　　　　　 李创<br>　　　　　　　　　　　　　　　 http://www.cppblog.com/converse/</p>
<p>　　　 purpose:　　　 Observer模式的测试代码<br>*********************************************************************/</p>
<p>#include "Observer.h"<br>#include &lt;iostream&gt;</p>
<p>int main()<br>{<br>　　　 Observer *p1 = new ConcreateObserver;<br>　　　 Observer *p2 = new ConcreateObserver;</p>
<p>　　　 Subject* p = new ConcreateSubject;<br>　　　 p-&gt;Attach(p1);<br>　　　 p-&gt;Attach(p2);<br>　　　 p-&gt;SetState(4);<br>　　　 p-&gt;Notify();</p>
<p>　　　 p-&gt;Detach(p1);<br>　　　 p-&gt;SetState(10);<br>　　　 p-&gt;Notify();</p>
<p>　　　 delete p;</p>
<p>　　　 system("pause");</p>
<p>　　　 return 0;<br>}<br></p>
</div>
<!--新闻内容//--><!--评论发布-->
<img src ="http://www.cppblog.com/guying2008/aggbug/90830.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guying2008/" target="_blank">yanghaibao</a> 2009-07-22 14:44 <a href="http://www.cppblog.com/guying2008/archive/2009/07/22/90830.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Observer 模式的一种实现</title><link>http://www.cppblog.com/guying2008/archive/2009/07/22/90824.html</link><dc:creator>yanghaibao</dc:creator><author>yanghaibao</author><pubDate>Wed, 22 Jul 2009 05:50:00 GMT</pubDate><guid>http://www.cppblog.com/guying2008/archive/2009/07/22/90824.html</guid><description><![CDATA[<a href="http://www.codeproject.com/KB/cpp/CppEvents.aspx">http://www.codeproject.com/KB/cpp/CppEvents.aspx</a>
<img src ="http://www.cppblog.com/guying2008/aggbug/90824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guying2008/" target="_blank">yanghaibao</a> 2009-07-22 13:50 <a href="http://www.cppblog.com/guying2008/archive/2009/07/22/90824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式解析和实现（C++） Composite模式</title><link>http://www.cppblog.com/guying2008/archive/2009/07/20/90641.html</link><dc:creator>yanghaibao</dc:creator><author>yanghaibao</author><pubDate>Mon, 20 Jul 2009 09:14:00 GMT</pubDate><guid>http://www.cppblog.com/guying2008/archive/2009/07/20/90641.html</guid><description><![CDATA[作用：
<p>&nbsp;&nbsp;&nbsp; 将对象组合成树形结构以表示&#8220;部分-整体&#8221;的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。</p>
<p>&nbsp;&nbsp;&nbsp; UML结构图：</p>
<p align=center><img border=0 hspace=0 alt="" src="http://c.chinaitlab.com/UploadFiles_4204/200904/2009041409200294.gif"></p>
<p><br><br>&nbsp;&nbsp;&nbsp; 抽象基类：</p>
<p>&nbsp;&nbsp;&nbsp; 1）Component：为组合中的对象声明接口，声明了类共有接口的缺省行为（如这里的Add，Remove，GetChild函数），声明一个接口函数可以访问Component的子组件。</p>
<p>&nbsp;&nbsp;&nbsp; 接口函数：</p>
<p>&nbsp;&nbsp;&nbsp; 1）Component：：Operatation：定义了各个组件共有的行为接口，由各个组件的具体实现。</p>
<p>&nbsp;&nbsp;&nbsp; 2）Component：：Add添加一个子组件</p>
<p>&nbsp;&nbsp;&nbsp; 3）Component：：Remove：：删除一个子组件。</p>
<p>&nbsp;&nbsp;&nbsp; 4）Component：：GetChild：获得子组件的指针。</p>
<p>&nbsp;&nbsp;&nbsp; 解析：</p>
<p>&nbsp;&nbsp;&nbsp; Component模式是为解决组件之间的递归组合提供了解决的办法，它主要分为两个派生类，其中的Leaf是叶子结点，也就是不含有子组件的结点，而Composite是含有子组件的类。举一个例子来说明这个模式，在UI的设计中，最基本的控件是诸如Button，Edit这样的控件，相当于是这里的Leaf组件，而比较复杂的控件比如List则可也看做是由这些基本的组件组合起来的控件，相当于这里的Composite，它们之间有一些行为含义是相同的，比如在控件上作一个点击，移动操作等等的，这些都可以定义为抽象基类中的接口虚函数，由各个派生类去实现之，这些都会有的行为就是这里的Operation函数，而添加，删除等进行组件组合的操作只有非叶子结点才可能有，所以虚拟基类中只是提供接口而且默认的实现是什么都不做。</p>
实现：
<p>&nbsp;&nbsp;&nbsp; 1）Composite.h<br>
<table border=2 cellSpacing=0 borderColor=#cccccc cellPadding=3 width="100%" bgColor=#ffffff>
    <tbody>
        <tr>
            <td>
            <p>&nbsp;/**//********************************************************************<br>　　　 created:　　　 2006/07/20<br>　　　 filename:　　　　 Composite.h<br>　　　 author:　　　　　　　 李创<br>　　　　　　　　　　　　　　　 <a href="http://www.cppblog.com/converse/"><font face=宋体>http://www.cppblog.com/converse/</font></a></p>
            <p>　　　 purpose:　　　 Composite模式的演示代码<br>*********************************************************************/</p>
            <p>#ifndef COMPOSITE_H<br>#define COMPOSITE_H</p>
            <p>#include &lt;list&gt;</p>
            <p>// 组合中的抽象基类<br>class Component<br>{<br>public:<br>　　　 Component(){}<br>　　　 virtual ~Component(){}</p>
            <p>　　　 // 纯虚函数,只提供接口,没有默认的实现<br>　　　 virtual void Operation() = 0;</p>
            <p>　　　 // 虚函数,提供接口,有默认的实现就是什么都不做<br>　　　 virtual void Add(Component* pChild);<br>　　　 virtual void Remove(Component* pChild);<br>　　　 virtual Component* GetChild(int nIndex);<br>};</p>
            <p>// 派生自Component,是其中的叶子组件的基类<br>class Leaf<br>　　　 : public Component<br>{<br>public:<br>　　　 Leaf(){}<br>　　　 virtual ~Leaf(){}</p>
            <p>　　　 virtual void Operation();<br>};</p>
            <p>// 派生自Component,是其中的含有子件的组件的基类<br>class Composite<br>　　　 : public Component<br>{<br>public:<br>　　　 Composite(){}<br>　　　 virtual ~Composite();</p>
            <p>　　　 virtual void Operation();</p>
            <p>　　　 virtual void Add(Component* pChild);<br>　　　 virtual void Remove(Component* pChild);<br>　　　 virtual Component* GetChild(int nIndex);</p>
            <p>private:<br>　　　 // 采用list容器去保存子组件<br>　　　 std::list&lt;Component*&gt;　　　 m_ListOfComponent;<br>};</p>
            <p>#endif<br></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
2）Composite.cpp<br>
<table border=2 cellSpacing=0 borderColor=#cccccc cellPadding=3 width="100%" bgColor=#ffffff>
    <tbody>
        <tr>
            <td>
            <p>&nbsp;/**//********************************************************************<br>　　　 created:　　　 2006/07/20<br>　　　 filename:　　　　 Composite.cpp<br>　　　 author:　　　　　　　 李创<br>　　　　　　　　　　　　　　　 <a href="http://www.cppblog.com/converse/"><font face=宋体>http://www.cppblog.com/converse/</font></a></p>
            <p>　　　 purpose:　　　 Composite模式的演示代码<br>*********************************************************************/</p>
            <p>#include "Composite.h"<br>#include &lt;iostream&gt;<br>#include &lt;algorithm&gt;</p>
            <p>/**//*-------------------------------------------------------------------<br>　　　 Component成员函数的实现</p>
            <p>　-------------------------------------------------------------------*/<br>void Component::Add(Component* pChild)<br>{</p>
            <p>}</p>
            <p>void Component::Remove(Component* pChild)<br>{</p>
            <p>}</p>
            <p>Component* Component::GetChild(int nIndex)<br>{<br>　　　 return NULL;<br>}</p>
            <p>/**//*-------------------------------------------------------------------<br>　　　 Leaf成员函数的实现</p>
            <p>-------------------------------------------------------------------*/<br>void Leaf::Operation()<br>{<br>　　　 std::cout &lt;&lt; "Operation by leafn";<br>}</p>
            <p>/**//*-------------------------------------------------------------------<br>　　　 Composite成员函数的实现</p>
            <p>-------------------------------------------------------------------*/<br>Composite::~Composite()<br>{<br>　　　 std::list&lt;Component*&gt;::iterator iter1, iter2, temp;</p>
            <p>　　　 for (iter1　 = m_ListOfComponent.begin(), iter2 = m_ListOfComponent.end();<br>　　　　　　　　 iter1 != iter2;<br>　　　　　　　　 )<br>　　　 {<br>　　　　　　　 temp = iter1;<br>　　　　　　　 ++iter1;<br>　　　　　　　 delete (*temp);<br>　　　 }<br>}</p>
            <p>void Composite::Add(Component* pChild)<br>{<br>　　　 m_ListOfComponent.push_back(pChild);<br>}</p>
            <p>void Composite::Remove(Component* pChild)<br>{<br>　　　 std::list&lt;Component*&gt;::iterator iter;</p>
            <p>　　　 iter = find(m_ListOfComponent.begin(), m_ListOfComponent.end(), pChild);</p>
            <p>　　　 if (m_ListOfComponent.end() != iter)<br>　　　 {<br>　　　　　　　 m_ListOfComponent.erase(iter);<br>　　　 }<br>}</p>
            <p>Component* Composite::GetChild(int nIndex)<br>{<br>　　　 if (nIndex &lt;= 0 || nIndex &gt; m_ListOfComponent.size())<br>　　　　　　　 return NULL;</p>
            <p>　　　 std::list&lt;Component*&gt;::iterator iter1, iter2;<br>　　　 int i;<br>　　　 for (i = 1, iter1　 = m_ListOfComponent.begin(), iter2 = m_ListOfComponent.end();<br>　　　　　　　 iter1 != iter2;<br>　　　　　　　 ++iter1, ++i)<br>　　　 {<br>　　　　　　　 if (i == nIndex)<br>　　　　　　　　　　　 break;<br>　　　 }</p>
            <p>　　　 return *iter1;<br>}</p>
            <p>void Composite::Operation()<br>{<br>　　　 std::cout &lt;&lt; "Operation by Compositen";</p>
            <p>　　　 std::list&lt;Component*&gt;::iterator iter1, iter2;</p>
            <p>　　　 for (iter1　 = m_ListOfComponent.begin(), iter2 = m_ListOfComponent.end();<br>　　　　　　　 iter1 != iter2;<br>　　　　　　　 ++iter1)<br>　　　 {<br>　　　　　　　 (*iter1)-&gt;Operation();<br>　　　 }<br>}<br></p>
            </td>
        </tr>
    </tbody>
</table>
3）Main.cpp<br>
<table border=2 cellSpacing=0 borderColor=#cccccc cellPadding=3 width="100%" bgColor=#ffffff>
    <tbody>
        <tr>
            <td>
            <p>&nbsp;/**//********************************************************************<br>　　　 created:　　　 2006/07/20<br>　　　 filename:　　　　 Main.cpp<br>　　　 author:　　　　　　　 李创<br>　　　　　　　　　　　　　　　 <a href="http://www.cppblog.com/converse/"><font face=宋体>http://www.cppblog.com/converse/</font></a></p>
            <p>　　　 purpose:　　　 Composite模式的<a class=channel_keylink href="http://softtest.chinaitlab.com/" target=_blank><font color=#0000ff face=宋体>测试</font></a>代码<br>*********************************************************************/</p>
            <p>#include "Composite.h"<br>#include &lt;stdlib.h&gt;</p>
            <p>int main()<br>{<br>　　　 Leaf *pLeaf1 = new Leaf();<br>　　　 Leaf *pLeaf2 = new Leaf();</p>
            <p>　　　 Composite* pComposite = new Composite;<br>　　　 pComposite-&gt;Add(pLeaf1);<br>　　　 pComposite-&gt;Add(pLeaf2);<br>　　　 pComposite-&gt;Operation();<br>　　　 pComposite-&gt;GetChild(2)-&gt;Operation();</p>
            <p>　　　 delete pComposite;</p>
            <p>　　　 system("pause");</p>
            <p>　　　 return 0;<br>}<br></p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cppblog.com/guying2008/aggbug/90641.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guying2008/" target="_blank">yanghaibao</a> 2009-07-20 17:14 <a href="http://www.cppblog.com/guying2008/archive/2009/07/20/90641.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows调试工具详解</title><link>http://www.cppblog.com/guying2008/archive/2009/07/16/90252.html</link><dc:creator>yanghaibao</dc:creator><author>yanghaibao</author><pubDate>Thu, 16 Jul 2009 08:37:00 GMT</pubDate><guid>http://www.cppblog.com/guying2008/archive/2009/07/16/90252.html</guid><description><![CDATA[<a href="http://www.dbgtech.net/windbghelp/index.html">http://www.dbgtech.net/windbghelp/index.html</a><br><a href="http://www.dbgtech.net/">http://www.dbgtech.net</a><br>
<img src ="http://www.cppblog.com/guying2008/aggbug/90252.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guying2008/" target="_blank">yanghaibao</a> 2009-07-16 16:37 <a href="http://www.cppblog.com/guying2008/archive/2009/07/16/90252.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++编译器----cl.exe的全部命令开关</title><link>http://www.cppblog.com/guying2008/archive/2009/07/16/90246.html</link><dc:creator>yanghaibao</dc:creator><author>yanghaibao</author><pubDate>Thu, 16 Jul 2009 08:05:00 GMT</pubDate><guid>http://www.cppblog.com/guying2008/archive/2009/07/16/90246.html</guid><description><![CDATA[<h1 class=block_title><a id=viewpost1_TitleUrl href="http://www.cppblog.com/ietj/articles/43233.html"></a>&nbsp;</h1>
<div class=post>
<div class=postcontent>
<p>/C:在预处理输出中保留注释语句<br>/c:只编译，不连接，相当于在"Build"菜单下选择了"Compile"<br>/D:定义常量和宏，与源程序里的#define 有相同效果<br>/E:预处理C、C＋＋源文件，将源文件中所有的预编译指令及宏展开，将注释去掉，然后将预处理器的输出拷贝至标准输出设备输出，并且在每个文件的开头和末尾加入#line<br>/EH:指定编译器用何种异常处理模型<br>/EP:同/E,只是去掉了#line<br>/F:设置程序的堆栈大小<br>/FA:设置生成何种列表文件（汇编、汇编与机器码、汇编与源码、汇编与机器码以及源码）<br>/Fa:指定用/FA设置的列表文件的存放路径及（或）文件名<br>/FD:生成文件的相互依赖信息<br>/Fd:设置程序数据库文件（PDB）的存放路径及（或）文件名<br>/Fe:设置最终可执行文件的存放路径及（或）文件名<br>/FI:预处理指定的头文件，与源文件中的＃include有相同效果<br>/Fm:创建map文件<br>/Fo:设置编译后Obj文件的存放路径及（或）文件名<br>/Fp:设置预编译文件（pch）的存放路径及（或）文件名<br>/FR:生成浏览信息（sbr）文件<br>/Fr:同/FR,不同之处在于/Fr不包括局部变量信息<br>/G3:为80386处理器优化代码生成<br>/G4:为80486处理器优化代码生成<br>/G5:为Pentium处理器优化代码生成<br>/G6:为Pentium Pro处理器优化代码生成<br>/GA:为Windows应用程序作优化<br>/GB:为Pentium处理器优化代码生成，使用80386、80486、Pentium、Pentium Pro的混合指令集，是代码生成的默认选项（程序属性选项中Processor对应Blend）<br>/GD:为Windows动态库（dll）作优化，此开关在VC6中没有实现<br>/Gd:指定使用__cdecl的函数调用规则<br>/Ge:激活堆栈检测<br>/GF:消除程序中的重复的字符串，并将她放到只读的缓冲区中<br>/Gf:消除程序中的重复字符串<br>/Gh:在每个函数的开头调用钩子（hook）函数--penter<br>/Gi:允许渐进编译<br>/Gm:允许最小化rebuild<br>/GR:允许运行时类型信息(Run-Time Type Infomation)<br>/Gr:指定使用__fastcall的函数调用规则<br>/Gs:控制堆栈检测所用内存大小<br>/GT:支持用__declspec(thread)分配的数据的fier-safety<br>/GX:允许同步异常处理，与/EHsc开关等价<br>/Gy:允许编译器将每一个函数封装成COMDATs的形式，供连接器调用<br>/GZ:允许在Debug build 的时候捕捉Release build的错误<br>/Gz:指定使用__stdcall的函数调用规则<br>/H:限制外部名字的长度<br>/HELP:列出编译器的所有的命令开关<br>/I:指定头文件的搜索路径<br>/J:将char的缺省类型从signed char改成unsigned char<br>/LD:创建一个动态连接库<br>/LDd:创建一个Debug版本的动态链接库<br>/link:将指定的选项传给连接器<br>/MD:选择多线程、DLL版本的C Run－Time库<br>/MDd:选择多线程、DLL、Debug版本的C Run－Time库<br>/ML:选择单线程版本的C Run—Time库<br>/MLd:选择单线程、Debug版本的C Run—Time库<br>/MT:选择多线程版本的C Run-Time库<br>/MTd:选择多线程、Debug版本的C Run—Time库<br>/nologo:不显示程序的版权信息<br>/O1:优化使产生的可执行代码最小<br>/O2:优化使产生的可执行代码速度最快<br>/Oa:指示编译器程序里没有使用别名，可以提高程序的执行速度<br>/Ob:控制内联（inline）函数的展开<br>/Od:禁止代码优化<br>/Og:使用全局优化<br>/Oi:用内部函数去代替程序里的函数调用，可以使程序运行的更快，但程序的长度变长<br>/Op:提高浮点数比较运算的一致性<br>/Os:产生尽可能小的可执行代码<br>/Ot:产生尽可能块的可执行代码<br>/Ow:指示编译器在函数体内部没有使用别名<br>/Ox:组合了几个优化开关，达到尽可能多的优化<br>/Oy:阻止调用堆栈里创建帧指针<br>/Q1f:对核心级的设备驱动程序生成单独的调试信息<br>/QI0f:对Pentium 0x0f错误指令作修正<br>/Qifdiv:对Pentium FDIV错误指令作修正<br>/P:将预处理输出写到指定文件里，文件的后缀名为I<br>/TC:将命令行上的所有文件都当作C源程序编译，不管后缀名是否为.c<br>/Tc:将指定的文件当作C源程序编译，不管后缀名是否为.c<br>/TP:将命令行上的所有文件都当作C＋＋源程序编译，不管后缀名是否为.cpp<br>/Tp:将指定文件当作C＋＋源程序编译，不管后缀名是否为.cpp<br>/U:去掉一个指定的前面定义的符号或常量<br>/u:去掉所有前面定义的符号或常量<br>/V:在编译的obj文件里嵌入版本号<br>/vd:禁止/允许构造函数置换<br>/vmb:选择指针的表示方法，使用这个开关，在声明指向某个类的成员的指针之前，必须先定义这个类<br>/vmg:选择指针的表示方法，使用这个开关，在声明指向某个类的成员的指针之前，不必先定义这个类，但要首先指定这个类是使用何种继承方法<br>/vmm:设置指针的表示方法为Single Inheritance and Multiple Inheritance<br>/vms:设置指针的表示方法为Single Inheritance<br>/vmv:设置指针的表示方法为Any class<br>/W:设置警告等级<br>/w:禁止所有警告<br>/X:阻止编译器搜索标准的include 目录<br>/Yc:创建预编译头文件（pch）<br>/Yd:在所有的obj文件里写上完全的调试信息<br>/Yu:在build过程中使用指定的预编译头文件<br>/YX:指示编译器若预编译头文件存在，则使用它，若不存在，则创建一个<br>/Z7:生成MSC7.0兼容的调试信息<br>/Za:禁止语言扩展(Microsoft Extensions to C)<br>/Zd:调试信息只包含外部和全局的符号信息以及行号信息<br>/Ze:允许语言扩展(Microsoft Extensions to C)<br>/Zg:为源文件里面定义的每个函数生成函数原型<br>/ZI:生成程序库文件（Pdb）并支持Edit and Continue调试特性<br>/Zi:生成程序库文件（pdb），包含类型信息和符号调试信息<br>/ZL:从obj文件里去掉缺省的库文件名<br>/Zm:设置编译器的内存分配xianzhi<br>/Zn:禁止浏览信息文件里面的封装<br>/Zp:设置结构成员在内存里面的封装格式<br>/Zs:快速检查语法错误<br>－－－－－－－－－－－－－－－－－－－－－－－－－－<br>vc所支持的文件类型</p>
<p>DSW:全称是Developer Studio Workspace，最高级别的配置文件，记录了整个工作空间的配置信息，她是一个纯文本的文件，在vc创建新项目的时候自动生成<br>DSP:全称是Developer Studio Project，也是一个配置文件，不过她记录的是一个项目的所有配置信息，纯文本文件<br>OPT：与DSW、DSP配合使用的配置文件，她记录了与机器硬件有关的信息，同一个项目在不同的机器上的opt文件内容是不同的<br>CLW：记录了跟ClassWizard相关的信息，如果丢失了clw文件，那么在Class View面板里就没有类信息<br>PLG：实际上是一个超文本文件，可以用Internet Explorer打开，记录了Build的过程，是一个日志型文件<br>RC：资源描述文件，记录了所有的资源信息，在资源编辑器里作的修改，实际上都是对RC文件的修改<br>RC2：附加的资源描述文件，不能直接资源编辑器修改，只能手工添加，可以用来添加额外的资源<br>RES：经过资源编辑器编译之后的资源文件，以二进制方式存放<br>SBR：编译器生成的浏览信息文件，在代码导航的时候非常有用，她需要在编译时指定/FR或者/Fr开关<br>BSC：BSCMAKE.EXE将所有的SBR文件作为输入，经过处理之后输出一个BSC文件，在代码导航的时候实际用到的是BSC文件<br>ILK：当选定渐增型编译连接时，连接器自动生成ILK文件，记录连接信息<br>PDB：全称是Program DataBase，即程序数据库文件，用来记录调试信息，是一个相当重要的文件，没有他，程序无法正常调试<br>LIB：如果项目输出是Dll的话，一般会输出一个跟项目同名的Lib文件，记录输出的函数信息<br>EXP：同Lib，是跟Dll一起生成的输出文件<br>PCH：全称是PreCompiled Header，就是预先编译好的头文件，在编译时指定/Yu开关时编译器自动生成</p>
</div>
</div>
<img src ="http://www.cppblog.com/guying2008/aggbug/90246.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guying2008/" target="_blank">yanghaibao</a> 2009-07-16 16:05 <a href="http://www.cppblog.com/guying2008/archive/2009/07/16/90246.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>