<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-16045706</id><updated>2011-12-14T11:56:32.675+08:00</updated><title type='text'>颇若怪魔</title><subtitle type='html'>颇若怪魔，也就是programmer的意思:)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://guocongbin.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://guocongbin.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>大魔头</name><uri>http://www.blogger.com/profile/17396118389281260592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='11' src='http://photos1.blogger.com/blogger/5046/1508/1600/guocongbin1.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-16045706.post-116663579624314298</id><published>2006-12-21T01:29:00.000+08:00</published><updated>2006-12-21T01:29:56.283+08:00</updated><title type='text'>Policy Based Design and MultiInheritance</title><content type='html'>&lt;p&gt;基于策略的设计（&lt;font face="Times New Roman"&gt;Policy Based Design&lt;/font&gt;）包含两个重要的部分：策略类（&lt;font face="Times New Roman"&gt;Policy-Classes&lt;/font&gt;）和具有极大张力的核心。&lt;br&gt;  许多人在看基于策略的设计的时候，往往注意到了前者（策略类），注意到了正交分析的思想，却忽视了后者（核心）。这是因为策略类的思想较为容易接收，而且已经存在很多类似的概念。于是乎很多人认为基于策略的设计是作者在炒冷饭，是概念的炒作。还有人认为声称掌握了基于策略的设计思想，但是给出的代码却是基于单纯的多继承。&lt;br&gt;  其实&lt;font face="Times New Roman"&gt;Andrei Alexandrescu&lt;/font&gt;在&lt;font face="Times New Roman"&gt;Modern C++ Design&lt;/font&gt;中已经明确区别了基于策略的设计和多继承之间的区别。使用多继承是无法实现基于策略的设计的！正如前面所说，基于策略的设计包含两个方面：策略类和核心。而多继承包含什么呢？也包括两个方面：多个基类和子类的实现。下面就分别对比一下。&lt;br&gt;  策略类与多继承的基类。&lt;br&gt;  这两者比较类似，区别不是很大。但是策略类在涵盖范围上面，可以说，是超越了“类”的。策略类在理论上面可以是类型（包括基本类型和自定义类型）、数据和模板。这是因为模板可以接收三种参数：数值模板参数、类型模板参数和模板模板参数。相比之下，可以用作多继承的基类的东东，只有“类”了。&lt;br&gt;  核心与多继承中子类的实现。&lt;br&gt;  这是两个概念的更加重大的区别，也是基于策略的设计较多继承更加优越的地方。优越的地方有二：基于策略的设计已经为用户提供了一个实现的框架；基于策略的设计可以避免滥用多继承导致的组合爆炸问题。&lt;br&gt;  实现的框架就是指前面所说的具有极大张力的核心。例如我们使用&lt;font face="Times New Roman"&gt;Loki::SmartPtr&lt;/font&gt;的时候，从来都是拿来就用，从来都没有考虑过&lt;font face="Times New Roman"&gt;SmartPtr&lt;/font&gt;的内部实现问题。这就是因为&lt;font face="Times New Roman"&gt;SmartPtr&lt;/font&gt;已经为我们提供了一个实现框架，我们需要作的只是选择不同的策略类进行组合。几个零件，往&lt;font face="Times New Roman"&gt;SmartPtr&lt;/font&gt;上面一安就&lt;font face="Times New Roman"&gt;OK&lt;/font&gt;了。&lt;br&gt;  如果换作多继承呢？多继承如何来处理这个问题？用户自己来实现？自己实现，费时费力，还免不了有一个&lt;font face="Times New Roman"&gt;bug&lt;/font&gt;，一点都没有体现出复用的优势，不利于软件质量的提高。&lt;br&gt;  这位看官说了，让基础库的设计者为我们提供这个实现。好，还是举&lt;font face="Times New Roman"&gt;SmartPtr&lt;/font&gt;的例子，&lt;font face="Times New Roman"&gt;SmartPtr&lt;/font&gt;的定义如下：&lt;br&gt;  &lt;font face="Courier New"&gt;1  &lt;/font&gt;&lt;b&gt;&lt;font color="#800000" face="Courier New"&gt;template&lt;/font&gt;&lt;/b&gt;&lt;br&gt;  &lt;font face="Courier New"&gt;2  &amp;lt;&lt;/font&gt;&lt;br&gt;  &lt;font face="Courier New"&gt;3  &lt;/font&gt;&lt;font face="Times New Roman"&gt;	&lt;/font&gt;&lt;b&gt;&lt;font color="#800000" face="Courier New"&gt;typename &lt;/font&gt;&lt;/b&gt;&lt;font face="Courier New"&gt;T&lt;/font&gt;&lt;font color="#A13F00" face="Courier New"&gt;;&lt;/font&gt;&lt;br&gt;  &lt;font face="Courier New"&gt;4  &lt;/font&gt;&lt;font face="Times New Roman"&gt;	&lt;/font&gt;&lt;b&gt;&lt;font color="#800000" face="Courier New"&gt;template &lt;/font&gt;&lt;/b&gt;&lt;font face="Courier New"&gt;&amp;lt;&lt;/font&gt;&lt;b&gt;&lt;font color="#800000" face="Courier New"&gt;class&lt;/font&gt;&lt;/b&gt;&lt;font face="Courier New"&gt;&amp;gt; &lt;/font&gt;&lt;b&gt;&lt;font color="#800000" face="Courier New"&gt;class &lt;/font&gt;&lt;/b&gt;&lt;font face="Courier New"&gt;OwnershipPolicy &lt;/font&gt;&lt;font color="#A13F00" face="Courier New"&gt;= &lt;/font&gt;&lt;font face="Courier New"&gt;RefCounted&lt;/font&gt;&lt;font color="#A13F00" face="Courier New"&gt;,&lt;/font&gt;&lt;br&gt;  &lt;font face="Courier New"&gt;5  &lt;/font&gt;&lt;font face="Times New Roman"&gt;	&lt;/font&gt;&lt;b&gt;&lt;font color="#800000" face="Courier New"&gt;class &lt;/font&gt;&lt;/b&gt;&lt;font face="Courier New"&gt;ConversionPolicy &lt;/font&gt;&lt;font color="#A13F00" face="Courier New"&gt;= &lt;/font&gt;&lt;font face="Courier New"&gt;DisallowConversion&lt;/font&gt;&lt;font color="#A13F00" face="Courier New"&gt;,&lt;/font&gt;&lt;br&gt;  &lt;font face="Courier New"&gt;6  &lt;/font&gt;&lt;font face="Times New Roman"&gt;	&lt;/font&gt;&lt;b&gt;&lt;font color="#800000" face="Courier New"&gt;template &lt;/font&gt;&lt;/b&gt;&lt;font face="Courier New"&gt;&amp;lt;&lt;/font&gt;&lt;b&gt;&lt;font color="#800000" face="Courier New"&gt;class&lt;/font&gt;&lt;/b&gt;&lt;font face="Courier New"&gt;&amp;gt; &lt;/font&gt;&lt;b&gt;&lt;font color="#800000" face="Courier New"&gt;class &lt;/font&gt;&lt;/b&gt;&lt;font face="Courier New"&gt;CheckingPolicy &lt;/font&gt;&lt;font color="#A13F00" face="Courier New"&gt;= &lt;/font&gt;&lt;font face="Courier New"&gt;AssertCheck&lt;/font&gt;&lt;font color="#A13F00" face="Courier New"&gt;,&lt;/font&gt;&lt;br&gt;  &lt;font face="Courier New"&gt;7  &lt;/font&gt;&lt;font face="Times New Roman"&gt;	&lt;/font&gt;&lt;b&gt;&lt;font color="#800000" face="Courier New"&gt;template &lt;/font&gt;&lt;/b&gt;&lt;font face="Courier New"&gt;&amp;lt;&lt;/font&gt;&lt;b&gt;&lt;font color="#800000" face="Courier New"&gt;class&lt;/font&gt;&lt;/b&gt;&lt;font face="Courier New"&gt;&amp;gt; &lt;/font&gt;&lt;b&gt;&lt;font color="#800000" face="Courier New"&gt;class &lt;/font&gt;&lt;/b&gt;&lt;font face="Courier New"&gt;StoragePolicy &lt;/font&gt;&lt;font color="#A13F00" face="Courier New"&gt;= &lt;/font&gt;&lt;font face="Courier New"&gt;DefaultSPStorage&lt;/font&gt;&lt;br&gt;  &lt;font face="Courier New"&gt;8  &amp;gt;&lt;/font&gt;&lt;br&gt;  &lt;font face="Courier New"&gt;9  &lt;/font&gt;&lt;b&gt;&lt;font color="#800000" face="Courier New"&gt;class &lt;/font&gt;&lt;/b&gt;&lt;font face="Courier New"&gt;SmartPtr&lt;/font&gt;&lt;font color="#A13F00" face="Courier New"&gt;;&lt;/font&gt;&lt;br&gt;  考虑比较简单的情况，继承库的实现者们为每个&lt;font face="Times New Roman"&gt;Policy&lt;/font&gt;提供了两个个预定义的实现，那么四个&lt;font face="Times New Roman"&gt;Policy&lt;/font&gt;一组合，就意味着新产生了&lt;font face="Times New Roman"&gt;16&lt;/font&gt;个新的子类。呜乎哀哉，爆炸了。不但组合爆炸，而且还不解决问题：如果用户使用自定义的&lt;font face="Times New Roman"&gt;Policy&lt;/font&gt;，依然要自行派生新的子类。&lt;br&gt;  而基于策略的设计，为用户提供了一个使用模板实现的核心，这个核心只需要一个实现，不需要用户重复实现；而且可以接收用户自定义的&lt;font face="Times New Roman"&gt;Policy&lt;/font&gt;，拿来就用，不需要多余的代码，达到了充分的代码复用。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16045706-116663579624314298?l=guocongbin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://guocongbin.blogspot.com/feeds/116663579624314298/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16045706&amp;postID=116663579624314298&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116663579624314298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116663579624314298'/><link rel='alternate' type='text/html' href='http://guocongbin.blogspot.com/2006/12/policy-based-design-and.html' title='Policy Based Design and MultiInheritance'/><author><name>大魔头</name><uri>http://www.blogger.com/profile/17396118389281260592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='11' src='http://photos1.blogger.com/blogger/5046/1508/1600/guocongbin1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16045706.post-116539073549683074</id><published>2006-12-06T15:37:00.000+08:00</published><updated>2006-12-06T15:38:55.503+08:00</updated><title type='text'>一个好用的重定向类</title><content type='html'>想编写自己的IDE软件么？是不是需要一个重定向类呢？我在codeguru上面找到了一个好用的，另外加以了一些改进。&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;前一段时间要编写一个类似于IDE的软件，发现要通过GUI截获标准通道的输出还是比较麻烦的事情。网上有一些介绍的文章，但是发现都比较复杂，而且封装性不是很好。&lt;br /&gt;&lt;br /&gt;在www.codeguru.com上面，我偶然发现了这个类，它编写的很好，可以截获stdout和stderr的输出，而且封装性好，使用方便。&lt;br /&gt;&lt;br /&gt;美中不足的就是这个类里面指定的输出方式是输出到一个CEdit控件里面，这就极大的限制了改类的使用，我将其进行了改进：主要是提取一个输出的接口，如果用户希望输出到其他控件，只需要自己继承一个子类并实现，而不需要修改原有的代码。这也是对依赖导致原则（DIP）的一种应用吧。下面就把所有的代码贴出来。&lt;br /&gt;&lt;br /&gt;// FILE :Redirect.h&lt;br /&gt;&lt;br /&gt;#ifndef REDIRECT_H_INCLUDED__&lt;br /&gt;#define REDIRECT_H_INCLUDED__&lt;br /&gt;// the file is download from www.codeguru.com&lt;br /&gt;&lt;br /&gt;class CRedirect&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; class COutputer{&lt;br /&gt; public:&lt;br /&gt;  COutputer(CWnd* pWnd):_pWnd(pWnd){}&lt;br /&gt;  virtual void Output(LPCTSTR text) = 0;&lt;br /&gt; protected:&lt;br /&gt;  CWnd* _pWnd; // the window that output the text&lt;br /&gt; };&lt;br /&gt;public:&lt;br /&gt;&lt;br /&gt; CRedirect&lt;br /&gt; (&lt;br /&gt;  LPCTSTR  szCommand,&lt;br /&gt;  COutputer&amp; pOutput,&lt;br /&gt;  LPCTSTR  szCurrentDirectory = NULL&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; ~CRedirect();&lt;br /&gt;&lt;br /&gt; // public member functions&lt;br /&gt; virtual void  Run();&lt;br /&gt; virtual void  Stop();&lt;br /&gt;&lt;br /&gt;protected:&lt;br /&gt; void    AppendText(LPCTSTR Text);&lt;br /&gt; void    PeekAndPump();&lt;br /&gt; void    SetSleepInterval(DWORD dwMilliseconds);&lt;br /&gt; void    ShowLastError(LPCTSTR szText);&lt;br /&gt;&lt;br /&gt;protected:&lt;br /&gt; bool    m_bStopped;&lt;br /&gt; DWORD    m_dwSleepMilliseconds;&lt;br /&gt; COutputer&amp;   m_pOutput;&lt;br /&gt; LPCTSTR    m_szCommand;&lt;br /&gt; LPCTSTR    m_szCurrentDirectory;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class CEditOutputer : public CRedirect::COutputer&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; CEditOutputer(CWnd* pWnd ):COutputer(pWnd){}&lt;br /&gt; void Output(LPCTSTR text)&lt;br /&gt; {&lt;br /&gt;  CEdit* pEdit = dynamic_cast&lt;CEdit*&gt;(_pWnd);&lt;br /&gt;  if (pEdit) {&lt;br /&gt;   int Length = pEdit-&gt;GetWindowTextLength();&lt;br /&gt;&lt;br /&gt;   pEdit-&gt;SetSel(Length, Length);&lt;br /&gt;   pEdit-&gt;ReplaceSel(text);&lt;br /&gt;   pEdit-&gt;LineScroll( pEdit-&gt;GetLineCount() );&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;class CListBoxOutputer : public CRedirect::COutputer&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; CListBoxOutputer(CWnd* pWnd):COutputer(pWnd){}&lt;br /&gt; void Output(LPCTSTR text)&lt;br /&gt; {&lt;br /&gt;  CListBox* pList = (CListBox*)_pWnd;&lt;br /&gt;  if (pList) {&lt;br /&gt;   const int bufLen = 100;&lt;br /&gt;   TCHAR buffer [bufLen];&lt;br /&gt;   while (*text) {&lt;br /&gt;    TCHAR* p = buffer;&lt;br /&gt;    int cCopied = 0;&lt;br /&gt;    while ( *text &amp;&amp; *text!= _T('n') &amp;&amp; cCopied &lt; bufLen -1) {&lt;br /&gt;     *p ++ = * text++;&lt;br /&gt;    }&lt;br /&gt;    *p = _T('');&lt;br /&gt;    text ? text++ : text;&lt;br /&gt;    pList-&gt;AddString(buffer);&lt;br /&gt;   }&lt;br /&gt;   pList-&gt;SetCurSel(pList-&gt;GetCount() -1);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;};&lt;br /&gt;#endif // REDIRECT_H_INCLUDED__&lt;br /&gt;&lt;br /&gt;// FILE :Redirect.cpp&lt;br /&gt;&lt;br /&gt;//------------------------------------------------------------------------------&lt;br /&gt;// Redirect.cpp : implementation file&lt;br /&gt;//&lt;br /&gt;// Creates a child process that runs a user-specified command and redirects its&lt;br /&gt;// standard output and standard error to a CEdit control.&lt;br /&gt;//&lt;br /&gt;// Written by Matt Brunk (brunk@gorge.net)&lt;br /&gt;// Copyright (C) 1999 Matt Brunk&lt;br /&gt;// All rights reserved.&lt;br /&gt;//&lt;br /&gt;// This code may be used in compiled form in any way. This file may be&lt;br /&gt;// distributed by any means providing it is not sold for profit without&lt;br /&gt;// the written consent of the author, and providing that this notice and the&lt;br /&gt;// author's name is included in the distribution. If the compiled form of the&lt;br /&gt;// source code in this file is used in a commercial application, an e-mail to&lt;br /&gt;// the author would be appreciated.&lt;br /&gt;//&lt;br /&gt;// Thanks to Dima Shamroni (dima@abirnet.co.il) for providing the essential&lt;br /&gt;// code for this class.&lt;br /&gt;//&lt;br /&gt;// Thanks to Chris Maunder (chrismaunder@codeguru.com) for the PeekAndPump()&lt;br /&gt;// function (from his CProgressWnd class).&lt;br /&gt;//&lt;br /&gt;// Initial Release Feb 8, 1999&lt;br /&gt;//------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;//////////////////////////////////////////////////////////////////////////&lt;br /&gt;// the code is modified by Guo Congbin (guocongbin@sei.buaa.edu.cn)&lt;br /&gt;// on Dec 23, 2005&lt;br /&gt;&lt;br /&gt;#include "stdafx.h"&lt;br /&gt;#include "Redirect.h"&lt;br /&gt;&lt;br /&gt;const int BUF_SIZE = 10240;&lt;br /&gt;&lt;br /&gt;CRedirect::CRedirect(LPCTSTR szCommand, COutputer&amp; pOutput, LPCTSTR szCurrentDirectory)&lt;br /&gt;:m_bStopped(false),m_dwSleepMilliseconds(100),m_pOutput(pOutput),m_szCommand(szCommand),&lt;br /&gt;m_szCurrentDirectory(szCurrentDirectory)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CRedirect::~CRedirect()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CRedirect::Run()&lt;br /&gt;{&lt;br /&gt; HANDLE     PipeReadHandle;&lt;br /&gt; HANDLE     PipeWriteHandle;&lt;br /&gt; PROCESS_INFORMATION  ProcessInfo;&lt;br /&gt; SECURITY_ATTRIBUTES  SecurityAttributes;&lt;br /&gt; STARTUPINFO    StartupInfo;&lt;br /&gt; BOOL     Success;&lt;br /&gt;&lt;br /&gt; //--------------------------------------------------------------------------&lt;br /&gt; // Zero the structures.&lt;br /&gt; //--------------------------------------------------------------------------&lt;br /&gt; ZeroMemory( &amp;StartupInfo,   sizeof( StartupInfo ));&lt;br /&gt; ZeroMemory( &amp;ProcessInfo,   sizeof( ProcessInfo ));&lt;br /&gt; ZeroMemory( &amp;SecurityAttributes, sizeof( SecurityAttributes ));&lt;br /&gt;&lt;br /&gt; //--------------------------------------------------------------------------&lt;br /&gt; // Create a pipe for the child's STDOUT.&lt;br /&gt; //--------------------------------------------------------------------------&lt;br /&gt; SecurityAttributes.nLength              = sizeof(SECURITY_ATTRIBUTES);&lt;br /&gt; SecurityAttributes.bInheritHandle       = TRUE;&lt;br /&gt; SecurityAttributes.lpSecurityDescriptor = NULL;&lt;br /&gt;&lt;br /&gt; Success = CreatePipe&lt;br /&gt; (&lt;br /&gt;  &amp;PipeReadHandle,  // address of variable for read handle&lt;br /&gt;  &amp;PipeWriteHandle,  // address of variable for write handle&lt;br /&gt;  &amp;SecurityAttributes, // pointer to security attributes&lt;br /&gt;  0      // number of bytes reserved for pipe (use default size)&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; if ( !Success )&lt;br /&gt; {&lt;br /&gt;  ShowLastError(_T("Error creating pipe"));&lt;br /&gt;  return;&lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; //--------------------------------------------------------------------------&lt;br /&gt; // Set up members of STARTUPINFO structure.&lt;br /&gt; //--------------------------------------------------------------------------&lt;br /&gt; StartupInfo.cb           = sizeof(STARTUPINFO);&lt;br /&gt; StartupInfo.dwFlags      = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;&lt;br /&gt; StartupInfo.wShowWindow  = SW_HIDE;&lt;br /&gt; StartupInfo.hStdOutput   = PipeWriteHandle;&lt;br /&gt; StartupInfo.hStdError    = PipeWriteHandle;&lt;br /&gt;&lt;br /&gt; //----------------------------------------------------------------------------&lt;br /&gt; // Create the child process.&lt;br /&gt; //----------------------------------------------------------------------------&lt;br /&gt; Success = CreateProcess&lt;br /&gt; ( &lt;br /&gt;  NULL,     // pointer to name of executable module&lt;br /&gt;  LPTSTR(m_szCommand), // command line &lt;br /&gt;  NULL,     // pointer to process security attributes &lt;br /&gt;  NULL,     // pointer to thread security attributes (use primary thread security attributes)&lt;br /&gt;  TRUE,     // inherit handles&lt;br /&gt;  0,      // creation flags&lt;br /&gt;  NULL,     // pointer to new environment block (use parent's)&lt;br /&gt;  m_szCurrentDirectory, // pointer to current directory name&lt;br /&gt;  &amp;StartupInfo,   // pointer to STARTUPINFO&lt;br /&gt;  &amp;ProcessInfo   // pointer to PROCESS_INFORMATION&lt;br /&gt; );                 &lt;br /&gt;&lt;br /&gt; if ( !Success )&lt;br /&gt; {&lt;br /&gt;  ShowLastError(_T("Error creating process"));&lt;br /&gt;  return;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; DWORD BytesLeftThisMessage = 0;&lt;br /&gt; DWORD NumBytesRead;&lt;br /&gt; TCHAR PipeData[BUF_SIZE]; &lt;br /&gt; DWORD TotalBytesAvailable = 0;&lt;br /&gt;&lt;br /&gt; for ( ; ; )&lt;br /&gt; { &lt;br /&gt;  NumBytesRead = 0;&lt;br /&gt;&lt;br /&gt;  Success = PeekNamedPipe&lt;br /&gt;  ( &lt;br /&gt;   PipeReadHandle,    // handle to pipe to copy from &lt;br /&gt;   PipeData,     // pointer to data buffer &lt;br /&gt;   1,       // size, in bytes, of data buffer &lt;br /&gt;   &amp;NumBytesRead,    // pointer to number of bytes read &lt;br /&gt;   &amp;TotalBytesAvailable,  // pointer to total number of bytes available&lt;br /&gt;   &amp;BytesLeftThisMessage  // pointer to unread bytes in this message &lt;br /&gt;  );&lt;br /&gt;&lt;br /&gt;  if ( !Success )&lt;br /&gt;  {&lt;br /&gt;   ShowLastError(_T("PeekNamedPipe fialed"));&lt;br /&gt;   break;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if ( NumBytesRead )&lt;br /&gt;  {&lt;br /&gt;   Success = ReadFile&lt;br /&gt;   (&lt;br /&gt;    PipeReadHandle,  // handle to pipe to copy from &lt;br /&gt;    PipeData,   // address of buffer that receives data&lt;br /&gt;    BUF_SIZE - 1,  // number of bytes to read&lt;br /&gt;    &amp;NumBytesRead,  // address of number of bytes read&lt;br /&gt;    NULL    // address of structure for data for overlapped I/O&lt;br /&gt;   );&lt;br /&gt;&lt;br /&gt;   if ( !Success )&lt;br /&gt;   {&lt;br /&gt;    ShowLastError(_T("ReadFile fialed"));&lt;br /&gt;    break;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   //------------------------------------------------------------------&lt;br /&gt;   // Zero-terminate the data.&lt;br /&gt;   //------------------------------------------------------------------&lt;br /&gt;   PipeData[NumBytesRead] = '';&lt;br /&gt;&lt;br /&gt;   //------------------------------------------------------------------&lt;br /&gt;   // Replace backspaces with spaces.&lt;br /&gt;   //------------------------------------------------------------------&lt;br /&gt;   for ( DWORD ii = 0; ii &lt; NumBytesRead; ii++ )&lt;br /&gt;   {&lt;br /&gt;    if ( PipeData[ii] == _T('b') )&lt;br /&gt;    {&lt;br /&gt;     PipeData[ii] = ' ';&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   //------------------------------------------------------------------&lt;br /&gt;   // If we're running a batch file that contains a pause command, &lt;br /&gt;   // assume it is the last output from the batch file and remove it.&lt;br /&gt;   //------------------------------------------------------------------&lt;br /&gt;   TCHAR  *ptr = _tcsstr(PipeData, _T("Press any key to continue . . ."));&lt;br /&gt;   if ( ptr )&lt;br /&gt;   {&lt;br /&gt;    *ptr = '';&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   //------------------------------------------------------------------&lt;br /&gt;   // Append the output to the CEdit control.&lt;br /&gt;   //------------------------------------------------------------------&lt;br /&gt;   AppendText(PipeData);&lt;br /&gt;&lt;br /&gt;   //------------------------------------------------------------------&lt;br /&gt;   // Peek and pump messages.&lt;br /&gt;   //------------------------------------------------------------------&lt;br /&gt;   PeekAndPump();&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;   //------------------------------------------------------------------&lt;br /&gt;   // If the child process has completed, break out.&lt;br /&gt;   //------------------------------------------------------------------&lt;br /&gt;   if ( WaitForSingleObject(ProcessInfo.hProcess, 0) == WAIT_OBJECT_0 )&lt;br /&gt;   //lint !e1924 (warning about C-style cast)&lt;br /&gt;   {&lt;br /&gt;    break;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   //------------------------------------------------------------------&lt;br /&gt;   // Peek and pump messages.&lt;br /&gt;   //------------------------------------------------------------------&lt;br /&gt;   PeekAndPump();&lt;br /&gt;&lt;br /&gt;   //------------------------------------------------------------------&lt;br /&gt;   // If the user cancelled the operation, terminate the process.&lt;br /&gt;   //------------------------------------------------------------------&lt;br /&gt;   if ( m_bStopped )&lt;br /&gt;   {&lt;br /&gt;    Success = TerminateProcess&lt;br /&gt;    (&lt;br /&gt;     ProcessInfo.hProcess,&lt;br /&gt;     0&lt;br /&gt;    );&lt;br /&gt;&lt;br /&gt;    if ( Success )&lt;br /&gt;    {&lt;br /&gt;     AppendText(_T("rnCancelled.rnrnProcess terminated successfully.rn"));&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;     ShowLastError(_T("Error terminating process."));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    break;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   //------------------------------------------------------------------&lt;br /&gt;   // Sleep.&lt;br /&gt;   //------------------------------------------------------------------&lt;br /&gt;   Sleep(m_dwSleepMilliseconds);&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; //--------------------------------------------------------------------------&lt;br /&gt; // Close handles.&lt;br /&gt; //--------------------------------------------------------------------------&lt;br /&gt; Success = CloseHandle(ProcessInfo.hThread);&lt;br /&gt; if ( !Success )&lt;br /&gt; {&lt;br /&gt;  ShowLastError(_T("Error closing thread handle."));&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; Success = CloseHandle(ProcessInfo.hProcess);&lt;br /&gt; if ( !Success )&lt;br /&gt; {&lt;br /&gt;  ShowLastError(_T("Error closing process handle."));&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; Success = CloseHandle(PipeReadHandle);&lt;br /&gt; if ( !Success )&lt;br /&gt; {&lt;br /&gt;  ShowLastError(_T("Error closing pipe read handle."));&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; Success = CloseHandle(PipeWriteHandle);&lt;br /&gt; if ( !Success )&lt;br /&gt; {&lt;br /&gt;  ShowLastError(_T("Error closing pipe write handle."));&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void CRedirect::ShowLastError(LPCTSTR szText)&lt;br /&gt;{&lt;br /&gt; LPVOID  lpMsgBuf;&lt;br /&gt; DWORD  Success;&lt;br /&gt;&lt;br /&gt; //--------------------------------------------------------------------------&lt;br /&gt; // Get the system error message.&lt;br /&gt; //--------------------------------------------------------------------------&lt;br /&gt; Success = FormatMessage&lt;br /&gt; (&lt;br /&gt;  FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,&lt;br /&gt;  NULL,&lt;br /&gt;  GetLastError(),&lt;br /&gt;  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //lint !e1924 (warning about C-style cast)&lt;br /&gt;  LPTSTR(&amp;lpMsgBuf),&lt;br /&gt;  0,&lt;br /&gt;  NULL&lt;br /&gt; );&lt;br /&gt;&lt;br /&gt; CString Msg;&lt;br /&gt;&lt;br /&gt; Msg = szText;&lt;br /&gt; Msg += _T("rn");&lt;br /&gt; if ( Success )&lt;br /&gt; {&lt;br /&gt;  Msg += LPTSTR(lpMsgBuf);&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  Msg += _T("No status because FormatMessage failed.rn");&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; AppendText(Msg);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CRedirect::PeekAndPump()&lt;br /&gt;{&lt;br /&gt;    MSG Msg;&lt;br /&gt;    while (::PeekMessage(&amp;Msg, NULL, 0, 0, PM_NOREMOVE)) &lt;br /&gt;    {&lt;br /&gt;        (void)AfxGetApp()-&gt;PumpMessage(); //lint !e1924 (warning about C-style cast)&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CRedirect::Stop()&lt;br /&gt;{&lt;br /&gt; m_bStopped = true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CRedirect::AppendText(LPCTSTR Text)&lt;br /&gt;{&lt;br /&gt; m_pOutput.Output(Text);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CRedirect::SetSleepInterval(DWORD dwMilliseconds)&lt;br /&gt;{&lt;br /&gt; m_dwSleepMilliseconds = dwMilliseconds;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16045706-116539073549683074?l=guocongbin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://guocongbin.blogspot.com/feeds/116539073549683074/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16045706&amp;postID=116539073549683074&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116539073549683074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116539073549683074'/><link rel='alternate' type='text/html' href='http://guocongbin.blogspot.com/2006/12/blog-post_06.html' title='一个好用的重定向类'/><author><name>大魔头</name><uri>http://www.blogger.com/profile/17396118389281260592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='11' src='http://photos1.blogger.com/blogger/5046/1508/1600/guocongbin1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16045706.post-116537180212356488</id><published>2006-12-06T10:23:00.000+08:00</published><updated>2006-12-06T14:48:46.336+08:00</updated><title type='text'>Common C++ 应用之三：分析本地xml文件</title><content type='html'>&lt;p&gt;&lt;span style="font-size:130%;"&gt;Common C++的demo中有一个parse xml文件的例子，但是这个例子在windows平台下，读取本地文件时候总是显示 xml文件格式错误，这是因为这个例子中使用的类是从URLStream类和XMLStream类派生出来的，因此不适合读取本地文件。我们可以从stl中的ifstream类和XMLStream类来编写一个分析本地xml文件的例子。具体的代码如下。&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;span style="font-size:130%;color:#0000ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;#include&lt;/span&gt; &amp;lt;cc++/common.h&amp;gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;#include&lt;/span&gt; &amp;lt;iostream&amp;gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;#include&lt;/span&gt; &amp;lt;cstdlib&amp;gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;#include&lt;/span&gt; &amp;lt;fstream&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; std;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; ost;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; myXMLParser : &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ifstream, &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; XMLStream&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt;:&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; out;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; read(&lt;span style="color:#0000ff;"&gt;unsigned&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;char&lt;/span&gt; *buffer, size_t len)&lt;br /&gt;{&lt;br /&gt;ifstream::read((&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt; *)buffer, len);&lt;br /&gt;len = gcount();&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; len;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; characters(&lt;span style="color:#0000ff;"&gt;const&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;unsigned&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;char&lt;/span&gt; *text, size_t len)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;(out){&lt;br /&gt;cout &amp;lt;&amp;lt;text;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; startElement(&lt;span style="color:#0000ff;"&gt;const&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;unsigned&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;char&lt;/span&gt; *name, &lt;span style="color:#0000ff;"&gt;const&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;unsigned&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;char&lt;/span&gt; **attr)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;( strcmp((&lt;span style="color:#0000ff;"&gt;const&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;*)name, "CITY") == 0){&lt;br /&gt;out = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;{&lt;br /&gt;out = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; endElement(&lt;span style="color:#0000ff;"&gt;const&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;unsigned&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;char&lt;/span&gt; *name)&lt;br /&gt;{&lt;br /&gt;out =&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;:&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Close(&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;ifstream::close();&lt;br /&gt;}&lt;br /&gt;myXMLParser(&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;* path): ifstream(path){&lt;br /&gt;out =&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; main(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; argc, &lt;span style="color:#0000ff;"&gt;char&lt;/span&gt; **argv)&lt;br /&gt;{&lt;br /&gt;URLStream::Error status;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;// url.setProxy("home.sys", 8000);&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;while&lt;/span&gt;(--argc)&lt;br /&gt;{&lt;br /&gt;++argv;&lt;br /&gt;cout &amp;lt;&amp;lt; "fetching " &amp;lt;&amp;lt; *argv &amp;lt;&amp;lt; endl;&lt;br /&gt;myXMLParser xml(*argv);&lt;br /&gt;&lt;span style="color:#008000;"&gt;/*&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;status = xml.get(*argv);&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;if(status)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;cout &amp;lt;&amp;lt; "failed; reason=" &amp;lt;&amp;lt; status &amp;lt;&amp;lt; endl;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;xml.Close();&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;continue;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;*/&lt;/span&gt;&lt;br /&gt;cout &amp;lt;&amp;lt; "Parsing..." &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;(!xml.parse())&lt;br /&gt;cout &amp;lt;&amp;lt; "not well formed..." &amp;lt;&amp;lt; endl;&lt;br /&gt;xml.Close();&lt;br /&gt;cout &amp;lt;&amp;lt; ends;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt;(...)&lt;br /&gt;{&lt;br /&gt;cerr &amp;lt;&amp;lt; "url " &amp;lt;&amp;lt; *argv &amp;lt;&amp;lt; " failed" &amp;lt;&amp;lt; endl;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16045706-116537180212356488?l=guocongbin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://guocongbin.blogspot.com/feeds/116537180212356488/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16045706&amp;postID=116537180212356488&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116537180212356488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116537180212356488'/><link rel='alternate' type='text/html' href='http://guocongbin.blogspot.com/2006/12/common-c-xml_06.html' title='Common C++ 应用之三：分析本地xml文件'/><author><name>大魔头</name><uri>http://www.blogger.com/profile/17396118389281260592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='11' src='http://photos1.blogger.com/blogger/5046/1508/1600/guocongbin1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16045706.post-116531412675094335</id><published>2006-12-05T18:22:00.000+08:00</published><updated>2006-12-05T23:12:45.853+08:00</updated><title type='text'>门口的车站</title><content type='html'>小区门口新开了一趟公交线路，这对于地处城乡结合部的我们小区本来是一件好事。而且新线路与老线路都经过公司，这样我上班本来是会更加的方便。但是如果好事不被好好办，那就让人觉得有些冒火。&lt;br /&gt;&lt;p&gt;新线路的车站与原有线路的车站相距足足有200米的距离，在一个车站等车就不可能搭上另外一趟车。因此，现在的两条线路和以前的一条现图，对我来说没有什么两样。&lt;/p&gt;&lt;p&gt;现在，我也有我的对策了。我出门后会先去距离家比较近的车站。如果没有来车，我就继续走，走到两个车站的中间，然后拼命的向公交车来的方向张望。看见哪趟车来了，我就赶紧向哪个车站狂奔。每次上车之后，我都是气喘吁吁，狼狈至极啊。&lt;/p&gt;&lt;p&gt;唉，中国人的公众服务意识，真是让人无言以对。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16045706-116531412675094335?l=guocongbin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://guocongbin.blogspot.com/feeds/116531412675094335/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16045706&amp;postID=116531412675094335&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116531412675094335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116531412675094335'/><link rel='alternate' type='text/html' href='http://guocongbin.blogspot.com/2006/12/blog-post_05.html' title='门口的车站'/><author><name>大魔头</name><uri>http://www.blogger.com/profile/17396118389281260592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='11' src='http://photos1.blogger.com/blogger/5046/1508/1600/guocongbin1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16045706.post-116521119789568294</id><published>2006-12-04T13:46:00.000+08:00</published><updated>2006-12-06T15:22:29.943+08:00</updated><title type='text'>CommonC++ 应用之二：使用Get访问HTTP服务器</title><content type='html'>&lt;p&gt;相对于POST，基于Common C＋＋，使用GET方法访问http服务器就简单很多了。我们只需要构造一个url字符串，包括所有的参数（前面的"http://"不可以省略）。然后调用URLStream的get方法。下面的代码也是用来调用一个webservice来得到北京的当前天气的。代码和Common C＋＋中的urlfetch.cpp几乎完全相同。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;// Copyright (C) 2001 Open Source Telecom Corporation.&lt;br /&gt;//  &lt;br /&gt;// This program is free software; you can redistribute it and/or modify&lt;br /&gt;// it under the terms of the GNU General Public License as published by&lt;br /&gt;// the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;// (at your option) any later version.&lt;br /&gt;// &lt;br /&gt;// This program is distributed in the hope that it will be useful,&lt;br /&gt;// but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;// GNU General Public License for more details.&lt;br /&gt;//&lt;br /&gt;// You should have received a copy of the GNU General Public License&lt;br /&gt;// along with this program; if not, write to the Free Software &lt;br /&gt;// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.&lt;br /&gt;// &lt;br /&gt;// As a special exception to the GNU General Public License, permission is &lt;br /&gt;// granted for additional uses of the text contained in its release &lt;br /&gt;// of Common C++.&lt;br /&gt;// &lt;br /&gt;// The exception is that, if you link the Common C++ library with other&lt;br /&gt;// files to produce an executable, this does not by itself cause the&lt;br /&gt;// resulting executable to be covered by the GNU General Public License.&lt;br /&gt;// Your use of that executable is in no way restricted on account of&lt;br /&gt;// linking the Common C++ library code into it.&lt;br /&gt;//&lt;br /&gt;// This exception does not however invalidate any other reasons why&lt;br /&gt;// the executable file might be covered by the GNU General Public License.&lt;br /&gt;//&lt;br /&gt;// This exception applies only to the code released under the &lt;br /&gt;// name Common C++.  If you copy code from other releases into a copy of&lt;br /&gt;// Common C++, as the General Public License permits, the exception does&lt;br /&gt;// not apply to the code that you add in this way.  To avoid misleading&lt;br /&gt;// anyone as to the status of such modified files, you must delete&lt;br /&gt;// this exception notice from them.&lt;br /&gt;// &lt;br /&gt;// If you write modifications of your own for Common C++, it is your choice&lt;br /&gt;// whether to permit this exception to apply to your modifications.&lt;br /&gt;// If you do not wish that, delete this exception notice.&lt;br /&gt;&lt;br /&gt;#include &amp;lt;cc++/common.h&amp;gt;&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;cstdlib&amp;gt;&lt;br /&gt;&lt;br /&gt;using namespace std;&lt;br /&gt;using namespace ost;&lt;br /&gt;&lt;br /&gt;class myURLStream : public URLStream&lt;br /&gt;{&lt;br /&gt;    private:&lt;br /&gt;        void httpHeader(const char *header, const char *value) &lt;br /&gt;        {       &lt;br /&gt;            cout &amp;lt;&amp;lt; &amp;quot;HEADER &amp;quot; &amp;lt;&amp;lt; header &amp;lt;&amp;lt; &amp;quot;=&amp;quot; &amp;lt;&amp;lt; value &amp;lt;&amp;lt; endl;&lt;br /&gt;        }       &lt;br /&gt;};&lt;br /&gt;int main(int argc, char **argv)&lt;br /&gt;{&lt;br /&gt;    myURLStream url;&lt;br /&gt;    char cbuf[1024];&lt;br /&gt;    URLStream::Error status;&lt;br /&gt;    int len;&lt;br /&gt;&lt;br /&gt;    const char* addr = &amp;quot;http://www.webservicex.net/globalweather.asmx/GetWeather?CityName=beijing&amp;CountryName=china&amp;quot;;&lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;        status = url.get(addr);&lt;br /&gt;        if(status)&lt;br /&gt;        {&lt;br /&gt;            cout &amp;lt;&amp;lt; &amp;quot;failed; reason=&amp;quot; &amp;lt;&amp;lt; status &amp;lt;&amp;lt; endl;&lt;br /&gt;            url.close();&lt;br /&gt;        }&lt;br /&gt;        else{&lt;br /&gt;            cout &amp;lt;&amp;lt; &amp;quot;loading...&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;            while(!url.eof())&lt;br /&gt;            {&lt;br /&gt;                url.read(cbuf, sizeof(cbuf));&lt;br /&gt;                len = url.gcount();&lt;br /&gt;                if(len &amp;gt; 0)&lt;br /&gt;                    cout.write(cbuf, len);&lt;br /&gt;            }&lt;br /&gt;            url.close();&lt;br /&gt;            cout &amp;lt;&amp;lt; ends;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    catch(...)&lt;br /&gt;    {&lt;br /&gt;        cerr &amp;lt;&amp;lt; &amp;quot;url &amp;quot; &amp;lt;&amp;lt; addr &amp;lt;&amp;lt; &amp;quot; failed&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;    }&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16045706-116521119789568294?l=guocongbin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://guocongbin.blogspot.com/feeds/116521119789568294/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16045706&amp;postID=116521119789568294&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116521119789568294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116521119789568294'/><link rel='alternate' type='text/html' href='http://guocongbin.blogspot.com/2006/12/commonc-gethttp.html' title='CommonC++ 应用之二：使用Get访问HTTP服务器'/><author><name>大魔头</name><uri>http://www.blogger.com/profile/17396118389281260592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='11' src='http://photos1.blogger.com/blogger/5046/1508/1600/guocongbin1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16045706.post-116497145574753360</id><published>2006-12-01T19:10:00.000+08:00</published><updated>2006-12-06T15:24:11.206+08:00</updated><title type='text'>CommonC++应用之一：使用POST访问HTTP服务器</title><content type='html'>因为要进行网络应用方面的编程，所以在网上找到了这个CommonC++的库。这是GNU的一个项目，我下载的版本是1&lt;span style="color:#ff40ff;"&gt;&lt;b&gt;.5.3&lt;/b&gt;&lt;/span&gt;。&lt;br /&gt;它里面提供的功能倒是很全面，体积也比较小巧，所以还是值得利用。不过里面的bug也不少，有些还是比较低级的bug。&lt;br /&gt;&lt;br /&gt;我写了一个使用POST方法访问HTTP服务器的case，用来得到天气预报信息（服务就是前面的文章中提到的得到天气预报的web service服务）。&lt;br /&gt;case的代码使用CommonC++自带的urlfetch.cpp该过来的&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#00ffff;"&gt;&lt;b&gt;// myurlfeth.cpp&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#8080ff;"&gt;&lt;b&gt;#include &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#ff40ff;"&gt;&lt;b&gt;&amp;lt;cc++/common.h&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#8080ff;"&gt;&lt;b&gt;#include &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#ff40ff;"&gt;&lt;b&gt;&amp;lt;iostream&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#8080ff;"&gt;&lt;b&gt;#include &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#ff40ff;"&gt;&lt;b&gt;&amp;lt;cstdlib&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#8080ff;"&gt;&lt;b&gt;#ifdef CCXX_NAMESPACES&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;b&gt;using&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#00ff00;"&gt;&lt;b&gt;namespace&lt;/b&gt;&lt;/span&gt; std;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;b&gt;using&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#00ff00;"&gt;&lt;b&gt;namespace&lt;/b&gt;&lt;/span&gt; ost;&lt;br /&gt;&lt;span style="color:#8080ff;"&gt;&lt;b&gt;#endif&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#00ff00;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt; myURLStream : &lt;span style="color:#0000ff;"&gt;&lt;b&gt;public&lt;/b&gt;&lt;/span&gt; URLStream&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;b&gt;private&lt;/b&gt;&lt;/span&gt;:&lt;br /&gt;void httpHeader(&lt;span style="color:#00ff00;"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#00ff00;"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt; *header, &lt;span style="color:#00ff00;"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#00ff00;"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt; *value)&lt;br /&gt;{&lt;br /&gt;cout &amp;lt;&amp;lt; &lt;span style="color:#ff40ff;"&gt;&lt;b&gt;"HEADER "&lt;/b&gt;&lt;/span&gt; &amp;lt;&amp;lt; header &amp;lt;&amp;lt; &lt;span style="color:#ff40ff;"&gt;&lt;b&gt;"="&lt;/b&gt;&lt;/span&gt; &amp;lt;&amp;lt; value &amp;lt;&amp;lt; endl;&lt;br /&gt;}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#00ff00;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; main(&lt;span style="color:#00ff00;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; argc, &lt;span style="color:#00ff00;"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt; **argv)&lt;br /&gt;{&lt;br /&gt;myURLStream url;&lt;br /&gt;url.setProtocol(URLStream::protocolHttp1_1);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#00ff00;"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt; cbuf[&lt;span style="color:#ff40ff;"&gt;&lt;b&gt;1024&lt;/b&gt;&lt;/span&gt;];&lt;br /&gt;&lt;span style="color:#00ff00;"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/span&gt; len;&lt;br /&gt;&lt;span style="color:#8080ff;"&gt;&lt;b&gt;#ifdef CCXX_EXCEPTIONS&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;b&gt;try&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#8080ff;"&gt;&lt;b&gt;#endif&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#00ff00;"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;* surl = &lt;span style="color:#ff40ff;"&gt;&lt;b&gt;"&lt;a href="http://www.xview.com.cn/WebService/Weather.asmx/GetWeatherDataSet"&gt;http://www.xview.com.cn/WebService/Weather.asmx/GetWeatherDataSet&lt;/a&gt;"&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#00ff00;"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;* city=&lt;span style="color:#ff40ff;"&gt;&lt;b&gt;"北京"&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#00ff00;"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt; *var = &lt;span style="color:#ff40ff;"&gt;&lt;b&gt;"cityName"&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#00ff00;"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt; buf[&lt;span style="color:#ff40ff;"&gt;&lt;b&gt;30&lt;/b&gt;&lt;/span&gt;];&lt;br /&gt;urlEncode(city, buf, &lt;span style="color:#ff40ff;"&gt;&lt;b&gt;30&lt;/b&gt;&lt;/span&gt;);&lt;br /&gt;&lt;span style="color:#00ff00;"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#00ff00;"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;* para[&lt;span style="color:#ff40ff;"&gt;&lt;b&gt;3&lt;/b&gt;&lt;/span&gt;];&lt;br /&gt;para[&lt;span style="color:#ff40ff;"&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt;] = (&lt;span style="color:#00ff00;"&gt;&lt;b&gt;const&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#00ff00;"&gt;&lt;b&gt;char&lt;/b&gt;&lt;/span&gt;*)var;&lt;br /&gt;para[&lt;span style="color:#ff40ff;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;] = buf;&lt;br /&gt;para[&lt;span style="color:#ff40ff;"&gt;&lt;b&gt;2&lt;/b&gt;&lt;/span&gt;] = &lt;span style="color:#ff40ff;"&gt;&lt;b&gt;NULL&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;url.post(surl,para, &lt;span style="color:#ff40ff;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;);&lt;br /&gt;cout &amp;lt;&amp;lt; &lt;span style="color:#ff40ff;"&gt;&lt;b&gt;"loading..."&lt;/b&gt;&lt;/span&gt; &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;b&gt;while&lt;/b&gt;&lt;/span&gt;(!url.eof())&lt;br /&gt;{&lt;br /&gt;url.read(cbuf, &lt;span style="color:#0000ff;"&gt;&lt;b&gt;sizeof&lt;/b&gt;&lt;/span&gt;(cbuf));&lt;br /&gt;len = url.gcount();&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;(len &amp;gt; &lt;span style="color:#ff40ff;"&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;cout.write(cbuf, len);&lt;br /&gt;}&lt;br /&gt;url.close();&lt;br /&gt;cout &amp;lt;&amp;lt; ends;&lt;br /&gt;&lt;span style="color:#8080ff;"&gt;&lt;b&gt;#ifdef CCXX_EXCEPTIONS&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;b&gt;catch&lt;/b&gt;&lt;/span&gt;(...)&lt;br /&gt;{&lt;br /&gt;cerr &amp;lt;&amp;lt; &lt;span style="color:#ff40ff;"&gt;&lt;b&gt;"url fetch failed"&lt;/b&gt;&lt;/span&gt; &amp;lt;&amp;lt; endl;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color:#8080ff;"&gt;&lt;b&gt;#endif&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#ff40ff;"&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;不过要让这段代码工作，需要修改src/url.cpp，修正其中的两个bug&lt;br /&gt;将src/url.cpp的第666行的switch...&lt;span style="color:#0000ff;"&gt;&lt;b&gt;case&lt;/b&gt;&lt;/span&gt;结构修改如下&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#00ffff;"&gt;&lt;b&gt;// src/url.cpp, line 666&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;b&gt;switch&lt;/b&gt;&lt;/span&gt;(urlmethod)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;b&gt;case&lt;/b&gt;&lt;/span&gt; methodHttpPost:&lt;br /&gt;&lt;span style="color:#00ffff;"&gt;&lt;b&gt;// get the content-length of request.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#00ffff;"&gt;&lt;b&gt;// use '&amp;' or '=' to connect different parameter,&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#00ffff;"&gt;&lt;b&gt;// therefore the total length is the length of all vars plus count -1&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;b&gt;while&lt;/b&gt;&lt;/span&gt;(*args)&lt;br /&gt;{&lt;br /&gt;var = *args;&lt;br /&gt;&lt;span style="color:#00ff00;"&gt;&lt;b&gt;bool&lt;/b&gt;&lt;/span&gt; alone = strchr(var, &lt;span style="color:#ff40ff;"&gt;&lt;b&gt;'='&lt;/b&gt;&lt;/span&gt;);&lt;br /&gt;len += strlen(var);&lt;br /&gt;count++;&lt;br /&gt;++args;&lt;br /&gt;}&lt;br /&gt;len += count -&lt;span style="color:#ff40ff;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;count = &lt;span style="color:#ff40ff;"&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#00ffff;"&gt;&lt;b&gt;//len += 2; //guocb&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;str &amp;lt;&amp;lt; &lt;span style="color:#ff40ff;"&gt;&lt;b&gt;"Content-Type: application/x-www-form-urlencoded"&lt;/b&gt;&lt;/span&gt; &amp;lt;&amp;lt; &lt;span style="color:#ff40ff;"&gt;&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#ff6060;"&gt;&lt;b&gt;\r\n&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#ff40ff;"&gt;&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;str &amp;lt;&amp;lt; &lt;span style="color:#ff40ff;"&gt;&lt;b&gt;"Content-Length: "&lt;/b&gt;&lt;/span&gt; &amp;lt;&amp;lt; (&lt;span style="color:#00ff00;"&gt;&lt;b&gt;unsigned&lt;/b&gt;&lt;/span&gt;)len &amp;lt;&amp;lt; &lt;span style="color:#ff40ff;"&gt;&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#ff6060;"&gt;&lt;b&gt;\r\n&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#ff40ff;"&gt;&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;b&gt;break&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;b&gt;case&lt;/b&gt;&lt;/span&gt; methodHttpPostMultipart:&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;b&gt;while&lt;/b&gt;&lt;/span&gt;(*args)&lt;br /&gt;str &amp;lt;&amp;lt; *(args++) &amp;lt;&amp;lt; &lt;span style="color:#ff40ff;"&gt;&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#ff6060;"&gt;&lt;b&gt;\r\n&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#ff40ff;"&gt;&lt;b&gt;"&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;b&gt;default&lt;/b&gt;&lt;/span&gt;:&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;&lt;b&gt;break&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16045706-116497145574753360?l=guocongbin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://guocongbin.blogspot.com/feeds/116497145574753360/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16045706&amp;postID=116497145574753360&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116497145574753360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116497145574753360'/><link rel='alternate' type='text/html' href='http://guocongbin.blogspot.com/2006/12/commoncposthttp.html' title='CommonC++应用之一：使用POST访问HTTP服务器'/><author><name>大魔头</name><uri>http://www.blogger.com/profile/17396118389281260592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='11' src='http://photos1.blogger.com/blogger/5046/1508/1600/guocongbin1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16045706.post-116476412190984992</id><published>2006-11-29T09:29:00.000+08:00</published><updated>2006-12-06T15:24:27.550+08:00</updated><title type='text'>Get Weather by webservice, implemented in python</title><content type='html'>##########################################################&lt;br /&gt;#use the webservice provided by &lt;a href="http://www.xview.com.cn"&gt;www.xview.com.cn&lt;/a&gt;&lt;br /&gt;#get the weather forcast&lt;br /&gt;import httplib, urllib&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;url='www.xview.com.cn'&lt;br /&gt;para=url.urlencode({'cityName':'北京'})&lt;br /&gt;headers={'Content-Type': 'application/x-www-form-urlencoded'}&lt;br /&gt;conn=httplib.HTTPConnection(url)&lt;br /&gt;conn.request('POST','/WebService/Weather.asmx/GetWeatherDataSet', para, headers)&lt;br /&gt;resp=conn.getresponse()&lt;br /&gt;res_xml=''&lt;br /&gt;if resp.status != 200:&lt;br /&gt; print 'ERROR'&lt;br /&gt;else:&lt;br /&gt; res_xml=resp.read()&lt;br /&gt;conn.close()&lt;br /&gt;print res_xml&lt;br /&gt;#######################################################&lt;br /&gt;#use the webservice proivded by &lt;a href="http://www.webserivcex.net"&gt;www.webserivcex.net&lt;/a&gt;&lt;br /&gt;#get the weahter of now (not weather forcast)&lt;br /&gt;import httplib&lt;br /&gt;url='www.webservicex.net'&lt;br /&gt;conn=httplib.HTTPConnection(url)&lt;br /&gt;conn.request('GET', '/globalweather.asmx/GetWeather?CityName=Beijing&amp;CountryName=china')&lt;br /&gt;resp=conn.getresponse()&lt;br /&gt;if resp.status = 200:&lt;br /&gt; print resp.read()&lt;br /&gt;else:&lt;br /&gt; print ‘ERROR’&lt;br /&gt;conn.close()&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16045706-116476412190984992?l=guocongbin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://guocongbin.blogspot.com/feeds/116476412190984992/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16045706&amp;postID=116476412190984992&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116476412190984992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116476412190984992'/><link rel='alternate' type='text/html' href='http://guocongbin.blogspot.com/2006/11/get-weather-by-webservice-implemented.html' title='Get Weather by webservice, implemented in python'/><author><name>大魔头</name><uri>http://www.blogger.com/profile/17396118389281260592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='11' src='http://photos1.blogger.com/blogger/5046/1508/1600/guocongbin1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16045706.post-116446658498677873</id><published>2006-11-25T22:40:00.000+08:00</published><updated>2006-12-06T15:29:10.726+08:00</updated><title type='text'>C++单元测试框架：CxxTest</title><content type='html'>&lt;p&gt;单元测试流行了有一段时间了。虽然真正做单元测试的人未必有多少，但是至少单元测试的概念得到了普及。单元测试技术中离不开单元测试框架。一说单元测试框架，很多人都能想起Junit和CppUnit等xUnit框架。毕竟xUnit框架家族历史悠久。但是不得不指出，xUnit并不是完美的，尤其是在C++中，CppUnit还远远没有得到所有人的认可。在C++中，目前还有很多的单元测试框架，例如&lt;a href="http://www.boost.org/" target="_blank" mce_href="http://www.boost.org"&gt;Boost.Test&lt;/a&gt;、&lt;a href="http://cxxtest.sourceforge.net/" target="_blank" mce_href="http://cxxtest.sourceforge.net/"&gt;CxxTest&lt;/a&gt;、CppUnitLite、NanoUnit、Unit++等等。今天我就介绍一下其中非常优秀的代表CxxTest。&lt;/p&gt;&lt;p&gt;    CxxTest的中文资料不多，我把它的用户手册大概翻译一下贴出来。最新的用户手册可以从&lt;a href="http://cxxtest.sourceforge.net/guide.html" mce_href="http://cxxtest.sourceforge.net/guide.html"&gt;http://cxxtest.sourceforge.net/guide.html&lt;/a&gt;下载。&lt;br /&gt;     这里只是其中支持MockObject一章，其余的以后再贴吧&lt;span class="fulllist"&gt;&lt;br /&gt;&lt;br /&gt;1    伪对象（Mock Object）（版本3.10.0）Mock对象是一种有效的测试方法。它的主要思想是向被测试的代码传递一个特殊的对象。例如测试一个实现了某种基于TCP的协议类，可能需要一个抽象的ISocket接口的参数。在测试用例中，就可以传递一个MockSocket对象。这个对象可以做一些有利于测试的任务，例如记录一个“发送”的所有数据的日志，以便事后确认。虽然听起来不错，但是C/C++代码开发人员的问题是需要经常调用那些无法重载的全局函数。想一下那些使用fopen()、fwrite()和fclose()的代码。在测试这些代码的时候真正的创建文件并不是一个优雅的解决方法。而且更进一步，无法测试异常情况，比如fopen()失败的情况。虽然在某种情况下，我们可以在测试代码中引发这种异常情况发生，但是很快就会导致测试代码混乱与无法维护。CxxTest通过允许在测试代码中重载任何全局函数来解决该问题。下面是一个对其工作原理的介绍，然后是实例演示。&lt;br /&gt;·         对于每个要重载的函数，首先使用宏CXXTEST_MOCK_GLOBAL处理一下（具体过程将在下面的实例中详细介绍）。&lt;br /&gt;·         在测试代码中，不能直接调用全局函数，而是调用名字空间T（代表Test）中的相应函数。例如使用T::fopen()代替fopen()。这在思想上与使用抽象接口代替具体类相同。&lt;br /&gt;·         与被测代码进行链接的是一个直接调用原始的fopen函数的源文件。&lt;br /&gt;·         与测试代码进行链接的是一个通过调用mock object来实现T::fopen()的源文件。&lt;br /&gt;·         在测试中需要创建一个从T::Base_fopen派生而来的类，并实现其fopen()函数。只需要在测试代码中创建一个该类的实例，测试代码中对T::fopen的调用就会自动重定向。这些步骤似乎有些过于繁琐，所以通过一个实例进行解释效果更好。下面我们就重载标准函数time()。&lt;br /&gt;·         首先编写供测试代码和实际代码使用的测试头文件。&lt;br /&gt;          // T/time.h          #include &lt;time.h&gt;          #include &lt;cxxtest/mock.h&gt;          CXXTEST_MOCK_GLOBAL( time_t,        /* Return type          */                               time,          /* Name of the function */                               ( time_t *t ), /* Prototype            */                               ( t )          /* Argument list        */ );&lt;br /&gt;·         在测试用例代码中，要使用上面的头文件代替原来的系统头文件，而且要使用T::time()代替原有的time()。&lt;br /&gt;          // code.cpp&lt;br /&gt;          #include &lt;t/time.h&gt;&lt;br /&gt;         &lt;br /&gt;          int generateRandomNumber()&lt;br /&gt;          {&lt;br /&gt;              return T::time( NULL ) * 3;&lt;br /&gt;          }&lt;br /&gt;·         我们需要创建一个实现T::time()的源文件。该实现就是直接调用真正的time函数。不过要在该文件中包含头文件之前要定义宏CXXTEST_MOCK_REAL_SOURCE_FILE。&lt;br /&gt;          // real_time.cpp          #define CXXTEST_MOCK_REAL_SOURCE_FILE          #include &lt;t/time.h&gt;&lt;br /&gt;·         在开始测试之前，我们需要一个为测试专门实现的T::time()。实现过程和上面的一样简单：&lt;br /&gt;          // mock_time.cpp          #define CXXTEST_MOCK_TEST_SOURCE_FILE          #include &lt;t/time.h&gt;&lt;br /&gt;·         最有意思的地方开始了。在测试代码中只需要创建一个mock，测试代码就是自动的去调用之。&lt;br /&gt;          // TestRandom.h          #include &lt;cxxtest/testsuite.h&gt;          #include &lt;t/time.h&gt;                    class TheTimeIsOne : public T::Base_time          {          public:              time_t time( time_t * ) { return 1; }          };                    class TestRandom : public CxxTest::TestSuite          {          public:              void test_Random()              {                  TheTimeIsOne t;                  TS_ASSERT_EQUALS( generateRandomNumber(), 3 );              }          };&lt;br /&gt;4.5.1 实际使用似乎这些工作看起来比较繁琐，但是一旦开始使用这种方法，你就不会再这么认为。最艰巨的部分是将此方法与你系统中的构建环境协同工作。因此我写了一个与此类似的简单实例。该实例使用了GNU Make和G++，在sample/mock下。&lt;br /&gt;4.5.2 关于Mock函数的进一步讨论&lt;br /&gt;4.5.2.1 Void函数void函数略有不同，需要使用CXXTEST_MOCK_VOID_GLOBAL宏重载。该宏除了没有指定返回值，其他与CXXTEST_MOCK_GLOBAL完全相同。参见sample/mock/T/stdlib.h。&lt;br /&gt;4.5.2.2 在测试代码中调用真正的函数在测试代码中偶尔也需要调用真正的函数。方法是创建一个特殊的mock对象，名字类似于T::Real_time。在测试代码中构造一个该类的对象会将T::time()重定向到真正的time函数。&lt;br /&gt;4.5.2.3当无法修改真正函数实现时有时在测试代码中需要调用一些无法修改实现的函数。例如在用户态下运行的测试代码中要调用一个操作系统的内核函数。使用CxxTest的mock框架可以为被测代码创建一个可以测试的实现，同时无需修改被测代码中对真实函数的调用。实现方法就是使用宏CXXTEST_SUPPLY_VOID_GLOBAL（以及CXXTEST_SUPPLY_VOID_GLOBAL）。例如下面代码为Win32内核函数IoCallDirver创建了mock：&lt;br /&gt;     CXXTEST_SUPPLY_GLOBAL( NTSTATUS,                /* Return type */                            IoCallDriver,            /* Name        */                            ( PDEVICE_OBJECT Device, /* Prototype   */                              PIRP Irp ),                            ( Device, Irp )          /* How to call */ );现在你的测试代码就可以正常的调用IoCallDriver()（不需要名字空间前缀T::），而且测试代码可以将T::Base_IoCallDriver作为普通的mock对象来使用。【注】由于这些宏同时声明了函数原型（因此上面的例子中就无需再包含真正的&lt;ntddk.h&gt;），它们都有一个使用extern "C"版本：CXXTEST_SUPPLY_GLOBAL_C和CXXTEST_SUPPLY_GLOBAL_VOID_C。&lt;br /&gt;4.5.2.4 名字空间中的函数有时候，需要被重载的函数不想time函数那样是属于全局空间，它们可能是其他名字空间的全局函数甚至是某个类中的静态函数。默认的mock实现无法处理这种情况，需要使用更加一般化的CXXTEST_MOCK。下面用例子来解释一下这个宏。假设名字空间Files中，需要重载其中的函数&lt;br /&gt;bool Files::FileExists(const String &amp;name)因此mock类的名字是T::Base_Files_FileExists，需要实现的函数是fileExists。定义的方式如下（使用真实函数的名字作为mock类和类中要实现的函数的名字）：&lt;br /&gt;     CXXTEST_MOCK( Files_FileExists,       /* Suffix of mock class  */                   bool,                   /* Return type           */                   fileExists,             /* Name of mock member   */                   ( const String &amp;name ), /* Prototype             */                   Files::FileExists,      /* Name of real function */                   ( name )                /* Parameter list        */ );无需多言，相应的处理void函数的宏是CXXTEST_MOCK_VOID。对于CXXTEST_SUPPLY_GLOBAL也有一个对应的宏。使用下面的Win32 DDK的例子可予以解释。&lt;br /&gt;     CXXTEST_SUPPLY( AllocateIrp,         /* =&gt; T::Base_AllocateIrp */                     PIRP,                /* Return type            */                     allocateIrp,         /* Name of mock member    */                     ( CCHAR StackSize ), /* Prototype              */                     IoAllocateIrp,       /* Name of real function  */                     ( StackSize )        /* Parameter list         */ );同时由此宏可以派生出来CXXTEST_SUPPLY_VOID、CXXTEST_SUPPLY_C与CXXTEST_SUPPLY_VOID_C。&lt;br /&gt;4.5.2.5 重载函数如果有多个具有相同名字的全局函数，自然不能创建多个同名的mock类。解决方法是使用上面提及的更具有一般性的宏CXXTEST_MOCK、CXXTEST_MOCK_VOID，只是要给两个mock类起不同的名字。&lt;br /&gt;4.5.2.6 改变mock的名字空间最后，如果你不喜欢或者不能使用名字T作为mock函数的前缀，你可以通过定义CXXTEST_MOCK_NAMESPACE来改变它。&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16045706-116446658498677873?l=guocongbin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://guocongbin.blogspot.com/feeds/116446658498677873/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16045706&amp;postID=116446658498677873&amp;isPopup=true' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116446658498677873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116446658498677873'/><link rel='alternate' type='text/html' href='http://guocongbin.blogspot.com/2006/11/ccxxtest.html' title='C++单元测试框架：CxxTest'/><author><name>大魔头</name><uri>http://www.blogger.com/profile/17396118389281260592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='11' src='http://photos1.blogger.com/blogger/5046/1508/1600/guocongbin1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16045706.post-116446545911266022</id><published>2006-11-25T22:37:00.000+08:00</published><updated>2006-12-06T15:27:24.950+08:00</updated><title type='text'>在Word里面使程序代码语法高亮的宏</title><content type='html'>&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN"&gt; 关键字&lt;/span&gt;&lt;span style="mso-bidi-font-size: 10.5pt"&gt;&lt;font face="Times New Roman"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN"&gt; 语法高亮&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.5pt"&gt;&lt;font face="Times New Roman"&gt; word &lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN"&gt; 宏&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.5pt"&gt;&lt;font face="Times New Roman"&gt; VBA&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.5pt"&gt;&lt;font face="Times New Roman"&gt;keyword&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN"&gt; ：&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.5pt"&gt;&lt;font face="Times New Roman"&gt;syntax highlight, word, macro, VBA&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN"&gt; 最近我经常在&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.5pt"&gt;&lt;font face="Times New Roman"&gt;word&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN"&gt; 里面写东西，发现程序代码拷贝到&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.5pt"&gt;&lt;font face="Times New Roman"&gt;word&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN"&gt; 里面就没有了在代码编辑器里面的那种语法高亮的效果，感觉不爽。于是我上网搜了搜，发现目前在&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.5pt"&gt;&lt;font face="Times New Roman"&gt;word&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN"&gt; 中实现语法高亮的方法主要是通过安装一个插件。由于我先天的对插件比较反感，所以自己动手，使用&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.5pt"&gt;&lt;font face="Times New Roman"&gt;word&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN"&gt; 等&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.5pt"&gt;&lt;font face="Times New Roman"&gt;office&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN"&gt; 软件都支持的&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.5pt"&gt;&lt;font face="Times New Roman"&gt;VBA (Visual BAsic &lt;span style="COLOR: black"&gt;For &lt;/span&gt;Application)&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN"&gt; 写了一个语法高亮的宏。&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.5pt"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN"&gt; 这个宏的功能比较简单，就是利用得到文档中选中部分的代码，然后分词，判断该词的类别，然后着色。我现在使用的分词方法是&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.5pt"&gt;&lt;font face="Times New Roman"&gt;VBA&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN"&gt; 提供的，大部分情况下和我们预期的比较一致。但是在某些情况下，比如连续的分隔符，这种分词方法会和&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.5pt"&gt;&lt;font face="Times New Roman"&gt;C&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN"&gt; 语言分析器的分词结果不同的。&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.5pt"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN"&gt; 这个宏除了可以语法着色，还可以为代码标注行号。（听说侯捷在《&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.5pt"&gt;&lt;font face="Times New Roman"&gt;word&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN"&gt; 排版艺术》一书中也有一个为代码添加行号的宏。不知道他的宏和我的宏是否雷同。如有雷同，纯属巧合：）&lt;/span&gt;&lt;span lang="EN-US" style="mso-bidi-font-size: 10.5pt"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span class="fulllist"&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="COLOR: green; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;' script to high light code In document&lt;/span&gt; &lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;b&gt;&lt;span lang="EN-US" style="COLOR: blue; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;Private&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;  &lt;b&gt;&lt;span style="COLOR: blue"&gt;Function&lt;/span&gt;&lt;/b&gt; isKeyword(w) &lt;b&gt;&lt;span style="COLOR: blue"&gt;As&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;Boolean&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; Dim&lt;/span&gt;&lt;/b&gt; keys &lt;b&gt;&lt;span style="COLOR: blue"&gt;As&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;New&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;Collection&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; With&lt;/span&gt;&lt;/b&gt; keys&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.Add &amp;quot;&lt;span style="COLOR: black"&gt; if&amp;quot;: &lt;/span&gt;.Add &amp;quot;else&amp;quot;: .Add &amp;quot;switch&amp;quot;: .Add &amp;quot;cAse&amp;quot;: .Add &amp;quot;default&amp;quot;: .Add &amp;quot;break&amp;quot;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.Add &amp;quot;goto&amp;quot;: .Add &amp;quot;return&amp;quot;: .Add &amp;quot;for&amp;quot;: .Add &amp;quot;while&amp;quot;: .Add &amp;quot;do&amp;quot;: .Add &amp;quot;contInue&amp;quot; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.Add &amp;quot;typedef&amp;quot;: .Add &amp;quot;sizeof&amp;quot;: .Add &amp;quot;NULL&amp;quot;: .Add &amp;quot;new&amp;quot;: .Add &amp;quot;delete&amp;quot;: .Add &amp;quot;throw&amp;quot; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.Add &amp;quot;try&amp;quot;: .Add &amp;quot;catch&amp;quot;: .Add &amp;quot;namespace&amp;quot;: .Add &amp;quot;operator&amp;quot;: .Add &amp;quot;this&amp;quot;: .Add &amp;quot;const_cAst&amp;quot; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.Add &amp;quot;static_cast&amp;quot;: .Add &amp;quot;dynamic_cast&amp;quot;: .Add &amp;quot;reInterpret_cAst&amp;quot;: .Add &amp;quot;true&amp;quot; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.Add &amp;quot;false&amp;quot;: .Add &amp;quot;null&amp;quot;: .Add &amp;quot;usIng&amp;quot;: .Add &amp;quot;typeid&amp;quot;: .Add &amp;quot;and&amp;quot;: .Add &amp;quot;and_eq&amp;quot; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.Add &amp;quot;bitand&amp;quot;: .Add &amp;quot;bitor&amp;quot;: .Add &amp;quot;compl&amp;quot;: .Add &amp;quot;not&amp;quot;: .Add &amp;quot;not_eq&amp;quot;: .Add &amp;quot;or&amp;quot; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.Add &amp;quot;or_eq&amp;quot;: .Add &amp;quot;xor&amp;quot;: .Add &amp;quot;xor_eq&amp;quot; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; End&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;With&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;isKeyword = isSpecial(w, keys) &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;b&gt;&lt;span lang="EN-US" style="COLOR: blue; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;End&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;  &lt;b&gt;&lt;span style="COLOR: blue"&gt;Function&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;b&gt;&lt;span lang="EN-US" style="COLOR: blue; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;Private&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;  &lt;b&gt;&lt;span style="COLOR: blue"&gt;Function&lt;/span&gt;&lt;/b&gt; isSpecial(&lt;b&gt;&lt;span style="COLOR: blue"&gt;ByVal&lt;/span&gt;&lt;/b&gt; w &lt;b&gt;&lt;span style="COLOR: blue"&gt;As&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;String&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span style="COLOR: blue"&gt; ByRef&lt;/span&gt;&lt;/b&gt; col &lt;b&gt;&lt;span style="COLOR: blue"&gt;As&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;Collection&lt;/span&gt;&lt;/b&gt;) &lt;b&gt;&lt;span style="COLOR: blue"&gt;As&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;Boolean&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; For&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;Each&lt;/span&gt;&lt;/b&gt; i &lt;b&gt;&lt;span style="COLOR: blue"&gt;In&lt;/span&gt;&lt;/b&gt; col&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; If&lt;/span&gt;&lt;/b&gt; w = i &lt;b&gt;&lt;span style="COLOR: blue"&gt;Then&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;isSpecial =  &lt;b&gt;&lt;span style="COLOR: blue"&gt;True&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; Exit&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;Function&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; End&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;If&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; Next&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;isspeical = False &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;b&gt;&lt;span lang="EN-US" style="COLOR: blue; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;End&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;  &lt;b&gt;&lt;span style="COLOR: blue"&gt;Function&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;b&gt;&lt;span lang="EN-US" style="COLOR: blue; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;Private&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;  &lt;b&gt;&lt;span style="COLOR: blue"&gt;Function&lt;/span&gt;&lt;/b&gt; isOperator(w) &lt;b&gt;&lt;span style="COLOR: blue"&gt;As&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;Boolean&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; Dim&lt;/span&gt;&lt;/b&gt; ops &lt;b&gt;&lt;span style="COLOR: blue"&gt;As&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;New&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;Collection&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; With&lt;/span&gt;&lt;/b&gt; ops&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.Add &amp;quot;+&amp;quot;: .Add &amp;quot;-&amp;quot;: .Add &amp;quot;*&amp;quot;: .Add &amp;quot;/&amp;quot;: .Add &amp;quot;&amp;amp;&amp;quot;: .Add &amp;quot;^&amp;quot;: .Add &amp;quot;;&amp;quot; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.Add &amp;quot;%&amp;quot;: .Add &amp;quot;#&amp;quot;: .Add &amp;quot;!&amp;quot;: .Add &amp;quot;:&amp;quot;: .Add &amp;quot;,&amp;quot;: .Add &amp;quot;.&amp;quot; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.Add &amp;quot;||&amp;quot;: .Add &amp;quot;&amp;amp;&amp;amp;&amp;quot;: .Add &amp;quot;|&amp;quot;: .Add &amp;quot;=&amp;quot;: .Add &amp;quot;++&amp;quot;: .Add &amp;quot;--&amp;quot; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.Add &amp;quot;\'&amp;quot;: .Add &amp;quot;\&amp;quot;&amp;quot;&amp;quot; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; End&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;With&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;isOperator = isSpecial(w, ops) &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;b&gt;&lt;span lang="EN-US" style="COLOR: blue; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;End&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;  &lt;b&gt;&lt;span style="COLOR: blue"&gt;Function&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;b&gt;&lt;span lang="EN-US" style="COLOR: blue; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;Private&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;  &lt;b&gt;&lt;span style="COLOR: blue"&gt;Function&lt;/span&gt;&lt;/b&gt; isType(&lt;b&gt;&lt;span style="COLOR: blue"&gt;ByVal&lt;/span&gt;&lt;/b&gt; w &lt;b&gt;&lt;span style="COLOR: blue"&gt;As&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;String&lt;/span&gt;&lt;/b&gt;) &lt;b&gt;&lt;span style="COLOR: blue"&gt; As&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;Boolean&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; Dim&lt;/span&gt;&lt;/b&gt; types &lt;b&gt;&lt;span style="COLOR: blue"&gt;As&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;New&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;Collection&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; With&lt;/span&gt;&lt;/b&gt; types&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.Add &amp;quot;void&amp;quot;: .Add &amp;quot;struct&amp;quot;: .Add &amp;quot;union&amp;quot;: .Add &amp;quot;enum&amp;quot;: .Add &amp;quot;char&amp;quot;: .Add &amp;quot;short&amp;quot;: .Add &amp;quot;Int&amp;quot; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.Add &amp;quot;long&amp;quot;: .Add &amp;quot;double&amp;quot;: .Add &amp;quot;float&amp;quot;: .Add &amp;quot;signed&amp;quot;: .Add &amp;quot;unsigned&amp;quot;: .Add &amp;quot;const&amp;quot;: .Add &amp;quot;static&amp;quot; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.Add &amp;quot;extern&amp;quot;: .Add &amp;quot;auto&amp;quot;: .Add &amp;quot;register&amp;quot;: .Add &amp;quot;volatile&amp;quot;: .Add &amp;quot;bool&amp;quot;: .Add &amp;quot;clAss&amp;quot;: .Add &amp;quot; &lt;span style="COLOR: black"&gt;private&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.Add &amp;quot;protected&amp;quot;: .Add &amp;quot;public&amp;quot;: .Add &amp;quot;fri &lt;span style="COLOR: black"&gt;end&lt;/span&gt;&amp;quot;: .Add &amp;quot;InlIne&amp;quot;: .Add &amp;quot;template&amp;quot;: .Add &amp;quot;virtual&amp;quot;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;.Add &amp;quot;Asm&amp;quot;: .Add &amp;quot;explicit&amp;quot;: .Add &amp;quot;typename&amp;quot; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;b&gt;&lt;span lang="EN-US" style="COLOR: blue; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;End&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;  &lt;b&gt;&lt;span style="COLOR: blue"&gt;With&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;isType = isSpecial(w, types) &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;b&gt;&lt;span lang="EN-US" style="COLOR: blue; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;End&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;  &lt;b&gt;&lt;span style="COLOR: blue"&gt;Function&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;b&gt;&lt;span lang="EN-US" style="COLOR: blue; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;Sub&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;  SyntaxHighlight()&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; Dim&lt;/span&gt;&lt;/b&gt; wordCount &lt;b&gt;&lt;span style="COLOR: blue"&gt;As&lt;/span&gt;&lt;/b&gt; In&lt;b&gt;&lt;span style="COLOR: blue"&gt;teger&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; Dim&lt;/span&gt;&lt;/b&gt; d &lt;b&gt;&lt;span style="COLOR: blue"&gt;As&lt;/span&gt;&lt;/b&gt; In&lt;b&gt;&lt;span style="COLOR: blue"&gt;teger&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="COLOR: green; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;' set the style of selection &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Selection.Style = &amp;quot;code&amp;quot; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;d = 0&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;wordCount = Selection.Words.Count &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Selection.StartOf  wdWord&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; While&lt;/span&gt;&lt;/b&gt; d &amp;lt; wordCount&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;d = d + Selection.MoveRight (wdWord, 1, wdExtend)&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;w = Selection.Text &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; If&lt;/span&gt;&lt;/b&gt; isKeyword(Trim(w)) = &lt;b&gt;&lt;span style="COLOR: blue"&gt;True&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;Then&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Selection.Font.Color  = wdColorBlue&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; ElseIf&lt;/span&gt;&lt;/b&gt; isType(Trim(w)) = &lt;b&gt;&lt;span style="COLOR: blue"&gt;True&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;Then&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Selection.Font.Color  = wdColorDarkRed&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Selection.Font.Bold  = &lt;b&gt;&lt;span style="COLOR: blue"&gt;True&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; ElseIf&lt;/span&gt;&lt;/b&gt; isOperator(Trim(w)) = &lt;b&gt;&lt;span style="COLOR: blue"&gt;True&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;Then&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Selection.Font.Color  = wdColorBrown&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; ElseIf&lt;/span&gt;&lt;/b&gt; Trim(w) = &amp;quot;//&amp;quot; &lt;b&gt;&lt;span style="COLOR: blue"&gt;Then&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;'lIne comment &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Selection.Move &lt;b&gt;&lt;span style="COLOR: blue"&gt;End&lt;/span&gt;&lt;/b&gt; wdLIne, 1&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;commentWords =  Selection.Words.Count&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;d = d + commentWords &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Selection.Font.Color  = wdColorGreen&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Selection.MoveStart  wdWord, commentWords&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt;ElseIf&lt;/span&gt;&lt;/b&gt; Trim(w) = &amp;quot;/*&amp;quot; &lt;b&gt;&lt;span style="COLOR: blue"&gt;Then&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="COLOR: green; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt; 'block comment&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; While&lt;/span&gt;&lt;/b&gt; Selection.Characters.LAst &amp;lt;&amp;gt; &amp;quot;/&amp;quot;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Selection.MoveLeft  wdCharacter, 1, wdExt&lt;b&gt;&lt;span style="COLOR: blue"&gt;End&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Selection.Move &lt;span style="COLOR: black"&gt;End&lt;/span&gt;Until (&amp;quot;*&amp;quot;)&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Selection.MoveRight  wdCharacter, 2, wdExt&lt;b&gt;&lt;span style="COLOR: blue"&gt;End&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; Wend&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;commentWords =  Selection.Words.Count&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;d = d + commentWords &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Selection.Font.Color  = wdColorGreen&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Selection.MoveStart  wdWord, commentWords&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; End&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;If&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="COLOR: green; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;'move the start of selection to next word&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Selection.MoveStart  wdWord&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; Wend&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="COLOR: green; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;' prepare  &lt;b&gt;For&lt;/b&gt; set lIne number&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Selection.MoveLeft  wdWord, wordCount, &lt;span style="COLOR: black"&gt;wdExtend&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;SetLIneNumber&lt;/span&gt; &lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;b&gt;&lt;span lang="EN-US" style="COLOR: blue; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;End&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;  &lt;b&gt;&lt;span style="COLOR: blue"&gt;Sub&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;b&gt;&lt;span lang="EN-US" style="COLOR: blue; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;Private&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;  &lt;b&gt;&lt;span style="COLOR: blue"&gt;Sub&lt;/span&gt;&lt;/b&gt; SetLIneNumber()&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; Dim&lt;/span&gt;&lt;/b&gt; lines &lt;b&gt;&lt;span style="COLOR: blue"&gt;As&lt;/span&gt;&lt;/b&gt; In&lt;b&gt;&lt;span style="COLOR: blue"&gt;teger&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;lines = Selection.Paragraphs.Count &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Selection.StartOf  wdParagraph&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; For&lt;/span&gt;&lt;/b&gt; l = 1 &lt;b&gt;&lt;span style="COLOR: blue"&gt;To&lt;/span&gt;&lt;/b&gt; lines&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;lIneNum = l &amp;amp; &amp;quot; &amp;quot; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; If&lt;/span&gt;&lt;/b&gt; l &amp;lt; 10 &lt;b&gt;&lt;span style="COLOR: blue"&gt;Then&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;lIneNum = lIneNum &amp;amp; &amp;quot; &amp;quot; &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; End&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="COLOR: blue"&gt;If&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Selection.Text  = lIneNum&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Selection.Font.Bold  = False&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Selection.Font.Color  = wdColorAutomatic&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;p = Selection.MoveDown (wdLIne, 1, wdMove)&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Selection.StartOf  wdLIne&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b&gt;&lt;span style="COLOR: blue"&gt; Next&lt;/span&gt;&lt;/b&gt; l&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;b&gt;&lt;span lang="EN-US" style="COLOR: blue; FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;End&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US" style="FONT-FAMILY: 'Courier New'; mso-bidi-font-size: 10.5pt"&gt;  &lt;b&gt;&lt;span style="COLOR: blue"&gt;Sub&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"&gt;&lt;span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 宋体"&gt; &amp;nbsp;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16045706-116446545911266022?l=guocongbin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://guocongbin.blogspot.com/feeds/116446545911266022/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16045706&amp;postID=116446545911266022&amp;isPopup=true' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116446545911266022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116446545911266022'/><link rel='alternate' type='text/html' href='http://guocongbin.blogspot.com/2006/11/word.html' title='在Word里面使程序代码语法高亮的宏'/><author><name>大魔头</name><uri>http://www.blogger.com/profile/17396118389281260592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='11' src='http://photos1.blogger.com/blogger/5046/1508/1600/guocongbin1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16045706.post-116446338664676130</id><published>2006-11-25T22:03:00.000+08:00</published><updated>2006-11-25T22:03:06.656+08:00</updated><title type='text'>一个模板的实际应用</title><content type='html'>&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;关键词：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;  C++ &lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;模板&lt;/span&gt;&lt;font face="Times New Roman"&gt; &lt;/font&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt; 克隆&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt; clone&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;多态和虚函数大大增强了&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt; C&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;＋＋语言的表达能力，但是有时候单纯依赖多态并不能很好的解决问题。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;例如有下面的一个问题。一个类继承体系，基类为&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt; Shape&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;，子类有&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;Rect&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt; ，&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;Circle&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;等。现在要为每个子类增加一个用来表示类&lt;/span&gt;&lt;span lang="EN-US"&gt; &lt;font face="Times New Roman"&gt;ID&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;的成员，即需要给每个子类增加一个静态成员（当然不能在基类里面添加静态成员了，因为那样所有的子类都会共享改成员。必须要在每个子类中添加一个静态成员）。 &lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;1&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt; class &lt;/span&gt;&lt;/b&gt;Rect&lt;span style="COLOR: #993300"&gt;: &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt;public &lt;/span&gt;&lt;/b&gt;Shape{&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;2&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt; static int &lt;/span&gt;&lt;/b&gt;clsid&lt;span style="COLOR: #993300"&gt;;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;3&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;};&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;4&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt; int &lt;/span&gt;&lt;/b&gt;Rect::clsid &lt;span style="COLOR: #993300"&gt;= &lt;/span&gt;0&lt;span style="COLOR: #993300"&gt;;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;5&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt; class &lt;/span&gt;&lt;/b&gt;Circle&lt;span style="COLOR: #993300"&gt;: &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt;public &lt;/span&gt;&lt;/b&gt;Shape{&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;6&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt; static int &lt;/span&gt;&lt;/b&gt;clsid&lt;span style="COLOR: #993300"&gt;;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;7&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;};&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;8&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt; int &lt;/span&gt;&lt;/b&gt;Circle::clsid &lt;span style="COLOR: #993300"&gt;= &lt;/span&gt;1&lt;span style="COLOR: #993300"&gt;;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;为了能够使用统一的接口来得到这个&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt; id&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;的值，需要在基类中增加一个接口：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;1&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt; class &lt;/span&gt;&lt;/b&gt;Shape{&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;2&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt; &lt;span style="COLOR: maroon"&gt;const int &lt;/span&gt;&lt;/b&gt;GetClassID() &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt;const&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="COLOR: #993300"&gt;= &lt;/span&gt; 0&lt;span style="COLOR: #993300"&gt;;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;3&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;}; &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;每个子类中也必须来实现这个接口：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;1&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt; const int &lt;/span&gt;&lt;/b&gt;Rect::GetClassID() &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt;const &lt;/span&gt;&lt;/b&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;2&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="COLOR: blue"&gt; return &lt;/span&gt;clsid&lt;span style="COLOR: #993300"&gt;;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;3&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;4&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt; const int &lt;/span&gt;&lt;/b&gt;Circle::GetClassID() &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt;const&lt;/span&gt;&lt;/b&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;5&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="COLOR: blue"&gt; return &lt;/span&gt;clsid&lt;span style="COLOR: #993300"&gt;;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;6&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;代码虽然都差不多，但是却无法进行抽象。如果子类众多，在每个子类中都要实现这样的一部分代码，实在不是一种好味道。&lt;/span&gt; &lt;font face="Times New Roman"&gt; &lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;与此问题类似的另外一个问题就是&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt; Clone&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;。基类中定义了一个&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;clone&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt; 的接口，每个子类都要实现。虽然子类的&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;clone&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;方法非常类似，都是&lt;/span&gt; &lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;一个新实例，但是因为要&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt; new&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;不同的实例，所以也无法抽象到基类中实现。&lt;/span&gt;&lt;font face="Times New Roman"&gt; &lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/font&gt; &lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;要解决这个&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt; id&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;的问题，我们可以进行这样的思考。&lt;/span&gt;&lt;font face="Times New Roman"&gt; &lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;重新定义一个基类，里面包含一个静态的成员变量，让每个&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt; Shape&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;的子类同时多继承这个类。但是问题依然，所有的子类都引用同一个静态成员。为此我们可以将这个类变为一个模板类，模板参数就是子类的类型。如下：&lt;/span&gt;&lt;span lang="EN-US"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;1&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt; template&lt;/span&gt;&lt;/b&gt;&amp;lt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt;typename &lt;/span&gt;&lt;/b&gt;T&amp;gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt;struct &lt;/span&gt;&lt;/b&gt;ClsID{&lt;/font&gt;&lt;/font&gt; &lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;2&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt; static int &lt;/span&gt;&lt;/b&gt;clsid&lt;span style="COLOR: #993300"&gt;;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;3&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;};&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;4&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt; class &lt;/span&gt;&lt;/b&gt;Rect&lt;span style="COLOR: #993300"&gt;: &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt;public &lt;/span&gt;&lt;/b&gt;Shape&lt;span style="COLOR: #993300"&gt;, &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt; &lt;span style="COLOR: maroon"&gt;public &lt;/span&gt;&lt;/b&gt;ClsID&amp;lt;Rect&amp;gt;{&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;5&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;...&lt;/font&gt;&lt;/font&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;6&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;};&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;7&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt; class &lt;/span&gt;&lt;/b&gt;Circle&lt;span style="COLOR: #993300"&gt;: &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt;public &lt;/span&gt;&lt;/b&gt;Shape&lt;span style="COLOR: #993300"&gt;, &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt; &lt;span style="COLOR: maroon"&gt;public &lt;/span&gt;&lt;/b&gt;ClsID&amp;lt;Circle&amp;gt;{&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;8&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;...&lt;/font&gt;&lt;/font&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;9&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;}; &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;那么如何访问这些成员呢？通过基类&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt; Shape&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;我们依然无法访问他们。我们可以依然在&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;Shape&lt;/font&gt;&lt;/span&gt; &lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;中定义一个&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;GetClassID&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt; 函数，然后依然在每个子类中实现。但是这样我们似乎回到老路上。但是无论如何，这个&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;GetClassID&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt; 的接口是必须能够通过&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;Shape&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;的指针来访问的。&lt;/span&gt;&lt;font face="Times New Roman"&gt;  &lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;我们将这个函数再次提取出来，放到一个单独的接口里面，然后让&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt; Shape&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;从这个接口继承。&lt;/span&gt;&lt;font face="Times New Roman"&gt; &lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;1&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt; struct &lt;/span&gt;&lt;/b&gt;ClsIDBase{&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;2&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt; &lt;span style="COLOR: maroon"&gt;virtual const int &lt;/span&gt;&lt;/b&gt;GetClassID() &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt;const &lt;/span&gt;&lt;/b&gt;&lt;span style="COLOR: #993300"&gt;= &lt;/span&gt;0&lt;span style="COLOR: #993300"&gt; ;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;3&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;};&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;4&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt; class &lt;/span&gt;&lt;/b&gt;Shape&lt;span style="COLOR: #993300"&gt;: &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt;public &lt;/span&gt;&lt;/b&gt;ClsIDBase{&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;5&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;...&lt;/font&gt;&lt;/font&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;6&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;}; &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;而在上面出现的&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt; ClsID&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;类里面，我们来实现这个接口：&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;1&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt; template&lt;/span&gt;&lt;/b&gt;&amp;lt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt;typename &lt;/span&gt;&lt;/b&gt;T&amp;gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt;struct &lt;/span&gt;&lt;/b&gt;ClsID&lt;span style="COLOR: #993300"&gt; : &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt;public virtual &lt;/span&gt;&lt;/b&gt;ClsIDBase{&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;2&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt; &lt;span style="COLOR: maroon"&gt;static int &lt;/span&gt;&lt;/b&gt;clsid&lt;span style="COLOR: #993300"&gt;;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;3&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt; &lt;span style="COLOR: maroon"&gt;const int &lt;/span&gt;&lt;/b&gt;GetClassID() &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt;const&lt;/span&gt;&lt;/b&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;4&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="COLOR: blue"&gt; return &lt;/span&gt;clsid&lt;span style="COLOR: #993300"&gt;;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;5&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;6&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;};&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;7&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt; template&lt;/span&gt;&lt;/b&gt;&amp;lt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt;typename &lt;/span&gt;&lt;/b&gt;T&amp;gt; &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt;int &lt;/span&gt;&lt;/b&gt;ClsID&amp;lt;T&amp;gt;::clsid &lt;span style="COLOR: #993300"&gt;;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;8&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt; class &lt;/span&gt;&lt;/b&gt;Rect&lt;span style="COLOR: #993300"&gt;: &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt;public &lt;/span&gt;&lt;/b&gt;Shape&lt;span style="COLOR: #993300"&gt;, &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt; &lt;span style="COLOR: maroon"&gt;public &lt;/span&gt;&lt;/b&gt;ClsID&amp;lt;Rect&amp;gt;{&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;9&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;...&lt;/font&gt;&lt;/font&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;10 };&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;11 &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt;class &lt;/span&gt;&lt;/b&gt;Circle&lt;span style="COLOR: #993300"&gt; : &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt;public &lt;/span&gt;&lt;/b&gt;Shape&lt;span style="COLOR: #993300"&gt;, &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="COLOR: maroon"&gt;public &lt;/span&gt;&lt;/b&gt; ClsID&amp;lt;Circle&amp;gt;{&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;12 &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;...&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="code" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font style="BACKGROUND-COLOR: #c0c0c0"&gt;&lt;font face="宋体"&gt;13 }; &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;这样一来，我们就无需在每个子类中手工机械的重复那些相似的代码了。&lt;/span&gt;&lt;font face="Times New Roman"&gt;  &lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;对于那个&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt; clone&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"&gt;的问题，可以完全使用这个思路来解决。&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-US"&gt;&lt;font face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16045706-116446338664676130?l=guocongbin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://guocongbin.blogspot.com/feeds/116446338664676130/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16045706&amp;postID=116446338664676130&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116446338664676130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116446338664676130'/><link rel='alternate' type='text/html' href='http://guocongbin.blogspot.com/2006/11/blog-post_25.html' title='一个模板的实际应用'/><author><name>大魔头</name><uri>http://www.blogger.com/profile/17396118389281260592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='11' src='http://photos1.blogger.com/blogger/5046/1508/1600/guocongbin1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16045706.post-116426071743988561</id><published>2006-11-23T13:45:00.000+08:00</published><updated>2006-11-23T13:45:17.470+08:00</updated><title type='text'>Questions and Answers about k shell(ksh)</title><content type='html'>&lt;p&gt;At first, I think ksh is very hard to use than bash. While after sometime, I know we can make it more powerful by this way.&lt;br&gt; Note: please type &lt;b&gt;set -o vi &lt;/b&gt;first, if you never call this command in ksh. you will feel of convenience of ksh.&lt;br&gt; &lt;br&gt; Q: How to complete thefile path name automatically?&lt;br&gt; A: Press ESC and '\' in sequence at the begin characters of the path&lt;br&gt; &lt;br&gt; Q: How to call history command quickly?&lt;br&gt; A: Press ESC and 'i' in sequence, you can get the previous command you type. Press 'i' again will move backward in histroy commands. Press 'j' will move forward in histroy command.&lt;br&gt;    Press '/' will search in histroy command to find one that match the string after '/'.&lt;br&gt; &lt;br&gt; Q: How to move cursor in command line?&lt;br&gt; A: Press ESC first, then press key below to move cursro:&lt;br&gt;    '0' - line begin&lt;br&gt;    '$' - line end&lt;br&gt;    'b' - backward a word&lt;br&gt;    'w' - forward a word&lt;br&gt; &lt;br&gt; Q: How to edit the command you typed?&lt;br&gt; A: Press ESC first, then move the cursor to postion that you want to edit. then you can press the commands in vi command mode to edit the line.&lt;br&gt; &lt;br&gt; &lt;br&gt; Note: you can also use &lt;b&gt;set -o vi&lt;/b&gt; in other shells, such as bash. By the help of this, you can enhence the bash that you can search history command quickly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16045706-116426071743988561?l=guocongbin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://guocongbin.blogspot.com/feeds/116426071743988561/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16045706&amp;postID=116426071743988561&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116426071743988561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116426071743988561'/><link rel='alternate' type='text/html' href='http://guocongbin.blogspot.com/2006/11/questions-and-answers-about-k-shellksh.html' title='Questions and Answers about k shell(ksh)'/><author><name>大魔头</name><uri>http://www.blogger.com/profile/17396118389281260592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='11' src='http://photos1.blogger.com/blogger/5046/1508/1600/guocongbin1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16045706.post-116418773955827182</id><published>2006-11-22T17:28:00.000+08:00</published><updated>2006-11-22T18:14:04.843+08:00</updated><title type='text'>Convert a list to a table</title><content type='html'>&lt;a href="http://photos1.blogger.com/blogger/5046/1508/1600/table.jpg"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://photos1.blogger.com/blogger/5046/1508/320/table.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:Verdana;font-size:130%;"&gt;我自己用c++写的一个小工具，名字就叫做list2table，可以将如下的数据格式转换成为一个表格的形式输出到stdout上面。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:130%;"&gt;key=1&lt;br /&gt;value1=1&lt;br /&gt;key=2&lt;br /&gt;value2=2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Verdana;font-size:130%;"&gt;转换的表格形式如下：&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;font-size:130%;"&gt;该工具拥有很多选项用来控制表格的样式。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:130%;"&gt;目前该工具支持linux、unix.目前我没有在windows下进行测试。&lt;/span&gt;&lt;br /&gt;&lt;a href="http://cn.iblog.com/resserver.php?blogId=1964&amp;amp;resource=list2table.src.zip"&gt;&lt;b&gt;&lt;u&gt;&lt;span style="font-family:Courier New;font-size:130%;color:#552200;"&gt;下载list2table代码&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16045706-116418773955827182?l=guocongbin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://guocongbin.blogspot.com/feeds/116418773955827182/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16045706&amp;postID=116418773955827182&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116418773955827182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116418773955827182'/><link rel='alternate' type='text/html' href='http://guocongbin.blogspot.com/2006/11/convert-list-to-table.html' title='Convert a list to a table'/><author><name>大魔头</name><uri>http://www.blogger.com/profile/17396118389281260592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='11' src='http://photos1.blogger.com/blogger/5046/1508/1600/guocongbin1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16045706.post-116418221871956926</id><published>2006-11-22T15:56:00.001+08:00</published><updated>2006-12-06T15:32:24.736+08:00</updated><title type='text'>SmartPtr也不是银弹</title><content type='html'>凭心而论，Loki中的SmartPtr非常好，我也非常喜欢。但是我们不能以为使用了smartptr就可以解决在c++程序中的内存管理问题。在真正的应用中，smart ptr并不是解决问题的银弹。有时候，smart pointer还会导致非常难以调试的问题。&lt;br /&gt;除了无法控制资源泄漏的问题之外，SmartPtr还有这样的几个问题。&lt;br /&gt;&lt;span class="fulllist"&gt;&lt;br /&gt;&lt;strong&gt;1。raw pointer和smart pointer的混用&lt;/strong&gt;&lt;br /&gt;smart pointer可以完成从raw pointer到smart pointer的自动转换，但是它并不知道这个raw pointer是否已经被其他smart pointer所管理。如果两个smart pointer同时管理同一块内存，因为它们使用的是不同的引用计数器，所以将导致多次删除。&lt;br /&gt;问题看起来似乎很愚蠢，谁会那么费事的去取出一个smart pointer的raw pointer去赋值给另外一个smart pointer呢？这样确实很愚蠢，但是这个问题却有可能在另外一种情况下发生：&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;class A{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SmartPtr&lt;int&gt; d;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;A(int*p){ d = p;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;int * getData(){ return GetImpl(d);}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;class B{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SmartPtr&lt;int&gt; d;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;B(int *p){d = p;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;A a(new int(0));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;B b(a.getData());&lt;/span&gt;&lt;br /&gt;在构造b的时候，我们使用了a中的raw pointer。最终结果不难想象。因此，&lt;u&gt;在使用smart pointer的时候，不要轻易取出被管理的raw pointer。如果你取出了raw pointer，你一定要知道它被用来做什么了！&lt;/u&gt;&lt;br /&gt;&lt;strong&gt;2。确保没有其他的内存管理的机制与smart ptr相冲突&lt;/strong&gt;&lt;br /&gt;举一个我自己的例子吧。我实现了一个observer模式，使用了一个smartptr的链表来管理所有的lisenter。在每个lisenter中，都有这样的一条语句来将其自身添加到这个lisenter的队列中。&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Subject::Instance().AddListener(this);&lt;/span&gt;&lt;br /&gt;看起来似乎没有什么问题，因为我以为所有的listener都是new在heap上面的。但是我忘记了一个特殊情况。&lt;br /&gt;为了能够在UI上面显示，我让一个从MFC的CView继承而来的类也实现了listener的接口，成为了一个lisenter。但是这个类MFC管理的，因为在程序推出的时候，MFC也会去删除这个类，因此导致了冲突。&lt;br /&gt;&lt;strong&gt;3。无法管理new出来的数组&lt;/strong&gt;&lt;br /&gt;使用new得到数组应该使用delete[]来释放，但是smart ptr内部是使用delete的，所以无法用来管理new出来的数组。&lt;br /&gt;&lt;strong&gt;4。确保smart ptr所指向的内存是在heap上，而不是在stack上面&lt;/strong&gt;&lt;br /&gt;不要以为这是一句废话，因为我们无法判断一个指针指向的是heap还是stack。&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16045706-116418221871956926?l=guocongbin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://guocongbin.blogspot.com/feeds/116418221871956926/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16045706&amp;postID=116418221871956926&amp;isPopup=true' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116418221871956926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/116418221871956926'/><link rel='alternate' type='text/html' href='http://guocongbin.blogspot.com/2006/11/smartptr.html' title='SmartPtr也不是银弹'/><author><name>大魔头</name><uri>http://www.blogger.com/profile/17396118389281260592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='11' src='http://photos1.blogger.com/blogger/5046/1508/1600/guocongbin1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16045706.post-112938062932858251</id><published>2005-10-15T20:50:00.000+08:00</published><updated>2005-10-15T20:50:31.223+08:00</updated><title type='text'>路考通过了：）</title><content type='html'>     路考终于通过！虽然我在最后的集训中出现了一些失误，但是考官没有考这些科目，只是考了我最擅长的加减档和坡起。&lt;br /&gt;    我现在越来越喜欢加减档的感觉，而且动作也越来越熟练。现在在转弯的时候，我都是轻踩油门。等方向盘回正之后，由于速度比较快，所以可以直接加档。甚至两个路口之间只有十几米的距离的时候，我都要加到4档，然后到了路口踩刹车减3档。&lt;br /&gt;    除了加减档，我还比较喜欢在高速行驶的时候，轻踩刹车减速的时候的感觉。这样的减速很平稳，感觉很舒服。最后车站住的时候，也不会出现点头的现象，感觉真的是棒极了。&lt;br /&gt;    学车的过程终于结束了。再过两周，我就可以骄傲的最后一次奔赴驾校取驾驶证了。呵呵，我恨不得拿到驾驶证之后，将它举过头顶，绕驾校一周，让所有的学员来向我祝贺：）&lt;br /&gt;    不过一种失落感也产生了：我上哪里去找车开啊？什么时候，我才能有一辆属于自己的车呢？呵呵，这也算是幸福的烦恼了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16045706-112938062932858251?l=guocongbin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://guocongbin.blogspot.com/feeds/112938062932858251/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16045706&amp;postID=112938062932858251&amp;isPopup=true' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/112938062932858251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/112938062932858251'/><link rel='alternate' type='text/html' href='http://guocongbin.blogspot.com/2005/10/blog-post_15.html' title='路考通过了：）'/><author><name>大魔头</name><uri>http://www.blogger.com/profile/17396118389281260592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='11' src='http://photos1.blogger.com/blogger/5046/1508/1600/guocongbin1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16045706.post-112903647822698534</id><published>2005-10-11T21:10:00.000+08:00</published><updated>2005-10-11T21:15:47.956+08:00</updated><title type='text'>使用foxmail作为gmail的客户端</title><content type='html'>gmail的网站上面介绍了如何配置Outlook等客户端,但是没有提到Foxmail。其实foxmail的配置和Outlook差不多。下面就介绍具体配置的注意事项：（我使用的是foxmail 5.0 beta 2）&lt;br /&gt;首先新建一个帐户，然后在上面点击右键，选择属性。&lt;br /&gt;选择邮件服务器，在发送邮件服务器里面输入smtp.gmail.com，选中“smtp服务器需要身份验证”。在接受邮件服务器里面输入pop.gmail.com。然后在下面输入你的邮件帐号和密码（帐号要包括@gmail.com）&lt;br /&gt;然后点击“高级”，讲smtp端口改为465，选中“此服务器要求安全连接（SSL）”。将pop3服务器端口改为995，选中“此服务器要求安全连接（SSL）”。&lt;br /&gt;这样配置就完成了，呵呵&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;另：&lt;/strong&gt;&lt;br /&gt;foxmail有个功能，可以同时收取多个信箱的信件。当gmail设置好了之后，foxmail也会把gmail中的邮件下载的本地。这违反了使用gmail的初衷。我的解决办法是把pop的设置故意修改成错误的，这样在收取的时候就会因为出错而放弃，hoho&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16045706-112903647822698534?l=guocongbin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://guocongbin.blogspot.com/feeds/112903647822698534/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16045706&amp;postID=112903647822698534&amp;isPopup=true' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/112903647822698534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16045706/posts/default/112903647822698534'/><link rel='alternate' type='text/html' href='http://guocongbin.blogspot.com/2005/10/foxmailgmail.html' title='使用foxmail作为gmail的客户端'/><author><name>大魔头</name><uri>http://www.blogger.com/profile/17396118389281260592</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='11' src='http://photos1.blogger.com/blogger/5046/1508/1600/guocongbin1.jpg'/></author><thr:total>1</thr:total></entry></feed>
