﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-龙与地下城的世界</title><link>http://www.cppblog.com/SysProgrammer/</link><description>Memory Layout......</description><language>zh-cn</language><lastBuildDate>Mon, 06 Apr 2026 07:14:48 GMT</lastBuildDate><pubDate>Mon, 06 Apr 2026 07:14:48 GMT</pubDate><ttl>60</ttl><item><title>利用管道对进程重定向</title><link>http://www.cppblog.com/SysProgrammer/archive/2010/05/25/116333.html</link><dc:creator>Reno</dc:creator><author>Reno</author><pubDate>Tue, 25 May 2010 15:07:00 GMT</pubDate><guid>http://www.cppblog.com/SysProgrammer/archive/2010/05/25/116333.html</guid><wfw:comment>http://www.cppblog.com/SysProgrammer/comments/116333.html</wfw:comment><comments>http://www.cppblog.com/SysProgrammer/archive/2010/05/25/116333.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SysProgrammer/comments/commentRss/116333.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SysProgrammer/services/trackbacks/116333.html</trackback:ping><description><![CDATA[<p>一个管道有读端和写端,当你把这个管道和一个进程搭接起来的时候,可以用这个管道当作输入,也可以用这个管道当作输出,如果是要向管道输入,则数据输入端是写端,另一端是读端,如果是由管道输出,则由进程写入管道,是写端,另一端是读端,也就是接收进程的输出数据的一端,因此如果要重定向进程的输入和输出,则需要2根管道.<br>以下代码演示了创建CMD.EXE进程,并用2根管道重定向他的输入输出,并读取CMD产生的结果数据.<br><span style="COLOR: red">千万不要忘记设置SECURITY_ATTRIBUTES里的bInheritHandle,比如创建管道的时候要把bInheritHandle设置为TRUE</span></p>
<p>同样不一定要用管道,比如文件,SOCKET等都可以重定向.<br>如果是用SOCKET,根据网上的名词,可以创建一个"零管道后门"程序.比如在服务器端上的后门程序监听某个端口,一旦有连接请求,接受后创建SOCKET,就在这个时候开启CMD.EXE,并重定向输入输出到服务器上的这个SOCKET,这样便为远程的这个连接请求开了一个服务器上的后门，从而远程连接可以执行服务器并返回结果.<br>演示代码如下:<br>//<br>// File: Main.cpp<br>// Purpose: Creates a process( cmd.exe for example ), and redirect its standard input<br>//&nbsp;&nbsp;&nbsp;by using creating a pipe, then writes some bytes as commands to pipe.<br>//<br>#define WIN32_LEAN_AND_MEAN<br>#include &lt;windows.h&gt;</p>
<p>#include &lt;stdio.h&gt;<br>#include &lt;stdlib.h&gt;</p>
<p>// Error report<br>void Error( const char *szErrMsg );</p>
<p>int main( int argc, char **argv )<br>{<br>&nbsp;// Create pipe<br>&nbsp;BOOL bRet;<br>&nbsp;HANDLE hPipeRead, hPipeWrite;<br>&nbsp;HANDLE hPipeReadII, hPipeWriteII;<br>&nbsp;SECURITY_ATTRIBUTES&nbsp;sa;<br>&nbsp;sa.nLength = sizeof( SECURITY_ATTRIBUTES );<br>&nbsp;sa.bInheritHandle = TRUE;<br>&nbsp;sa.lpSecurityDescriptor = NULL;<br>&nbsp;bRet = ::CreatePipe( &amp;hPipeRead, &amp;hPipeWrite, &amp;sa, 512 );<br>&nbsp;bRet &amp;= ::CreatePipe( &amp;hPipeReadII, &amp;hPipeWriteII, &amp;sa, 512 );<br>&nbsp;if ( !bRet )<br>&nbsp;{<br>&nbsp;&nbsp;Error( "Can't create pipe!" );<br>&nbsp;&nbsp;return -1;<br>&nbsp;}<br>&nbsp;// Spawn a process<br>&nbsp;STARTUPINFO StartInfo;<br>&nbsp;PROCESS_INFORMATION ProcessInfo;<br>//&nbsp;memset( &amp;StartInfo, 0, sizeof(StartInfo) );<br>//&nbsp;memset( &amp;ProcessInfo, 0, sizeof(ProcessInfo) );<br>&nbsp;::GetStartupInfo( &amp;StartInfo );<br>&nbsp;StartInfo.cb = sizeof(StartInfo);<br>&nbsp;StartInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;<br>&nbsp;StartInfo.wShowWindow = SW_HIDE;<br>&nbsp;StartInfo.hStdInput = hPipeRead;<br>&nbsp;StartInfo.hStdOutput = hPipeWriteII; //::GetStdHandle( STD_OUTPUT_HANDLE );<br>&nbsp;StartInfo.hStdError = hPipeWriteII; //::GetStdHandle( STD_OUTPUT_HANDLE );<br>&nbsp;bRet = ::CreateProcess( TEXT("c:\\windows\\system32\\cmd.exe"), NULL, NULL, NULL, TRUE, 0, NULL, NULL, &amp;StartInfo, &amp;ProcessInfo );<br>&nbsp;::Sleep(1000);<br>&nbsp;printf("wake up...\n");<br>&nbsp;if ( !bRet )<br>&nbsp;{<br>&nbsp;&nbsp;Error( "Can't create process!" );<br>&nbsp;&nbsp;return -1;<br>&nbsp;}<br>&nbsp;// Write commands to pipe<br>&nbsp;char *szCmd = "netstat\r\n";<br>&nbsp;DWORD dwDummy;<br>&nbsp;::WriteFile( hPipeWrite, szCmd, 10, &amp;dwDummy, NULL );<br>&nbsp;::Sleep(2000);<br>&nbsp;printf("had written...\n");<br>&nbsp;// Read from pipe<br>&nbsp;char szBuf[1024];<br>&nbsp;memset(szBuf, 0, sizeof(szBuf));<br>&nbsp;::ReadFile( hPipeReadII, szBuf, sizeof(szBuf), &amp;dwDummy, NULL );<br>&nbsp;// Don't leave till the spawned process goes end<br>//&nbsp;::Sleep(2000);<br>&nbsp;printf("had read...\n");<br>//&nbsp;::WaitForSingleObject( ProcessInfo.hProcess, INFINITE );<br>&nbsp;printf("%s\n", szBuf);</p>
<p>&nbsp;return 0;<br>}</p>
<p>void Error( const char *szErrMsg )<br>{<br>&nbsp;printf( "Error: %s\n", szErrMsg );<br>}</p>
<br>在WinXP SP2 + VS 2005 Express Edition上编译并运行通过<br>这个版本的VS需要下载并设置Platform SDK,并另外找一个MSVCRT80D.DLL如果是DEBUG版本的DLL,并设置<br>包含和链接目录和链接器命令行(user32,kernel32,libcmt)<br>
<img src ="http://www.cppblog.com/SysProgrammer/aggbug/116333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SysProgrammer/" target="_blank">Reno</a> 2010-05-25 23:07 <a href="http://www.cppblog.com/SysProgrammer/archive/2010/05/25/116333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第2个简单的语言</title><link>http://www.cppblog.com/SysProgrammer/archive/2009/12/24/104001.html</link><dc:creator>Reno</dc:creator><author>Reno</author><pubDate>Thu, 24 Dec 2009 15:51:00 GMT</pubDate><guid>http://www.cppblog.com/SysProgrammer/archive/2009/12/24/104001.html</guid><wfw:comment>http://www.cppblog.com/SysProgrammer/comments/104001.html</wfw:comment><comments>http://www.cppblog.com/SysProgrammer/archive/2009/12/24/104001.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/SysProgrammer/comments/commentRss/104001.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SysProgrammer/services/trackbacks/104001.html</trackback:ping><description><![CDATA[编写了路径控制脚本后，准备尝试编写一个比它稍微复杂一点的脚本，该脚本具有变量定义，流程控制语句，和比较完善的布尔逻辑和混合四则表达式运算的功能.<br><br>// Unnamed simple script language products define as the&nbsp;flowing:<br>program ::= declaration_list<br>declaration_list ::= var_declaration | fun_declaration<br>var_declaration ::= DECLARE type_specifier_list ID; END<br>type_specifier_list ::= type_specifier type_specifier_list | EMPTY<br>type_specifier ::= VAR<br>fun_declaration ::= BEGIN statement_list END<br>statement_list ::= statement statement_list | EMPTY<br>statement ::= expression_stmt | compund_list | selection_stmt | iteration_stmt<br>expression_stmt ::= expression; | ;<br>compund_list ::= { statement_list }<br>selection_stmt :: IF ( expression ) statement | IF ( expression ) statement ELSE statement<br>ireation_stmt ::= WHILE ( expression ) statement<br>expression ::= var = expression | simple_expression<br>var ::= ID<br>simple_expression ::= additive_expression relop additive_expression | additive_expression<br>relop ::= &lt;= | &lt; | &gt; | &gt;= | == | !=<br>additive_expression ::= additive_expression addop term | term<br>addop ::= + | -<br>term ::= term mulop factor | factor<br>mulop ::= * | /<br>factor ::= ( expression ) | var | NUM 
<img src ="http://www.cppblog.com/SysProgrammer/aggbug/104001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SysProgrammer/" target="_blank">Reno</a> 2009-12-24 23:51 <a href="http://www.cppblog.com/SysProgrammer/archive/2009/12/24/104001.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ConsoleMain.cpp</title><link>http://www.cppblog.com/SysProgrammer/archive/2009/12/23/103848.html</link><dc:creator>Reno</dc:creator><author>Reno</author><pubDate>Wed, 23 Dec 2009 14:03:00 GMT</pubDate><guid>http://www.cppblog.com/SysProgrammer/archive/2009/12/23/103848.html</guid><wfw:comment>http://www.cppblog.com/SysProgrammer/comments/103848.html</wfw:comment><comments>http://www.cppblog.com/SysProgrammer/archive/2009/12/23/103848.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SysProgrammer/comments/commentRss/103848.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SysProgrammer/services/trackbacks/103848.html</trackback:ping><description><![CDATA[<p>&#160;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">.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">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">PathInterpreter.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">argv[]&nbsp;)<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;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;argc&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;)<br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000">&nbsp;{<br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;printf(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Usage:&nbsp;ExecuableFileName&nbsp;ScriptFileName&nbsp;[-DEBUG|-debug]&nbsp;\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;);<br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000">&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">11</span>&nbsp;<span style="COLOR: #000000">&nbsp;}<br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;argc&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">&nbsp;)<br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #000000">&nbsp;{<br></span><span style="COLOR: #008080">15</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;printf(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Warning:&nbsp;More&nbsp;parameters&nbsp;have&nbsp;expected,&nbsp;after&nbsp;the&nbsp;third&nbsp;has&nbsp;ignored!\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;);<br></span><span style="COLOR: #008080">16</span>&nbsp;<span style="COLOR: #000000">&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">17</span>&nbsp;<span style="COLOR: #000000">&nbsp;}<br></span><span style="COLOR: #008080">18</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">19</span>&nbsp;<span style="COLOR: #000000">&nbsp;CPathInterpret&nbsp;Instance;<br></span><span style="COLOR: #008080">20</span>&nbsp;<span style="COLOR: #000000">&nbsp;Instance.LoadScript(&nbsp;argv[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]&nbsp;);<br></span><span style="COLOR: #008080">21</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;argc&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">&nbsp;)<br></span><span style="COLOR: #008080">22</span>&nbsp;<span style="COLOR: #000000">&nbsp;{<br></span><span style="COLOR: #008080">23</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;strcmp(&nbsp;argv[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">],&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">-DEBUG</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;)&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;strcmp(&nbsp;argv[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">],&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">-debug</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;)&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;)<br></span><span style="COLOR: #008080">24</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;Instance.Interpret(&nbsp;CPathInterpret::DEBUG&nbsp;);<br></span><span style="COLOR: #008080">25</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">26</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;printf(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Warning:&nbsp;Unknown&nbsp;about&nbsp;the&nbsp;third&nbsp;parameter!\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;);<br></span><span style="COLOR: #008080">27</span>&nbsp;<span style="COLOR: #000000">&nbsp;}<br></span><span style="COLOR: #008080">28</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">29</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;Instance.Interpret();<br></span><span style="COLOR: #008080">30</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">31</span>&nbsp;<span style="COLOR: #000000">&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">32</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">33</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">34</span>&nbsp;<span style="COLOR: #000000"></span></div>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/SysProgrammer/aggbug/103848.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SysProgrammer/" target="_blank">Reno</a> 2009-12-23 22:03 <a href="http://www.cppblog.com/SysProgrammer/archive/2009/12/23/103848.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PathInterpreter.h</title><link>http://www.cppblog.com/SysProgrammer/archive/2009/12/23/103847.html</link><dc:creator>Reno</dc:creator><author>Reno</author><pubDate>Wed, 23 Dec 2009 14:03:00 GMT</pubDate><guid>http://www.cppblog.com/SysProgrammer/archive/2009/12/23/103847.html</guid><wfw:comment>http://www.cppblog.com/SysProgrammer/comments/103847.html</wfw:comment><comments>http://www.cppblog.com/SysProgrammer/archive/2009/12/23/103847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SysProgrammer/comments/commentRss/103847.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SysProgrammer/services/trackbacks/103847.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;&nbsp;1</span>&nbsp;<span style="COLOR: #000000">#ifndef&nbsp;PATH_INTERPRETER<br></span><span style="COLOR: #008080">&nbsp;&nbsp;2</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;PATH_INTERPRETER</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;&nbsp;3</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;&nbsp;4</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;WIN32_LEAN_AND_MEAN</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;&nbsp;5</span>&nbsp;<span style="COLOR: #000000">#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: #008080">&nbsp;&nbsp;6</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;&nbsp;7</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</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;&nbsp;8</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">ctype.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;&nbsp;9</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;10</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">list</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;11</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;12</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;13</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;std::list;<br></span><span style="COLOR: #008080">&nbsp;14</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;15</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;MAX_WORD_LEN&nbsp;8&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;8&nbsp;Bytes</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;16</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;17</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;ContexScan;<br></span><span style="COLOR: #008080">&nbsp;18</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;19</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;CPathScriptLoader</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;20</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;CPathScriptLoader<br></span><span style="COLOR: #008080">&nbsp;21</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;22</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">&nbsp;23</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;Context;<br></span><span style="COLOR: #008080">&nbsp;24</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;25</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;LoadScript(&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">szFile&nbsp;);<br></span><span style="COLOR: #008080">&nbsp;26</span>&nbsp;<span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">&nbsp;27</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;28</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;29</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Contex&nbsp;Lex<br></span><span style="COLOR: #008080">&nbsp;30</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;31</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;32</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;ContexScan</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;33</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;ContexScan<br></span><span style="COLOR: #008080">&nbsp;34</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;35</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">&nbsp;36</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">enum</span><span style="COLOR: #000000">&nbsp;ScanState&nbsp;{&nbsp;WORD,&nbsp;NOPRINT,&nbsp;};<br></span><span style="COLOR: #008080">&nbsp;37</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;38</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">&nbsp;39</span>&nbsp;<span style="COLOR: #000000">&nbsp;ContexScan();<br></span><span style="COLOR: #008080">&nbsp;40</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">ContexScan();<br></span><span style="COLOR: #008080">&nbsp;41</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;42</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;SetExpression(&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">szExpr&nbsp;);<br></span><span style="COLOR: #008080">&nbsp;43</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;44</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;SkipWord(&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">szWord&nbsp;);<br></span><span style="COLOR: #008080">&nbsp;45</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;&nbsp;GetNextWord();<br></span><span style="COLOR: #008080">&nbsp;46</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;&nbsp;CurrentWord()&nbsp;{&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;m_szCurrWord;&nbsp;}<br></span><span style="COLOR: #008080">&nbsp;47</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;NextWord();<br></span><span style="COLOR: #008080">&nbsp;48</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;RebackWordByCount(&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n&nbsp;);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;退几个?</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;49</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;RebackNearestWordByName(&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">szWord&nbsp;);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;退到哪个?</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;50</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;51</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">&nbsp;52</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;m_szExpr;<br></span><span style="COLOR: #008080">&nbsp;53</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;m_pLastChar;<br></span><span style="COLOR: #008080">&nbsp;54</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;m_pCurrChar;<br></span><span style="COLOR: #008080">&nbsp;55</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;m_szCurrWord[MAX_WORD_LEN];<br></span><span style="COLOR: #008080">&nbsp;56</span>&nbsp;<span style="COLOR: #000000">&nbsp;ScanState&nbsp;m_eState;<br></span><span style="COLOR: #008080">&nbsp;57</span>&nbsp;<span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">&nbsp;58</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;59</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;60</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Syntax&nbsp;Tree&nbsp;Nodes<br></span><span style="COLOR: #008080">&nbsp;61</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;62</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;AbstractNode</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;63</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;AbstractNode<br></span><span style="COLOR: #008080">&nbsp;64</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;65</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">&nbsp;66</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;AbstractNode(&nbsp;ContexScan</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;contex&nbsp;);<br></span><span style="COLOR: #008080">&nbsp;67</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">AbstractNode();<br></span><span style="COLOR: #008080">&nbsp;68</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;69</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Parse()&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;70</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;71</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">&nbsp;72</span>&nbsp;<span style="COLOR: #000000">&nbsp;ContexScan</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;m_RefContexScan;<br></span><span style="COLOR: #008080">&nbsp;73</span>&nbsp;<span style="COLOR: #000000">&nbsp;list</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">AbstractNode&nbsp;</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">&nbsp;m_Nodes;<br></span><span style="COLOR: #008080">&nbsp;74</span>&nbsp;<span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">&nbsp;75</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;76</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;ProgramNode</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;77</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;ProgramNode&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;AbstractNode<br></span><span style="COLOR: #008080">&nbsp;78</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;79</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">&nbsp;80</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;ProgramNode(&nbsp;ContexScan</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;contex&nbsp;);<br></span><span style="COLOR: #008080">&nbsp;81</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">ProgramNode();<br></span><span style="COLOR: #008080">&nbsp;82</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;83</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Parse();<br></span><span style="COLOR: #008080">&nbsp;84</span>&nbsp;<span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">&nbsp;85</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;86</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;CommandListNode</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;87</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;CommandListNode&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;AbstractNode<br></span><span style="COLOR: #008080">&nbsp;88</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;89</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">&nbsp;90</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;CommandListNode(&nbsp;ContexScan</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;contex&nbsp;);<br></span><span style="COLOR: #008080">&nbsp;91</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">CommandListNode();<br></span><span style="COLOR: #008080">&nbsp;92</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;93</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Parse();<br></span><span style="COLOR: #008080">&nbsp;94</span>&nbsp;<span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">&nbsp;95</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;96</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;CommandNode</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;97</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;CommandNode&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;AbstractNode<br></span><span style="COLOR: #008080">&nbsp;98</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;99</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">100</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;CommandNode(&nbsp;ContexScan</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;contex&nbsp;);<br></span><span style="COLOR: #008080">101</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">CommandNode();<br></span><span style="COLOR: #008080">102</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">103</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Parse();<br></span><span style="COLOR: #008080">104</span>&nbsp;<span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">105</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">106</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;RepeatNode</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">107</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;RepeatNode&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;AbstractNode<br></span><span style="COLOR: #008080">108</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">109</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">110</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;RepeatNode(&nbsp;ContexScan</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;contex&nbsp;);<br></span><span style="COLOR: #008080">111</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">RepeatNode();<br></span><span style="COLOR: #008080">112</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">113</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Parse();<br></span><span style="COLOR: #008080">114</span>&nbsp;<span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">115</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">116</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;BlockNode</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">117</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;BlockNode&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;AbstractNode<br></span><span style="COLOR: #008080">118</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">119</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">120</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;BlockNode(&nbsp;ContexScan</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;contex&nbsp;);<br></span><span style="COLOR: #008080">121</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">BlockNode();<br></span><span style="COLOR: #008080">122</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">123</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Parse();<br></span><span style="COLOR: #008080">124</span>&nbsp;<span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">125</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">126</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;PrimitiveNode</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">127</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;PrimitiveNode&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;AbstractNode<br></span><span style="COLOR: #008080">128</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">129</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">130</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;PrimitiveNode(&nbsp;ContexScan</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;contex&nbsp;);<br></span><span style="COLOR: #008080">131</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">PrimitiveNode();<br></span><span style="COLOR: #008080">132</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">133</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Parse();<br></span><span style="COLOR: #008080">134</span>&nbsp;<span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">135</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">136</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;CPathInterpret<br></span><span style="COLOR: #008080">137</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;The&nbsp;Interpreter&nbsp;Facade&nbsp;interface</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">138</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;CPathInterpret<br></span><span style="COLOR: #008080">139</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">140</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">141</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">enum</span><span style="COLOR: #000000">&nbsp;InterpretMode&nbsp;{&nbsp;NDEBUG,&nbsp;DEBUG,&nbsp;};<br></span><span style="COLOR: #008080">142</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">143</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">144</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;InterpretMode&nbsp;m_Mode;<br></span><span style="COLOR: #008080">145</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">146</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">147</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;LoadScript(&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">szFile&nbsp;);<br></span><span style="COLOR: #008080">148</span>&nbsp;<span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Interpret(&nbsp;InterpretMode&nbsp;mode&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NDEBUG&nbsp;);<br></span><span style="COLOR: #008080">149</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">150</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">151</span>&nbsp;<span style="COLOR: #000000">&nbsp;CPathScriptLoader&nbsp;m_ScriptLoader;<br></span><span style="COLOR: #008080">152</span>&nbsp;<span style="COLOR: #000000">&nbsp;ContexScan&nbsp;&nbsp;&nbsp;m_ContexScaner;<br></span><span style="COLOR: #008080">153</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">154</span>&nbsp;<span style="COLOR: #000000">};<br></span><span style="COLOR: #008080">155</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">156</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;PATH_INTERPRETER</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">157</span>&nbsp;<span style="COLOR: #000000"></span></div>
<img src ="http://www.cppblog.com/SysProgrammer/aggbug/103847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SysProgrammer/" target="_blank">Reno</a> 2009-12-23 22:03 <a href="http://www.cppblog.com/SysProgrammer/archive/2009/12/23/103847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PathInterpreter.cpp</title><link>http://www.cppblog.com/SysProgrammer/archive/2009/12/23/103842.html</link><dc:creator>Reno</dc:creator><author>Reno</author><pubDate>Wed, 23 Dec 2009 13:57:00 GMT</pubDate><guid>http://www.cppblog.com/SysProgrammer/archive/2009/12/23/103842.html</guid><wfw:comment>http://www.cppblog.com/SysProgrammer/comments/103842.html</wfw:comment><comments>http://www.cppblog.com/SysProgrammer/archive/2009/12/23/103842.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SysProgrammer/comments/commentRss/103842.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SysProgrammer/services/trackbacks/103842.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;1&nbsp;#include&nbsp;"PathInterpreter.h"&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;3&nbsp;//&nbsp;CPathScriptLoader&nbsp;&nbsp;4&nbsp;void&nbsp;CPathScriptLoader::LoadScript(&nbsp;const&nbsp;c...&nbsp;&nbsp;<a href='http://www.cppblog.com/SysProgrammer/archive/2009/12/23/103842.html'>阅读全文</a><img src ="http://www.cppblog.com/SysProgrammer/aggbug/103842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SysProgrammer/" target="_blank">Reno</a> 2009-12-23 21:57 <a href="http://www.cppblog.com/SysProgrammer/archive/2009/12/23/103842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>运动路线控制脚本语言</title><link>http://www.cppblog.com/SysProgrammer/archive/2009/12/23/Reno.html</link><dc:creator>Reno</dc:creator><author>Reno</author><pubDate>Wed, 23 Dec 2009 08:58:00 GMT</pubDate><guid>http://www.cppblog.com/SysProgrammer/archive/2009/12/23/Reno.html</guid><wfw:comment>http://www.cppblog.com/SysProgrammer/comments/103817.html</wfw:comment><comments>http://www.cppblog.com/SysProgrammer/archive/2009/12/23/Reno.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/SysProgrammer/comments/commentRss/103817.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SysProgrammer/services/trackbacks/103817.html</trackback:ping><description><![CDATA[<p>最近在做仿雷电的游戏，其中敌人飞船的运动路线和特征需要能灵活的设置，并且尽量少动其他部分的代码，于是我的想法是把每种类型的飞船指定的运动路线存入脚本中，然后由引擎根据脚本执行.<br>因此可以把飞船的路线看成是由一系列的关键点组成，每个点有比如3个属性，X速度，Y速度和保持该速度的持续时间。而路线的运动轨迹可以由简单的脚本语言来定义，比如也许需要在某几个点之间重复移动一定的次数。</p>
<p>以下是一个Script Demo:<br><br>GO<br>&nbsp;&nbsp;&nbsp; BEGIN<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.0 0.0 500<br>&nbsp;&nbsp;&nbsp; END<br>&nbsp;&nbsp;&nbsp; BEGIN<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1.0 0.0 500<br>&nbsp;&nbsp;&nbsp; END<br>&nbsp;&nbsp;&nbsp; REPEAT 4<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0 1.0 500<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.0 0.0 500<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.0 -1.0 500<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;END<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1.0 0.0 500<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END<br>&nbsp;&nbsp;&nbsp; END<br>END<br><br>表示先左右移动一次，然后向下，向右，向上，向左呈矩形移动4次，通过设置速度分量可以实现任何路线的移动以及其他特征。<br>该脚本语言解释器采用了2个设计模式，Facade和Interpret模式，其中的解释器使用了几乎和任何设计模式书上介绍的一样的结构，很经典呐~<br><br>附上语言的文法定义:<br>program ::= GO command_list<br>command_list ::= command* END<br>command ::= begin_end_block | repeat<br>begin_end_block ::= BEGIN primitive END // Leaf Node on the Syntax tree<br>repeat ::= REPEAT INT command_list<br>primitive ::= SpeedX,SpeedY,Time // Recursive exit<br><br>// TestScript.txt<br>GO<br>&nbsp;&nbsp;BEGIN<br>&nbsp;&nbsp;&nbsp;1.0,0.0,500<br>&nbsp;&nbsp;END<br>&nbsp;&nbsp;BEGIN<br>&nbsp;&nbsp;&nbsp;-1.0,0.0,500<br>&nbsp;&nbsp;END<br>&nbsp;&nbsp;REPEAT 4<br>&nbsp;&nbsp;&nbsp;BEGIN<br>&nbsp;&nbsp;&nbsp;&nbsp;0.0,1.0,500<br>&nbsp;&nbsp;&nbsp;END<br>&nbsp;&nbsp;&nbsp;BEGIN<br>&nbsp;&nbsp;&nbsp;&nbsp;0.0,-1.0,500<br>&nbsp;&nbsp;&nbsp;END<br>&nbsp;&nbsp;END<br>END<br><br>// Execute result:</p>
<p><img height=377 alt="" src="http://www.cppblog.com/images/cppblog_com/sysprogrammer/path_interpret.JPG" width=455 border=0></p>
<img src ="http://www.cppblog.com/SysProgrammer/aggbug/103817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SysProgrammer/" target="_blank">Reno</a> 2009-12-23 16:58 <a href="http://www.cppblog.com/SysProgrammer/archive/2009/12/23/Reno.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些问题的解决方法</title><link>http://www.cppblog.com/SysProgrammer/archive/2009/05/06/82061.html</link><dc:creator>Reno</dc:creator><author>Reno</author><pubDate>Wed, 06 May 2009 08:27:00 GMT</pubDate><guid>http://www.cppblog.com/SysProgrammer/archive/2009/05/06/82061.html</guid><wfw:comment>http://www.cppblog.com/SysProgrammer/comments/82061.html</wfw:comment><comments>http://www.cppblog.com/SysProgrammer/archive/2009/05/06/82061.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SysProgrammer/comments/commentRss/82061.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SysProgrammer/services/trackbacks/82061.html</trackback:ping><description><![CDATA[&nbsp;今天电脑怪怪的，出现了很多个无聊的小问题，注意,不是病之类的啊.不然的话虽然解决方法简单,但每一步都是相当浪费时间的.<br>&nbsp;&nbsp; 称为解决方法是因为这些问题实在太小了，方案根本算不上.<br>&nbsp;&nbsp; 1. 想要在VS2003下建立一个项目,弹出 Automation不能创建对象.GOOGLE后 regsvr32 scrrun.dll 注册搞定<br>&nbsp;&nbsp; 2. 想要打开&lt;&lt;MFC类库详解.CHM&gt;&gt;,弹出<a href="mailto:mk@DICTSTORE:your">mk@DICTSTORE:your</a> chm file absolute path,打不开,这个问题搞了会时间, \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a，右键关联chm文件的&#8220;打开方式&#8221;到\Windows\HH.exe&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b，在命令行运行regsvr32 itss.dll&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c，在命令行运行regsvr32 hhctrl.ocx <br>&nbsp;&nbsp; 3. 把原来的VC6项目移到VS2003后,编译出现:fatal error C1010: 在查找预编译头指令时遇到意外的文件结尾<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #000000">右键点项目名,选择属性,先不使用预编译头文件,然后再次编译,OK后在重新起用预编译头文件.填写StdAfx.h&nbsp; $(InitDir)\$(IntDir)/$(TargetName).pch<br><br>&nbsp;&nbsp; 遇到这些问题,GOOGLE下还是非常容易搞的.<br>&nbsp;&nbsp; bwt, 前几天重装系统,由于懒的装Anti-Virus,尤其是扫描时间.因此系统病毒有点多的.后面彻底革新,发现按以下顺序的执行指令,就可以保护好系统.<br>&nbsp;&nbsp; 1.下载360<br>&nbsp;&nbsp; 2. 打好所有遗漏补丁<br>&nbsp;&nbsp; 3. 开启WINDOWS防火墙,起用更新<br>&nbsp;&nbsp; 4.开启所有360保护<br>&nbsp;&nbsp; 5.下载KA巴,可以通过360直接下,<br>&nbsp;&nbsp; 6.更新病毒库到最新<br>&nbsp;&nbsp; 7.全系统扫描,该杀的杀<br>&nbsp;&nbsp; 公司里的电脑我就这样打造,结果呆了近2年,1次都没重装,有点恐怖的...<br><br>&nbsp;&nbsp; 发现CPU,指令集非常有趣,写的LamaVM虚拟机快好了.</span> 
<img src ="http://www.cppblog.com/SysProgrammer/aggbug/82061.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SysProgrammer/" target="_blank">Reno</a> 2009-05-06 16:27 <a href="http://www.cppblog.com/SysProgrammer/archive/2009/05/06/82061.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于C中数组名</title><link>http://www.cppblog.com/SysProgrammer/archive/2009/04/04/78951.html</link><dc:creator>Reno</dc:creator><author>Reno</author><pubDate>Sat, 04 Apr 2009 08:45:00 GMT</pubDate><guid>http://www.cppblog.com/SysProgrammer/archive/2009/04/04/78951.html</guid><wfw:comment>http://www.cppblog.com/SysProgrammer/comments/78951.html</wfw:comment><comments>http://www.cppblog.com/SysProgrammer/archive/2009/04/04/78951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SysProgrammer/comments/commentRss/78951.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SysProgrammer/services/trackbacks/78951.html</trackback:ping><description><![CDATA[<p style="FONT-FAMILY: Comic Sans MS">&nbsp;&nbsp;&nbsp;大半年没写了，说实在的我个人认为C++博客是最好的技术博客之一，我一直非常喜欢它，所以只要有时间，一定要写一些在上面。<br>&nbsp;&nbsp; 感悟最深的就是，好容易花数个小时搞出来的东西，过段时间竟然忘记了，或者是记忆也变得模糊了，很是心痛啊！记录下来，就不会有这种倒霉事了 :&lt;<br>&nbsp;&nbsp;&nbsp;言归正传，已经好像是在读《C专家编程》时，见到过说数组名是个很&#8220;奇特&#8221;的指针，某种意义上说，它不能称为指针，因为它只能作为右值出现，当时也比较迷惑，很偶然，今天在读《Unix环境高级编程》时，写一个打印出进程的环境变量表的小玩意，要用到environ这个全局指针，它就是个指针数组的名字，该数组每个元素为一个字符串，以'\0'结尾，数组最后一个元素为NULL，开始先把该数组的首地址拷贝给了另一个指针，char **pp = environ; 然后为了偏移到下一个字符串，我竟然低级的写了++environ，编译报错说: ISO C++ forbid to use a non-refernece type as a lvalue! 顿时想到environ是一个数组名，不能作为一个左值使用。于是又想到了如果int *ia1[]; int *ia2[]，当写ia1 = ia2时会出现同样的错，这就是因为ia1 ia2都为右值，任何一个不能出现在=号的左边充当左值！<br><br>代码1：<br>char *sz[] = { "aaa", "bbb", "ccc", 0 };<br>&nbsp;int i = 0;<br>&nbsp;while (sz[i] != 0)<br>&nbsp;{<br>&nbsp;&nbsp;char *p = sz[i];<br>&nbsp;&nbsp;printf("%s\n", p);<br>&nbsp;&nbsp;++i;<br>&nbsp;}<br><br>代码2: Unix系统上打印一个进程的环境变量表<br>char **pp = environ;</p>
<p style="FONT-FAMILY: Comic Sans MS">&nbsp;while (*pp != 0) {<br>&nbsp;&nbsp;printf("%s\n", *pp);<br>&nbsp;&nbsp;++pp;<br>&nbsp;}<br><br>少的可怜，1个小时浪费了....<br></p>
<img src ="http://www.cppblog.com/SysProgrammer/aggbug/78951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SysProgrammer/" target="_blank">Reno</a> 2009-04-04 16:45 <a href="http://www.cppblog.com/SysProgrammer/archive/2009/04/04/78951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>线程同步对象</title><link>http://www.cppblog.com/SysProgrammer/archive/2008/08/17/Thread.html</link><dc:creator>Reno</dc:creator><author>Reno</author><pubDate>Sun, 17 Aug 2008 14:17:00 GMT</pubDate><guid>http://www.cppblog.com/SysProgrammer/archive/2008/08/17/Thread.html</guid><wfw:comment>http://www.cppblog.com/SysProgrammer/comments/59164.html</wfw:comment><comments>http://www.cppblog.com/SysProgrammer/archive/2008/08/17/Thread.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SysProgrammer/comments/commentRss/59164.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SysProgrammer/services/trackbacks/59164.html</trackback:ping><description><![CDATA[<span style="COLOR: #ff0000; FONT-FAMILY: Comic Sans MS">&nbsp;<span style="FONT-SIZE: 14pt">&nbsp;Waiting for Multiple Objects<br><br>&nbsp;&nbsp;&nbsp; <span style="COLOR: #000000">在Windows中, <a id=ctl00_rs1_mainContentContainer_ctl03 onclick="javascript:Track('ctl00_rs1_mainContentContainer_ctl00|ctl00_rs1_mainContentContainer_ctl03',this);" href="http://msdn.microsoft.com/en-us/library/ms687025(VS.85).aspx"><strong><font color=#0033cc>WaitForMultipleObjects</font></strong></a>函数是一种同步的方法,原形定义如下:<br>&nbsp;&nbsp;&nbsp; DWORD WinApi WaitForMultipleObjects(&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD nCount, const Handle * lpHandles, BOOL bWaitAll, DWORD <em>dwMilliseconds );<br><br></em>&nbsp;&nbsp; 调用该函数的线程进入等待状态,直到条件满足时继续执行,条件的满足和参数有关.<br>&nbsp;&nbsp; 第一个参数为要等待的Objects的个数,通常这些Objects是一组句柄(Handles),可以是内核对象句柄或者是非内核对象<br>&nbsp;&nbsp; 句柄,这一组句柄由第2个指向分配给一系列句柄缓冲区的指针指出,第3个参数如果为TRUE,则等待的线程必须等到所有<br>&nbsp;&nbsp; 句柄全部完成执行后才继续执行,如果为FALSE, 那么只要有一个返回即可继续执行,第4个参数设置TIMEOUT的时间,<br>&nbsp;&nbsp; 如果在给定的dwMilliseconds内仍没等到条件满足则返回.<br><br>&nbsp;&nbsp; 那么如何得到等待的结果呢,如果bWaitAll设置为TRUE,将返回值和WAIT_OBJECT_0比较,如果相等则全部句柄都已<br>&nbsp;&nbsp; 发出了完成信号, 如果bWaitAll设置为FALSE, 如果只由一个发出信号,那么将返回值减去WAIT_OBJECT_0就是句<br>&nbsp;&nbsp; 柄数组中的索引,如果有多个信号发出,那么这个值是数组中最小索引的那一个.这样就可以判断是哪个发出了完成信号.<br><br>&nbsp;&nbsp; 通常,这些要等待的Objects是在其他的线程中执行的,那么执行完成后调用SetEvent( HANDLE hObjHandle )就可以<br>&nbsp;&nbsp; 发出一个完成信号,供调用WaitForMultipleObjects的线程接收.<br><br>&nbsp;&nbsp; 以下是一个如何使用该函数的简单例子,它使用CreateEvent函数创建了2个事件对象,放入全局的ghEvents缓存,然后<br>&nbsp;&nbsp; 创建了一个线程,等待该线程发出完成信号.<br>&nbsp;&nbsp; //<br>&nbsp; // Sync01.cpp<br>&nbsp; //<br>&nbsp;
<pre class=libCScode id=ctl00_rs1_mainContentContainer_ctl06 space="preserve">&nbsp;<span style="FONT-FAMILY: Comic Sans MS">#include &lt;windows.h&gt;
&nbsp;#include &lt;stdio.h&gt;
HANDLE ghEvents[2];
&nbsp;DWORD WINAPI ThreadProc( LPVOID );
void main()
{
HANDLE hThread;
DWORD i, dwEvent, dwThreadID;
// Create two event objects
for (i = 0; i &lt; 2; i++)
{
ghEvents[i] = CreateEvent(
NULL,   // default security attributes
FALSE,  // auto-reset event object
FALSE,  // initial state is nonsignaled
NULL);  // unnamed object
if (ghEvents[i] == NULL)
{
printf("CreateEvent error: %d\n", GetLastError() );
ExitProcess(0);
}
}
// Create a thread
hThread = CreateThread(
NULL,         // default security attributes
0,            // default stack size
(LPTHREAD_START_ROUTINE) ThreadProc,
NULL,         // no thread function arguments
0,            // default creation flags
&amp;dwThreadID); // receive thread identifier
if( hThread == NULL )
{
printf("CreateThread error: %d\n", GetLastError());
return;
}
// Wait for the thread to signal one of the event objects
dwEvent = WaitForMultipleObjects(
2,           // number of objects in array
ghEvents,     // array of objects
FALSE,       // wait for any object
5000);       // five-second wait
// The return value indicates which event is signaled
switch (dwEvent)
{
// ghEvents[0] was signaled
case WAIT_OBJECT_0 + 0:
// TODO: Perform tasks required by this event
printf("First event was signaled.\n");
break;
// ghEvents[1] was signaled
case WAIT_OBJECT_0 + 1:
// TODO: Perform tasks required by this event
printf("Second event was signaled.\n");
break;
case WAIT_TIMEOUT:
printf("Wait timed out.\n");
break;
// Return value is invalid.
default:
printf("Wait error: %d\n", GetLastError());
ExitProcess(0);
}
// Close event handles
for (i = 0; i &lt; 2; i++)
CloseHandle(ghEvents[i]);
}
DWORD WINAPI ThreadProc( LPVOID lpParam )
{
// Set one event to the signaled state
if ( !SetEvent(ghEvents[0]) )
{
printf("SetEvent failed (%d)\n", GetLastError());
return -1;
}
return 1;
}</span></pre>
</span></span></span>
<img src ="http://www.cppblog.com/SysProgrammer/aggbug/59164.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SysProgrammer/" target="_blank">Reno</a> 2008-08-17 22:17 <a href="http://www.cppblog.com/SysProgrammer/archive/2008/08/17/Thread.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>