<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_.cpp的嵌入式生活</title><subtitle type="text">敌不动，我不动；敌动，我一动不动</subtitle><id>http://feed.cnblogs.com/blog/u/46237/rss</id><updated>2011-10-19T06:39:15Z</updated><author><name>.CPP</name><uri>http://www.cnblogs.com/DotCpp/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/DotCpp/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/46237/rss"/><entry><id>http://www.cnblogs.com/DotCpp/archive/2010/11/16/1878363.html</id><title type="text">PB编写看门狗流式驱动</title><summary type="text">(1) 建立驱动程序目录 在 C:\WINCE500\PLATFORM\mini2440\Src\Drivers\下建立 WDTDriver目录，并在dirs文件中加入此目录，使系统编译 bsp 的时候可以编译这个文件(2)为 WDT驱动创建 Makefile文件 可以参考其他驱动程序示例创建 Makefile文件。 在 WDTDriver目录中建立 makefile文件，内容如下： (3)为 W...</summary><published>2010-11-16T03:35:00Z</published><updated>2010-11-16T03:35:00Z</updated><author><name>.CPP</name><uri>http://www.cnblogs.com/DotCpp/</uri></author><link rel="alternate" href="http://www.cnblogs.com/DotCpp/archive/2010/11/16/1878363.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/DotCpp/archive/2010/11/16/1878363.html"/><content type="html">&lt;p&gt;&lt;strong&gt;(1)&amp;nbsp; 建立驱动程序目录 &lt;/strong&gt;&lt;br /&gt;在 C:\WINCE500\PLATFORM\mini2440\Src\Drivers\下建立 WDTDriver目录，并在dirs文件中加入此目录，使系统编译 bsp 的时候可以编译这个文件&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;(2)为 WDT驱动创建 Makefile文件&lt;/strong&gt; &lt;/p&gt;&#xD;
&lt;p&gt;可以参考其他驱动程序示例创建 Makefile文件。 在 WDTDriver目录中建立 makefile文件，内容如下： &lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;#&#xD;
# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source&#xD;
# file to this component.  This file merely indirects to the real make file&#xD;
# that is shared by all the components of Peg&#xD;
#&#xD;
!INCLUDE $(_MAKEENVROOT)\makefile.def&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;(3)为 WDT驱动创建 source 文件 &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;可以参考其他驱动程序实例创建source 文件，内容如下：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;!if 0&#xD;
    File:   sources&#xD;
     Copyright (c) 1995-2002 Microsoft Corporation.  All rights reserved.&#xD;
!endif&#xD;
&#xD;
!if "$(BSP_NOWATCHDOG)" == "1"&#xD;
SKIPBUILD=1&#xD;
!endif&#xD;
&#xD;
RELEASETYPE=PLATFORM&#xD;
TARGETNAME=WDTDriver&#xD;
TARGETTYPE=DYNLINK&#xD;
DLLENTRY=DllEntry&#xD;
&#xD;
TARGETLIBS= \&#xD;
    $(_COMMONSDKROOT)\lib\$(_CPUINDPATH)\coredll.lib \&#xD;
&#xD;
MSC_WARNING_LEVEL = $(MSC_WARNING_LEVEL) /W3 /WX&#xD;
      &#xD;
SOURCES= wdt.cpp     &#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;(4)编写wdt.def导出 Dll 符号 &lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;可以参考其他驱动程序示例创建 wdt.def文件。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;;&#xD;
; Windows WDT Driver. Written by yubaolee(.cpp/anglecloudy)&#xD;
LIBRARY WDT&#xD;
EXPORTS&#xD;
	WDT_Close&#xD;
	WDT_Deinit&#xD;
	WDT_Init&#xD;
	WDT_IOControl&#xD;
	WDT_Open&#xD;
	WDT_PowerDown&#xD;
	WDT_PowerUp&#xD;
	WDT_Read&#xD;
	WDT_Seek&#xD;
	WDT_Write&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;(5)把驱动加入内核 在配置文件 platform.bib中加入&lt;/strong&gt;以下内容： &lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;IF BSP_NOWATCHDOG !&#xD;
	WDTDriver.dll             $(_FLATRELEASEDIR)\WDTDriver.dll				NK	SH&#xD;
ENDIF BSP_NOWATCHDOG !&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;(6)把 LED 驱动加入注册表 在注册表文件 platform.reg中加入&lt;/strong&gt;以下内容：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;IF BSP_NOWATCHDOG !&#xD;
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\WDTDriver]&#xD;
   "Prefix"="WDT"&#xD;
   "Dll"="WDTDriver.dll"&#xD;
   "Order"="200"&#xD;
ENDIF BSP_NOWATCHDOG !&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;(7)编写代码：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;//wdt.h文件&#xD;
#ifndef __WDT_H_&#xD;
#define __WDT_H_&#xD;
&#xD;
#ifdef __cplusplus&#xD;
extern "C" {&#xD;
#endif&#xD;
&#xD;
DWORD WDT_Init(DWORD dwContext);&#xD;
DWORD WDT_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode);&#xD;
DWORD WDT_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes);&#xD;
&#xD;
DWORD WDT_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count);&#xD;
DWORD WDT_Seek(DWORD hOpenContext, long Amount, DWORD Type);&#xD;
&#xD;
BOOL WDT_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut);&#xD;
BOOL WDT_Close(DWORD hOpenContext);&#xD;
BOOL WDT_Deinit(DWORD hDeviceContext);&#xD;
void WDT_PowerUp(DWORD hDeviceContext);&#xD;
void WDT_PowerDown(DWORD hDeviceContext);&#xD;
&#xD;
#ifdef __cplusplus&#xD;
}&#xD;
#endif&#xD;
#endif&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;//wdt.cpp源码&#xD;
#include &amp;lt;windows.h&amp;gt;&#xD;
#include &amp;lt;nkintr.h&amp;gt;&#xD;
#include &amp;lt;pm.h&amp;gt;&#xD;
#include "pmplatform.h"&#xD;
#include "Pkfuncs.h"&#xD;
#include "s2440.h"&#xD;
&#xD;
#include "wdt.h"&#xD;
&#xD;
volatile WATCHreg	*s2440WDT = 0;&#xD;
&#xD;
static BOOL FeedIt()&#xD;
{&#xD;
&#xD;
	s2440WDT-&amp;gt;rWTCON = 0x8021; // Init Value&#xD;
	s2440WDT-&amp;gt;rWTDAT = s2440WDT-&amp;gt;rWTCNT = 0xFEA9;&#xD;
	s2440WDT-&amp;gt;rWTCON = ( 1 &amp;lt;&amp;lt; 0) | (0x03 &amp;lt;&amp;lt; 3 ) | (1 &amp;lt;&amp;lt; 5) | (0x5A &amp;lt;&amp;lt; 8);&#xD;
	RETAILMSG(1,(TEXT("WDT: feed ok\r\n")));&#xD;
	return TRUE;&#xD;
}&#xD;
&#xD;
BOOL WINAPI  &#xD;
DllEntry(HANDLE	hinstDLL, &#xD;
			DWORD dwReason, &#xD;
			LPVOID  Reserved/* lpvReserved */)&#xD;
{&#xD;
	switch(dwReason)&#xD;
	{&#xD;
	case DLL_PROCESS_ATTACH:&#xD;
		DEBUGREGISTER((HINSTANCE)hinstDLL);&#xD;
		break;&#xD;
	case DLL_THREAD_ATTACH:&#xD;
		break;&#xD;
	case DLL_THREAD_DETACH:&#xD;
		break;&#xD;
	case DLL_PROCESS_DETACH:&#xD;
		break;&#xD;
#ifdef UNDER_CE&#xD;
	case DLL_PROCESS_EXITING:&#xD;
		break;&#xD;
	case DLL_SYSTEM_STARTED:&#xD;
		break;&#xD;
#endif&#xD;
	}&#xD;
&#xD;
	return TRUE;&#xD;
}&#xD;
&#xD;
&#xD;
BOOL WDT_Deinit(DWORD hDeviceContext)&#xD;
{&#xD;
	&#xD;
	return TRUE;&#xD;
}&#xD;
 &#xD;
&#xD;
BOOL WDT_IOControl(DWORD hOpenContext, &#xD;
				   DWORD dwCode, &#xD;
				   PBYTE pBufIn, &#xD;
				   DWORD dwLenIn, &#xD;
				   PBYTE pBufOut, &#xD;
				   DWORD dwLenOut, &#xD;
				   PDWORD pdwActualOut)&#xD;
{&#xD;
 &#xD;
	return 0;&#xD;
} &#xD;
&#xD;
void WDT_PowerDown(DWORD hDeviceContext)&#xD;
{&#xD;
} &#xD;
&#xD;
void WDT_PowerUp(DWORD hDeviceContext)&#xD;
{&#xD;
} &#xD;
&#xD;
DWORD WDT_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)&#xD;
{&#xD;
	return 0;&#xD;
} &#xD;
&#xD;
DWORD WDT_Seek(DWORD hOpenContext, long Amount, DWORD Type)&#xD;
{&#xD;
	return 0;&#xD;
} &#xD;
&#xD;
DWORD WDT_Init(DWORD dwContext)&#xD;
{&#xD;
&#xD;
  do {&#xD;
		s2440WDT = (volatile WATCHreg *) VirtualAlloc(0,sizeof(WATCHreg),MEM_RESERVE, PAGE_NOACCESS);&#xD;
		if (s2440WDT == 0) {&#xD;
			break;&#xD;
		}&#xD;
&#xD;
		if (!VirtualCopy((PVOID)s2440WDT,(PVOID)(WATCH_BASE),sizeof(WATCHreg),PAGE_READWRITE | PAGE_NOCACHE )) {&#xD;
			break;&#xD;
		}&#xD;
&#xD;
		//ret = TRUE;&#xD;
		RETAILMSG(1,(TEXT("WDT: VirtualAlloc ok\r\n")));&#xD;
	} while (0);&#xD;
	RETAILMSG(1,(TEXT("WDT: Init\r\n")));&#xD;
	return TRUE;&#xD;
}&#xD;
&#xD;
BOOL WDT_Close(DWORD hOpenContext)&#xD;
{&#xD;
	if (s2440WDT) {&#xD;
		VirtualFree((void*)s2440WDT, sizeof(WATCHreg), MEM_RELEASE);&#xD;
		s2440WDT = 0;&#xD;
		RETAILMSG(1,(TEXT("WDT: VirtualFree ok\r\n")));&#xD;
	}&#xD;
	RETAILMSG(1,(TEXT("WDT: Close\r\n")));&#xD;
	return TRUE;&#xD;
} &#xD;
&#xD;
// Beaf is here&#xD;
&#xD;
DWORD WDT_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)&#xD;
{&#xD;
	RETAILMSG(1,(TEXT("WDT: Open\r\n")));&#xD;
	return TRUE;&#xD;
} &#xD;
&#xD;
DWORD WDT_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes)&#xD;
{&#xD;
	RETAILMSG(1,(TEXT("WDT: Write\r\n")));&#xD;
	FeedIt();&#xD;
	return TRUE;&#xD;
}&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;(8)这时打开PB 在FileView视图mini2440/src/Drivers/就可以看到WDT的工程了，右键Build Current Project,没有错误的话，就可以生成WDT.DLL文件了，再生成一下系统就行了。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #660000;"&gt;-----------------------------------.CPP---------------------------------------------------------------&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #660000;"&gt;@written by .cpp&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://hi.baidu.com/anglecloudy" target="_blank"&gt;&lt;span style="color: #660000;"&gt;http://hi.baidu.com/anglecloudy&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #660000;"&gt;&lt;a href="http://www.cnblogs.com/DotCpp" target="_blank"&gt;http://www.cnblogs.com/DotCpp&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/DotCpp/aggbug/1878363.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/DotCpp/archive/2010/11/16/1878363.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/DotCpp/archive/2010/09/15/1827106.html</id><title type="text">mini2440 看门狗驱动 WatchDog Driver</title><summary type="text">友善官方提供的看门狗长时间运行后，会造成内存泄漏，从而导致系统重启，给应用开发人员带来了一些麻烦。我重新写了一下看门狗的驱动，很简单。就是把原有的每次喂狗时分配内存改为初始化时分配。</summary><published>2010-09-15T07:46:00Z</published><updated>2010-09-15T07:46:00Z</updated><author><name>.CPP</name><uri>http://www.cnblogs.com/DotCpp/</uri></author><link rel="alternate" href="http://www.cnblogs.com/DotCpp/archive/2010/09/15/1827106.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/DotCpp/archive/2010/09/15/1827106.html"/><content type="html">&lt;p&gt;友善官方提供的看门狗长时间运行后，会造成内存泄漏，从而导致系统重启，给应用开发人员带来了一些麻烦。&lt;/p&gt;&#xD;
&lt;p&gt;我重新写了一下看门狗的驱动，很简单。就是把原有的每次喂狗时分配内存改为初始化时分配。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div &gt;&#xD;
&lt;pre &gt;volatile WATCHreg	*s2440WDT = 0;&#xD;
&#xD;
static BOOL FeedIt()&#xD;
{&#xD;
&#xD;
	s2440WDT-&amp;gt;rWTCON = 0x8021; // Init Value&#xD;
	s2440WDT-&amp;gt;rWTDAT = s2440WDT-&amp;gt;rWTCNT = 0xFEA9;&#xD;
	s2440WDT-&amp;gt;rWTCON = ( 1 &amp;lt;&amp;lt; 0) | (0x03 &amp;lt;&amp;lt; 3 ) | (1 &amp;lt;&amp;lt; 5) | (0x5A &amp;lt;&amp;lt; 8);&#xD;
	RETAILMSG(1,(TEXT("WDT: feed ok\r\n")));&#xD;
	return TRUE;&#xD;
}&#xD;
&#xD;
BOOL WINAPI  &#xD;
DllEntry(HANDLE	hinstDLL, &#xD;
			DWORD dwReason, &#xD;
			LPVOID  Reserved/* lpvReserved */)&#xD;
{&#xD;
	switch(dwReason)&#xD;
	{&#xD;
	case DLL_PROCESS_ATTACH:&#xD;
		DEBUGREGISTER((HINSTANCE)hinstDLL);&#xD;
		break;&#xD;
	case DLL_THREAD_ATTACH:&#xD;
		break;&#xD;
	case DLL_THREAD_DETACH:&#xD;
		break;&#xD;
	case DLL_PROCESS_DETACH:&#xD;
		break;&#xD;
#ifdef UNDER_CE&#xD;
	case DLL_PROCESS_EXITING:&#xD;
		break;&#xD;
	case DLL_SYSTEM_STARTED:&#xD;
		break;&#xD;
#endif&#xD;
	}&#xD;
&#xD;
	return TRUE;&#xD;
}&#xD;
&#xD;
&#xD;
BOOL WDT_Deinit(DWORD hDeviceContext)&#xD;
{&#xD;
	&#xD;
	return TRUE;&#xD;
}&#xD;
 &#xD;
&#xD;
BOOL WDT_IOControl(DWORD hOpenContext, &#xD;
				   DWORD dwCode, &#xD;
				   PBYTE pBufIn, &#xD;
				   DWORD dwLenIn, &#xD;
				   PBYTE pBufOut, &#xD;
				   DWORD dwLenOut, &#xD;
				   PDWORD pdwActualOut)&#xD;
{&#xD;
 &#xD;
	return 0;&#xD;
} &#xD;
&#xD;
void WDT_PowerDown(DWORD hDeviceContext)&#xD;
{&#xD;
} &#xD;
&#xD;
void WDT_PowerUp(DWORD hDeviceContext)&#xD;
{&#xD;
} &#xD;
&#xD;
DWORD WDT_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)&#xD;
{&#xD;
	return 0;&#xD;
} &#xD;
&#xD;
DWORD WDT_Seek(DWORD hOpenContext, long Amount, DWORD Type)&#xD;
{&#xD;
	return 0;&#xD;
} &#xD;
&#xD;
DWORD WDT_Init(DWORD dwContext)&#xD;
{&#xD;
&#xD;
  do {&#xD;
		s2440WDT = (volatile WATCHreg *) VirtualAlloc(0,sizeof(WATCHreg),MEM_RESERVE, PAGE_NOACCESS);&#xD;
		if (s2440WDT == 0) {&#xD;
			break;&#xD;
		}&#xD;
&#xD;
		if (!VirtualCopy((PVOID)s2440WDT,(PVOID)(WATCH_BASE),sizeof(WATCHreg),PAGE_READWRITE | PAGE_NOCACHE )) {&#xD;
			break;&#xD;
		}&#xD;
&#xD;
		//ret = TRUE;&#xD;
		RETAILMSG(1,(TEXT("WDT: VirtualAlloc ok\r\n")));&#xD;
	} while (0);&#xD;
	RETAILMSG(1,(TEXT("WDT: Init\r\n")));&#xD;
	return TRUE;&#xD;
}&#xD;
&#xD;
BOOL WDT_Close(DWORD hOpenContext)&#xD;
{&#xD;
	if (s2440WDT) {&#xD;
		VirtualFree((void*)s2440WDT, sizeof(WATCHreg), MEM_RELEASE);&#xD;
		s2440WDT = 0;&#xD;
		RETAILMSG(1,(TEXT("WDT: VirtualFree ok\r\n")));&#xD;
	}&#xD;
	RETAILMSG(1,(TEXT("WDT: Close\r\n")));&#xD;
	return TRUE;&#xD;
} &#xD;
&#xD;
// Beaf is here&#xD;
&#xD;
DWORD WDT_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)&#xD;
{&#xD;
	RETAILMSG(1,(TEXT("WDT: Open\r\n")));&#xD;
	FeedIt();&#xD;
	return TRUE;&#xD;
} &#xD;
&#xD;
DWORD WDT_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes)&#xD;
{&#xD;
	RETAILMSG(1,(TEXT("WDT: Write\r\n")));&#xD;
	FeedIt();&#xD;
	return TRUE;&#xD;
}&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/p&gt;&lt;img src="http://www.cnblogs.com/DotCpp/aggbug/1827106.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/DotCpp/archive/2010/09/15/1827106.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/DotCpp/archive/2010/08/11/1797112.html</id><title type="text">WINCE重新启动</title><summary type="text">因为要在WINCE上面开发一个系统，监测数据。长时间运行下去容易导致死机。所以设定定时重启。认真分析与查阅相关资料后，发现下面几种方法：一、使用SetSystemPowerState，通过测试后发现该方法重启的效果并不理想，有点像WINDOWS的注销而不是断电重启。二、使用看门狗，因为看门狗必须定时喂食，所以我在调用时不给它喂食就会造成系统重启。我用的EMD9263的板子，重启代码如下：在实际运用...</summary><published>2010-08-11T02:15:00Z</published><updated>2010-08-11T02:15:00Z</updated><author><name>.CPP</name><uri>http://www.cnblogs.com/DotCpp/</uri></author><link rel="alternate" href="http://www.cnblogs.com/DotCpp/archive/2010/08/11/1797112.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/DotCpp/archive/2010/08/11/1797112.html"/><content type="html">&lt;p&gt;因为要在WINCE上面开发一个系统，监测数据。长时间运行下去容易导致死机。所以设定定时重启。认真分析与查阅相关资料后，发现下面几种方法：&lt;/p&gt;&#xD;
&lt;p&gt;一、使用SetSystemPowerState，通过测试后发现该方法重启的效果并不理想，有点像WINDOWS的注销而不是断电重启。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div &gt;&#xD;
&lt;pre &gt;#ifndef POWER_STATE_RESET&#xD;
#define POWER_STATE_RESET DWORD(0x00800000)&#xD;
#endif&#xD;
&#xD;
typedef BOOL (*SetSystemPowerState)(   &#xD;
									LPCWSTR psState,&#xD;
									DWORD StateFlags,&#xD;
									DWORD Options&#xD;
                                    );&#xD;
&#xD;
&#xD;
&#xD;
//在函数中调用如下：&#xD;
HINSTANCE hModule = LoadLibrary(_T("Coredll.dll"));&#xD;
SetSystemPowerState f = (SetSystemPowerState)::GetProcAddress(hModule, TEXT("SetSystemPowerState"));&#xD;
f(NULL, POWER_STATE_RESET, 0);&#xD;
::FreeLibrary(hModule);&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;二、使用看门狗，因为看门狗必须定时喂食，所以我在调用时不给它喂食就会造成系统重启。我用的EMD9263的板子，重启代码如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div &gt;&#xD;
&lt;pre &gt;#define AT91SAM9263_ENABLE_WATCHDOG			2400&#xD;
#define AT91SAM9263_DISABLE_WATCHDOG		2401&#xD;
#define AT91SAM9263_CLEAR_WATCHDOG			2402&#xD;
#define FILE_DEVICE_DATALINK            0x00000005&#xD;
#define METHOD_BUFFERED                 0&#xD;
#define FILE_WRITE_ACCESS         ( 0x0002 )    // file &amp;amp; pipe&#xD;
#define CTL_CODE( DeviceType, Function, Method, Access ) (                 \&#xD;
	((DeviceType) &amp;lt;&amp;lt; 16) | ((Access) &amp;lt;&amp;lt; 14) | ((Function) &amp;lt;&amp;lt; 2) | (Method) \&#xD;
	)&#xD;
&#xD;
#define IOCTL_ENABLE_WATCHDOG CTL_CODE(FILE_DEVICE_DATALINK, AT91SAM9263_ENABLE_WATCHDOG, METHOD_BUFFERED, FILE_WRITE_ACCESS)&#xD;
#define IOCTL_DISABLE_WATCHDOG CTL_CODE(FILE_DEVICE_DATALINK, AT91SAM9263_DISABLE_WATCHDOG, METHOD_BUFFERED, FILE_WRITE_ACCESS)&#xD;
#define IOCTL_CLEAR_WATCHDOG CTL_CODE(FILE_DEVICE_DATALINK, AT91SAM9263_CLEAR_WATCHDOG, METHOD_BUFFERED, FILE_WRITE_ACCESS)&#xD;
&#xD;
&#xD;
//调用如下:&#xD;
 HANDLE  hFileWatchdog= CreateFile(_T("DOG1:"), &#xD;
		                               GENERIC_READ | GENERIC_WRITE,&#xD;
		                                0,&#xD;
										NULL, &#xD;
										OPEN_EXISTING,&#xD;
										FILE_ATTRIBUTE_NORMAL,&#xD;
										NULL);&#xD;
	if (hFileWatchdog != INVALID_HANDLE_VALUE)&#xD;
	{&#xD;
		DWORD dwReturn;&#xD;
		BOOL ret=::DeviceIoControl(hFileWatchdog,IOCTL_ENABLE_WATCHDOG,NULL,0,NULL,0,&amp;amp;dwReturn,NULL);&#xD;
		if(ret!=TRUE)&#xD;
		{&#xD;
			::CloseHandle(hFileWatchdog);&#xD;
		}&#xD;
	}	&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在实际运用中，我用的是第二种方法。第一种方法可以适当使用。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;@written by .cpp&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" target="_blank" href="http://www.cnblogs.com/dotcpp"&gt;http://www.cnblogs.com/dotcpp&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a target="_blank" href="http://hi.baidu.com/anglecloudy"&gt;http://hi.baidu.com/anglecloudy&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/DotCpp/aggbug/1797112.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/DotCpp/archive/2010/08/11/1797112.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/DotCpp/archive/2010/07/29/1788082.html</id><title type="text">2440 WinCE操作GPIO</title><summary type="text">Windows CE系统将GPIO的实地址(例如2440的GPIO的基地址为0x56000000)映射到虚拟地址空间（GPIO对应为0xB1600000），这 样，通过对这段虚拟地址空间的操作，就能够完成对GPIO或者其他片内资源的控制、输入输出工作。要操作一个平台的GPIO，在其对应BSP中按照基地址，找到虚拟地址，并且找到方便操作这个地址的数据结构就可以了，关键函数就是 VirtualAllo...</summary><published>2010-07-29T09:06:00Z</published><updated>2010-07-29T09:06:00Z</updated><author><name>.CPP</name><uri>http://www.cnblogs.com/DotCpp/</uri></author><link rel="alternate" href="http://www.cnblogs.com/DotCpp/archive/2010/07/29/1788082.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/DotCpp/archive/2010/07/29/1788082.html"/><content type="html">&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;Windows CE系统将GPIO的实地址(例如2440的GPIO的基地址为0x56000000)映射到虚拟地址空间（GPIO对应为0xB1600000），这 样，通过对这段虚拟地址空间的操作，就能够完成对GPIO或者其他片内资源的控制、输入输出工作。要操作一个平台的GPIO，在其对应BSP中按照基地址，找到虚拟地址，并且找到方便操作这个地址的数据结构就可以了，关键函数就是 VirtualAlloc和VirtualCopy。下面以操作Samsung S3C2440的GPIO为例，讲述这个步骤：&lt;br /&gt;1.首先在BSP中的s2440.h文件，找到虚拟地址映射以及操作GPIO的寄存器结构体(这个在自己制作一些特殊设备的BSP时，会依据需要而发生更改)&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;#define IOP_BASE      0xB1600000 // 0x56000000&#xD;
typedef struct  {&#xD;
	unsigned int  rGPACON;			// 00&#xD;
	unsigned int  rGPADAT;&#xD;
	unsigned int  rPAD1[2];&#xD;
&#xD;
	unsigned int  rGPBCON;			// 10&#xD;
	unsigned int  rGPBDAT;&#xD;
	unsigned int  rGPBUP;&#xD;
	unsigned int  rPAD2;&#xD;
&#xD;
	unsigned int  rGPCCON;			// 20&#xD;
	unsigned int  rGPCDAT;&#xD;
	unsigned int  rGPCUP;&#xD;
	unsigned int  rPAD3;&#xD;
&#xD;
	unsigned int  rGPDCON;			// 30&#xD;
	unsigned int  rGPDDAT;&#xD;
	unsigned int  rGPDUP; &#xD;
	unsigned int  rPAD4;&#xD;
&#xD;
	unsigned int  rGPECON;			// 40&#xD;
	unsigned int  rGPEDAT;&#xD;
	unsigned int  rGPEUP;&#xD;
	unsigned int  rPAD5;&#xD;
&#xD;
	unsigned int  rGPFCON;			// 50&#xD;
	unsigned int  rGPFDAT;&#xD;
	unsigned int  rGPFUP; &#xD;
	unsigned int  rPAD6;&#xD;
&#xD;
	unsigned int  rGPGCON;			// 60&#xD;
	unsigned int  rGPGDAT;&#xD;
	unsigned int  rGPGUP; &#xD;
	unsigned int  rPAD7;&#xD;
&#xD;
	unsigned int  rGPHCON;			// 70&#xD;
	unsigned int  rGPHDAT;&#xD;
	unsigned int  rGPHUP; &#xD;
	unsigned int  rPAD8;&#xD;
&#xD;
	unsigned int  rMISCCR;			// 80&#xD;
	unsigned int  rDCKCON;		&#xD;
	unsigned int  rEXTINT0;&#xD;
	unsigned int  rEXTINT1;		&#xD;
	unsigned int  rEXTINT2;			// 90&#xD;
	unsigned int  rEINTFLT0;&#xD;
	unsigned int  rEINTFLT1;&#xD;
	unsigned int  rEINTFLT2;&#xD;
	unsigned int  rEINTFLT3;		// A0&#xD;
	unsigned int  rEINTMASK;&#xD;
	unsigned int  rEINTPEND;&#xD;
	unsigned int  rGSTATUS0;		// AC&#xD;
	unsigned int  rGSTATUS1;		// B0&#xD;
	unsigned int  rGSTATUS2;		// B4 ;;; SHL&#xD;
	unsigned int  rGSTATUS3;		// B8&#xD;
	unsigned int  rGSTATUS4;		// BC&#xD;
&#xD;
	unsigned int  rFLTOUT;			// C0&#xD;
	unsigned int  rDSC0;&#xD;
	unsigned int  rDSC1;&#xD;
	unsigned int  rMSLCON;&#xD;
&#xD;
	unsigned int  rGPJCON;			// D0&#xD;
	unsigned int  rGPJDAT;&#xD;
	unsigned int  rGPJUP;&#xD;
	unsigned int  rPAD9;&#xD;
&#xD;
}IOPreg;  &#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;二、因为我用的mini2440开发板的GPB0接在蜂鸣器上，所以我以操作GPB0为例编写代码。这样给GPB0一个高电平，那么蜂鸣器就会响，反之蜂鸣器就会停止发声&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;#ifdef __cplusplus&#xD;
extern "C"&#xD;
{&#xD;
#endif&#xD;
	BOOL VirtualCopy( PVOID, PVOID, DWORD, DWORD );&#xD;
#ifdef __cplusplus&#xD;
}&#xD;
#endif&#xD;
&#xD;
&#xD;
void GPIO()        //通过GPIO控制蜂鸣器&#xD;
{&#xD;
	volatile IOPreg *v_pIORegs;&#xD;
	v_pIORegs = (volatile IOPreg *)VirtualAlloc(0, sizeof(IOPreg), MEM_RESERVE, PAGE_NOACCESS);&#xD;
	if(v_pIORegs)&#xD;
	{&#xD;
		if(VirtualCopy((PVOID)v_pIORegs, (PVOID)IOP_BASE, sizeof(IOPreg), PAGE_READWRITE | PAGE_NOCACHE))&#xD;
		{&#xD;
			v_pIORegs-&amp;gt;rGPBCON = 1;                    //将GPB0设置为OUTPUT&#xD;
			v_pIORegs-&amp;gt;rGPBDAT = 0x3ff;               //设置为高电平，蜂鸣器发声&#xD;
			Sleep(3000);&#xD;
			v_pIORegs-&amp;gt;rGPBDAT = 0;                     //恢复为低电平，蜂鸣器停止发声&#xD;
		}&#xD;
&#xD;
		VirtualFree((LPVOID)v_pIORegs, 0, MEM_RELEASE);&#xD;
		v_pIORegs = NULL;&#xD;
	}&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;@written by .cpp&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;百度空间：http://hi.baidu.com/anglecloudy&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体;"&gt;博客园：http://www.cnblogs.com/dotcpp&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/DotCpp/aggbug/1788082.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/DotCpp/archive/2010/07/29/1788082.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/DotCpp/archive/2010/05/05/1728025.html</id><title type="text">获取系统当前正在运行的全部进程</title><summary type="text">#include &amp;lt;windows.h&amp;gt;#include &amp;lt;TlHelp32.h&amp;gt;#include &amp;lt;stdio.h&amp;gt;int main(){	PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) };	HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPP...</summary><published>2010-05-05T06:42:00Z</published><updated>2010-05-05T06:42:00Z</updated><author><name>.CPP</name><uri>http://www.cnblogs.com/DotCpp/</uri></author><link rel="alternate" href="http://www.cnblogs.com/DotCpp/archive/2010/05/05/1728025.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/DotCpp/archive/2010/05/05/1728025.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&#xD;
&lt;pre &gt;#include &amp;lt;windows.h&amp;gt;&#xD;
#include &amp;lt;TlHelp32.h&amp;gt;&#xD;
#include &amp;lt;stdio.h&amp;gt;&#xD;
&#xD;
int main()&#xD;
{&#xD;
	PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) };&#xD;
	HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);&#xD;
	if (hProcessSnap == INVALID_HANDLE_VALUE)&#xD;
	{&#xD;
		printf("CreateIoolhelp32snapshot error\n");&#xD;
		return -1;&#xD;
	}&#xD;
&#xD;
	bool bMore = ::Process32First(hProcessSnap, &amp;amp;pe32);&#xD;
	while(bMore)&#xD;
	{&#xD;
		printf("process name : %s \n", pe32.szExeFile);&#xD;
		printf("proecess id : %u \n........................\n", pe32.th32ProcessID);&#xD;
		bMore = ::Process32Next(hProcessSnap, &amp;amp;pe32);&#xD;
	}&#xD;
	CloseHandle(hProcessSnap);&#xD;
&#xD;
	system("pause");&#xD;
}&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/DotCpp/aggbug/1728025.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/DotCpp/archive/2010/05/05/1728025.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/DotCpp/archive/2010/04/17/1714099.html</id><title type="text">博客园网站有病毒？</title><summary type="text">今天一朋友在QQ上发来博客园一文章让我看，拿QQ去点，就是下图。狂汗。图上的文章为windows mobile方面的大牛：http://www.cnblogs.com/procoder/archive/2010/04/17/Programming_Windows_Phone_7_Introduction.html不知道博客园的工作人员看了怎么想，唉...</summary><published>2010-04-17T02:25:00Z</published><updated>2010-04-17T02:25:00Z</updated><author><name>.CPP</name><uri>http://www.cnblogs.com/DotCpp/</uri></author><link rel="alternate" href="http://www.cnblogs.com/DotCpp/archive/2010/04/17/1714099.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/DotCpp/archive/2010/04/17/1714099.html"/><content type="html">&lt;p&gt;今天一朋友在QQ上发来博客园一文章让我看，拿QQ去点，就是下图。狂汗。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/dotcpp/201004/2010041710224841.jpg" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;图上的文章为windows mobile方面的大牛：&lt;a target="_blank" href="http://www.cnblogs.com/procoder/archive/2010/04/17/Programming_Windows_Phone_7_Introduction.html"&gt;http://www.cnblogs.com/procoder/archive/2010/04/17/Programming_Windows_Phone_7_Introduction.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;不知道博客园的工作人员看了怎么想，唉...&lt;/p&gt;&lt;img src="http://www.cnblogs.com/DotCpp/aggbug/1714099.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/DotCpp/archive/2010/04/17/1714099.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/DotCpp/archive/2010/04/14/1711619.html</id><title type="text">VC按字符读取文件</title><summary type="text">[代码]下面是多字符与宽字符互相转化的封装类：[代码]</summary><published>2010-04-14T02:26:00Z</published><updated>2010-04-14T02:26:00Z</updated><author><name>.CPP</name><uri>http://www.cnblogs.com/DotCpp/</uri></author><link rel="alternate" href="http://www.cnblogs.com/DotCpp/archive/2010/04/14/1711619.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/DotCpp/archive/2010/04/14/1711619.html"/><content type="html">&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;#pragma&lt;/span&gt;&lt;span style="color: #000000;"&gt; once&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;#include &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Common.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;***********************************************&lt;br /&gt;  类名：CCableFile&lt;br /&gt;  功能：用于普通文件读取&lt;br /&gt;************************************************&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; CCableFile&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;    FILE&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; m_file;&lt;br /&gt;    CCommon m_comm;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;    CCableFile(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #000000;"&gt;~&lt;/span&gt;&lt;span style="color: #000000;"&gt;CCableFile(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt;    BOOL OpenFile(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; pszFile&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;NandFlash\\LogInfo.log&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, BOOL bRead&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;FALSE);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; CloseFile();&lt;br /&gt;    BOOL ReadLine( CString&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; szLine );&lt;br /&gt;    BOOL WriteLine(CString szLine);&lt;br /&gt;    BOOL WriteLine(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; pszTxt, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; nTxt);&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="width: 796px; height: 1881px;" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;StdAfx.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;#include &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CableFile.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#define&lt;/span&gt;&lt;span style="color: #000000;"&gt; BUFFERLEN 50&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;CCableFile::CCableFile(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;{&lt;br /&gt;    m_file &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; NULL;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;CCableFile::&lt;/span&gt;&lt;span style="color: #000000;"&gt;~&lt;/span&gt;&lt;span style="color: #000000;"&gt;CCableFile(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CCableFile::OpenFile(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; pszFile&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;=NandFlash\\LogInfo.log&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;, BOOL bRead&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;=FALSE&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (bRead)&lt;br /&gt;    {&lt;br /&gt;        m_file &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; fopen(pszFile, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;r&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    {&lt;br /&gt;        m_file &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; fopen(pszFile, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;br /&gt;    }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (m_file &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; NULL)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br /&gt;    }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; CCableFile::CloseFile()&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (m_file &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; NULL)&lt;br /&gt;    {&lt;br /&gt;        fclose(m_file);&lt;br /&gt;        m_file &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; NULL;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CCableFile::ReadLine( CString&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; szLine )&lt;br /&gt;{&lt;br /&gt;    szLine&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; pos &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; ch;&lt;br /&gt;    WCHAR&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; pwTxt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; szTxt[BUFFERLEN];&lt;br /&gt;    memset(szTxt, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, BUFFERLEN);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt; ((ch &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;fgetc(m_file))&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; (ch&lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; EOF)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(ch&lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;))&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(pos &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; BUFFERLEN &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;        {&lt;br /&gt;            m_comm.ToWideString(pwTxt, szTxt, pos, TRUE);&lt;br /&gt;            szLine &lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt;pwTxt;&lt;br /&gt;            pos &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;            memset(szTxt, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, BUFFERLEN);&lt;br /&gt;            DELPOINTER(pwTxt);&lt;br /&gt;        }&lt;br /&gt;        szTxt[pos] &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; ch;&lt;br /&gt;        pos &lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (pos &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;    {&lt;br /&gt;        m_comm.ToWideString(pwTxt, szTxt, pos, TRUE);&lt;br /&gt;        szLine &lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt;pwTxt;&lt;br /&gt;        DELPOINTER(pwTxt);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (szLine.GetLength() &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)  &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; FALSE;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; TRUE;&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CCableFile::WriteLine( &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; pszTxt, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; nTxt )&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; nLen &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; fwrite(pszTxt, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;), nTxt, m_file);&lt;br /&gt;    fflush(m_file);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; (nLen &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; nTxt);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CCableFile::WriteLine( CString szLine )&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; pTxt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; nLen &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; m_comm.ToMultiBytes(pTxt,&lt;br /&gt;                                                              szLine.GetBuffer(szLine.GetLength()), &lt;br /&gt;                                                              szLine.GetLength(), &lt;br /&gt;                                                              FALSE);&lt;br /&gt;    BOOL bWrite &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;WriteLine(pTxt, nLen);&lt;br /&gt;    delete[] pTxt;&lt;br /&gt;    pTxt &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; NULL;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; bWrite;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面是多字符与宽字符互相转化的封装类：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="width: 782px; height: 641px;" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;#pragma&lt;/span&gt;&lt;span style="color: #000000;"&gt; once&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;**********************************************************************&lt;br /&gt; 类名：全局通用类&lt;br /&gt; 功能：封装一些基本操作，如字符类型转换等&lt;br /&gt;***********************************************************************&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; CCommon&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;**********************************************************************&lt;br /&gt;     功能：将多字符数组转成宽字符数组&lt;br /&gt;     参数：pwStr：目标宽字符指针；&lt;br /&gt;               pStr：源多字符指针；&lt;br /&gt;               len：源数组长度；&lt;br /&gt;               IsEnd：是否加'\0'&lt;br /&gt;     返回：转换后的宽字符数组长度&lt;br /&gt;    ************************************************************************&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; ToWideString(WCHAR&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;pwStr, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; pStr, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; len, BOOL IsEnd);&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;**********************************************************************&lt;br /&gt;     功能：将宽字符数组转成多字符数组&lt;br /&gt;     参数：pStr：目标多字符指针；&lt;br /&gt;               pwStr：源宽字符指针；&lt;br /&gt;               len：源数组长度&lt;br /&gt;               IsEnd：是否加'\0'&lt;br /&gt;     返回：转换后的多字符数组长度&lt;br /&gt;    ************************************************************************&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; ToMultiBytes(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;pStr, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; WCHAR&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; pwStr, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; len, BOOL IsEnd);&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;StdAfx.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;#include &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Common.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; CCommon::ToWideString( WCHAR&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;pwStr, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; pStr, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; len, BOOL IsEnd)&lt;br /&gt;{&lt;br /&gt;    ASSERT_POINTER(pStr, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;    ASSERT(len &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;||&lt;/span&gt;&lt;span style="color: #000000;"&gt; len &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; nWideLen &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; MultiByteToWideChar(CP_ACP, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, pStr, len, NULL, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (len &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;--&lt;/span&gt;&lt;span style="color: #000000;"&gt;nWideLen;&lt;br /&gt;    }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (nWideLen &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (IsEnd)&lt;br /&gt;    {&lt;br /&gt;        pwStr &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; WCHAR[(nWideLen&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(WCHAR)];&lt;br /&gt;        ZeroMemory(pwStr, (nWideLen&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(WCHAR));&lt;br /&gt;    }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    {&lt;br /&gt;        pwStr &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; WCHAR[nWideLen&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(WCHAR)];&lt;br /&gt;        ZeroMemory(pwStr, nWideLen&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;sizeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(WCHAR));&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    MultiByteToWideChar(CP_ACP, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, pStr, len, pwStr, nWideLen);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; nWideLen;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; CCommon::ToMultiBytes( &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;pStr, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; WCHAR&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; pwStr, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; len, BOOL IsEnd)&lt;br /&gt;{&lt;br /&gt;    ASSERT_POINTER(pwStr, WCHAR) ; &lt;br /&gt;    ASSERT( len &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;||&lt;/span&gt;&lt;span style="color: #000000;"&gt; len &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) ; &lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; nChars &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; WideCharToMultiByte(CP_ACP, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, pwStr, len, NULL, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, NULL, NULL);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (len &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;--&lt;/span&gt;&lt;span style="color: #000000;"&gt;nChars;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (nChars &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(IsEnd)&lt;br /&gt;    {&lt;br /&gt;        pStr &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;[nChars&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;        ZeroMemory(pStr, nChars&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;    }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    {&lt;br /&gt;        pStr &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;[nChars];&lt;br /&gt;        ZeroMemory(pStr, nChars);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    WideCharToMultiByte(CP_ACP, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;, pwStr, len, pStr, nChars, NULL, NULL);&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; nChars;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/DotCpp/aggbug/1711619.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/DotCpp/archive/2010/04/14/1711619.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/DotCpp/archive/2010/03/02/1676850.html</id><title type="text">字符数组十六进制显示</title><summary type="text">代码</summary><published>2010-03-02T15:58:00Z</published><updated>2010-03-02T15:58:00Z</updated><author><name>.CPP</name><uri>http://www.cnblogs.com/DotCpp/</uri></author><link rel="alternate" href="http://www.cnblogs.com/DotCpp/archive/2010/03/02/1676850.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/DotCpp/archive/2010/03/02/1676850.html"/><content type="html">&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('2f1594cf-25ab-4ab1-a6cc-e09e73ce0686')"&gt;&#xD;
&lt;div id="cnblogs_code_open_2f1594cf-25ab-4ab1-a6cc-e09e73ce0686"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;ShowRecvMessage(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; pszMessage, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; nLength)&lt;br /&gt;{&lt;br /&gt;            CString strShow;&lt;br /&gt;        LPTSTR p;&lt;br /&gt;        TCHAR szText[&lt;/span&gt;&lt;span style="color: #800080;"&gt;300&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br /&gt;        ZeroMemory(szText, &lt;/span&gt;&lt;span style="color: #800080;"&gt;300&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;        p &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; szText;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; nLength; i&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;        {&lt;br /&gt;            p&lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt; wsprintf(p, TEXT(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%.2x&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), pszMessage[i]);  &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;这部分为关键部分&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        }&lt;br /&gt;        strShow.Format(_T(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s\r\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;), szText);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    CEdit&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; pEdit &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;(CEdit&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;)AfxGetMainWnd()&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;GetDlgItem(IDC_EDIT_SHOWMSG);&lt;br /&gt;    pEdit&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;SetFocus();&lt;br /&gt;    pEdit&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;SetSel(&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;    pEdit&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;ReplaceSel(strShow);&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/p&gt;&lt;img src="http://www.cnblogs.com/DotCpp/aggbug/1676850.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/DotCpp/archive/2010/03/02/1676850.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/DotCpp/archive/2010/02/21/1670538.html</id><title type="text">Winsock五种I/O模型的性能分析【转】</title><summary type="text">注：本文转http://blog.pfan.cn/xman/45130.html 五种I/O模型的性能分析 重叠I/O 模型的另外几个优点在于，微软针对重叠I/O 模 型提供了一些特有的扩展函数。当使用重叠I/O 模型时，可以选择使用不同的完成通知方式。 采用事 件对象通知的重叠I/O 模型是不可伸缩的，因为针对发出WSAWaitForMultipleEvents 调 用的每个线程，该I/O 模型...</summary><published>2010-02-21T07:06:00Z</published><updated>2010-02-21T07:06:00Z</updated><author><name>.CPP</name><uri>http://www.cnblogs.com/DotCpp/</uri></author><link rel="alternate" href="http://www.cnblogs.com/DotCpp/archive/2010/02/21/1670538.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/DotCpp/archive/2010/02/21/1670538.html"/><content type="html">&lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;div id="content"&gt; &lt;p style="text-indent: 19pt; line-height: 12pt;" mce_style=" text-indent: 19pt;  line-height: 12pt;"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;注：本文转&lt;/span&gt;&lt;a href="http://blog.pfan.cn/xman/45130.html" mce_href="http://blog.pfan.cn/xman/45130.html" target="_blank"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;http://blog.pfan.cn/xman/45130.html&lt;/span&gt;&lt;/a&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 12pt;" mce_style=" text-indent: 19pt;  line-height: 12pt;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;div id="content"&gt; &lt;p style="text-indent: 19pt; line-height: 12pt;" mce_style=" text-indent: 19pt;  line-height: 12pt;"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;&lt;strong&gt;五种I/O模型的性能分析&lt;/strong&gt; &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 12pt;" mce_style=" text-indent: 19pt;  line-height: 12pt;"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;重叠&lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt;I/O 模型的另外几个优点在于，微软针对重叠I/O 模 型提供了一些特有的扩展函数。当使用重叠I/O 模型时，可以选择使用不同的完成通知方式。 &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 12pt;" mce_style=" text-indent: 19pt;  line-height: 12pt;"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;采用事 件对象通知的重叠I/O 模型是不可伸缩的，因为针对发出WSAWaitForMultipleEvents 调 用的每个线程，该I/O 模型一次最多都只能支持6 4 个 套接字。假如想让这个模型同时管理不止64 个套接字，必须创建额外的工作者线程，以便等待更多的事 件对象。因为操作系统同时能够处理的事件对象是有限的，所以基于事件对象的I/O 模型不具备伸缩 性。 &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 12pt;" mce_style=" text-indent: 19pt;  line-height: 12pt;"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;使用完 成例程通知的重叠I/O 模型，因为以下几个原因，也不是开发高性能服务器的最佳选择。首先，许多扩 展功能不允许使用APC （&lt;span style="font-family: Comic Sans MS;"&gt;Asyncroneus  Procedure Call&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt; ，异步过程调用）完成通知。其次，由于APC 在系统内 部特有的处理机制，应用程序线程可能无限等待而得不到完成通知。当一个线程处于&amp;#8220; 可警告状态&amp;#8221; 时，所有挂起的APC 按照先进先出的顺序（FIFO ）接受处理。现在考虑这样一种情况，服务器已经建立起了一个连接，并且调用含有完成例程指针的WSARecv 投递了一个重叠I/O 请求。当有数据到 达时（即I/O 完成时），完成例程执行并且再次调用WSARecv 抛 出另外一个重叠I/O 请求。一个APC 抛出 的I/O 操作需要一定的时间才能完成，所以这期间可能另外一个完成例程等待执行（比如本次WSARecv 还没接收完时，又有一个新的客户接入并发来数据），因为还有更多的数据需要读取（上一个客户发 来的数据尚未读完）。只要（投递WSARecv 的）那个套接字上还有&amp;#8220; 未决&amp;#8221; （未接收完）的数据，就会导致调用线程长久阻 塞。 &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 12pt;" mce_style=" text-indent: 19pt;  line-height: 12pt;"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;基于完 成端口通知的重叠I/O 模型是Windows NT 系 统提供的一个真正支持高伸缩性的I/O 模型。在上一章中，探讨了Winsock 几种常见的I/O 模型，并且说明了当应对 大规模客户连接时，完成端口是最佳的选择，因为它提供了最好的伸缩性。 &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 12pt;" mce_style=" text-indent: 19pt;  line-height: 12pt;"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;对不同&lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt;Winsock I/O 模型的性能测试结果如图1 所 示。其中服务器采用Pentium 4 1.7 GHz Xeon 的CPU ，768M 内存；客户端有3 台PC ，配置分别是Pentium 2 233MHz  ，128 MB  内存，Pentium 2 350 MHz  ，128 MB 内存，Itanium 733 MHz  ，1 GB 内存。服务器、客户端安装的操作系统都是&lt;span style="font-family: Comic Sans MS;"&gt;Windows  XP&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt; 。 &lt;/span&gt; &lt;/p&gt; &lt;p style="line-height: 130%;" mce_style=" line-height: 130%;" align="center"&gt;&lt;img src="http://blog.pfan.cn/upfile/200907/20090711214342.jpg" mce_src="http://blog.pfan.cn/upfile/200907/20090711214342.jpg" alt="" /&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 12pt;" mce_style="  text-indent: 19pt; line-height: 12pt;" align="center"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;图&lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt;1  不 同I/O 模型的性能比较 &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 120%;" mce_style="  text-indent: 19pt; line-height: 120%;" align="left"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;1. 分析图表&lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt;1 提供的测试结果可知，在所用的I/O 模型中，阻塞模式性能最差。这个测试程序中，服务器为每个客户创建两个线程：一个负责处理数据的接收，一 个负责处理数据的发送。在多次测试中的共同问题就是，阻塞模式难以应对大规模的客户连接，因为它在创建线程上耗费了太多的系统资源。因此，服务器创建太多 的线程后，再调用CreateThread 函数时，将返回ERROR_NOT_ENOUGH_MEMORY 的 错误，这个错误码提示内存不够。那些发出连接请求的客户则收到WSAECONNREFUSED 的错 误提示，表示连接的尝试被拒绝。 &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 120%;" mce_style="  text-indent: 19pt; line-height: 120%;" align="left"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;让我们来看看监听函数&lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt;listen ，其原型如下： &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 120%;" mce_style="  text-indent: 19pt; line-height: 120%;" align="left"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;WINSOCK_API_LINKAGE int WSAAPI listen （&lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt;SOCKET s, int backlog  ）; &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 120%;" mce_style="  text-indent: 19pt; line-height: 120%;" align="left"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;参数一&lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt;s 已绑定了地址的监听套接字。 &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 120%;" mce_style="  text-indent: 19pt; line-height: 120%;" align="left"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;参数二&lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt;backlog 指定了正在等待连接的最大队列长度。 &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 120%;" mce_style="  text-indent: 19pt; line-height: 120%;" align="left"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;参数&lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt;backdog 非常重要, &lt;/span&gt; &amp;#8197; &lt;span style="font-family: Comic Sans MS;"&gt;因为完全可能同时出 现几个对服务器的连接请求。例如，假定backlog 参数为2 时 有三个客户机同时发出连接请求，那么前两个会被放在一个&amp;#8220; 等待处理&amp;#8221; 队列中，以便应用程序依次为它们提供服务。而第三个连接的请求就会造成一个WSAECONNREFUSED 错误。一旦服务器接受了一个连接请求，那个连接请求就会从队列中删去，以便可以 继续接收其他客户发出的连接请求。即当一个连接请求到来时队列已满，那么客户将收到一个WSAECONNREFUSED 错 误。而backlog 参数本身的大小就存在着限制，这个限制是由协议提供者决定的。 &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 120%;" mce_style="  text-indent: 19pt; line-height: 120%;" align="left"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;故阻塞模式下，由于系 统资源的限制，其并发处理量是极难突破的。 &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 120%;" mce_style=" text-indent: 19pt;  line-height: 120%;"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;2. 非阻塞模式表现出的性能要比阻塞模式稍好，但是占用了太多的&lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt;CPU 处理时间。测试服务器将所有客户对应的socket 分 类放到FD_SET 集合中，然后调用select 函 数筛选出对应集合中有事件发生的socket ，并对集合更新。接下来调用FD_ISSET 宏重新判断一个套接字是否在原来加入的FD_SET 集 合中。随着客户连接数量的增多，这种模型的局限性逐渐凸现。仅仅为了判断一个套接字是否有网络事件发生，就需要对集合FD_SET 执行一次遍历! 使用迭代搜索来对select 更新的FD_SET 进行扫描，性能可以得 到一些提升。瓶颈在于，服务器必须能够很快地扫描出FD_SET 集合中的有网络事件发生的套接字的 相关信息。针对这个问题，可以使用更复杂的扫描算法，如哈希搜索，它的效率是极高的。还需要注意的一个问题就是，非分页池（即直接在物理内存中分配的内 存）的使用极高。这是因为AFD （&lt;span style="font-family: Comic Sans MS;"&gt;Ancillary  Function Driver,&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt; 由afd.sys 提供的支持Windows Sockets 应用程序的底层驱动程序，其中运行在内核模式下afd.sys 驱动程序主要管理Winsock TCP/IP 通 信）和TCP 都将使用I/O 缓存，因为服务 器读取数据的速度是有限的，相对于CPU 的处理速度而言，I/O 基 本是零字节的吞吐量。 &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 120%;" mce_style=" text-indent: 19pt;  line-height: 120%;"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;3. 基于&lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt;Windows 消 息机制的WSAAsyncSelect 模型能够处理一定的客户连接量，但是扩展性也不是很好。因为 消息泵很快就会阻塞，降低了消息处理的速度。在几次测试中，服务器只能处理大约1/3 的客户端连 接。过多的客户端连接请求都将返回错误提示码WSAECONNREFUSED ，说明服务器不能及时 处理FD_ACCEPT 消息导致连接失败，这样监听队列中待处理的连接请求不致于爆满。然而，通过 上表中的数据可以发现，对那些已经建立的连接，其平均吞吐量也是极低的（即使对于那些对比特率进行了限制的客户也如此）。 &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 120%;" mce_style=" text-indent: 19pt;  line-height: 120%;"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;4. 基于事件通知的&lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt;WSAEventSelect 模 型表现得出奇的不错。在所有的测试中，大多数时候，服务器基本能够处理所有的客户连接，并且保持着较高的数据吞吐量。这种模型的缺点是，每当有一个新连接 时，需要动态管理线程池，因为每个线程只能够等待64 个事件对象。当客户连接量超过64 个后再有新客户接入时，需要创建新的线程。在最后一次测试中，建立起了超过45,000 个的客户连接后，系统响应速度变得非常缓慢。这时由于为处理大规模的客户连接创建了大量的线程，占 用了过多的系统资源。791 个线程基本达到了极限，服务器不能再接受更多的连接了，原因是WSAENOBUFS ：无可用的缓冲区空间，套接字无法创建。另外，客户端程序也达到了极限，不能维持已经建 立的连接。 &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 120%;" mce_style=" text-indent: 19pt;  line-height: 120%;"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;使用事件通知的重叠&lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt;I/O 模型和WSAEventSelect 模型在伸缩性上差不多。这两种模型都依赖于等待事件通知的线程池，处理客户通信 时，大量线程上下文的切换是它们共同的制约因素。重叠I/O 模型和WSAEventSelect 模型的测试结果很相似，都表现得不错，直到线程数量超过极限。 &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 120%;" mce_style=" text-indent: 19pt;  line-height: 120%;"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;5. 最后是针对基于完成端口通知的重叠&lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt;I/O 模 型的性能测试，由上表中数据可以看出，它是所有I/O 模型中性能最佳的。内存使用率（包括用户分页 池和非分页池）和支持的客户连接量与基于事件通知的重叠I/O 模型和WSAEventSelect 模型基本相同。真正不同的地方，在于对CPU 的 占用。完成端口模型只占用了60% 的CPU ， 但是在维持同样规模的连接量时，另外两种模型（基于事件通知的重叠I/O 模型和WSAEventSelect 模型）占用更多的CPU 。 完成端口的另外一个明显的优势是，它维持更大的吞吐量。 &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 120%;" mce_style=" text-indent: 19pt;  line-height: 120%;"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;对以上各种模型进行分析后，可以会发现客户端与服务器数据通信机制本身存在的缺 陷是一个瓶颈。在以上测试中，服务器 被设计成只做简单的回应，即只是将客户端发送过来的数据发送回去。客户端（即使有比特率限制）不停的发送数据给服务器，这导致大量数据阻塞在服务器上与这 个客户端对应的套接字上（无论是TCP 缓冲区还是AFD 的 单套接字缓冲区，它们都是在非分页池上）。在最后三种性能比较好的模型中，同一时间只能执行一个接受输入操作，这意味着在大多数时间，还是有很多数据处于&amp;#8220; 未决&amp;#8221; 状态。可以修改服务器程序使其以异步方式接受 数据，这样一旦有数据达到，需要将数据缓存起来。这种方案的缺点是，当一个客户连续发送数据时，异步接受到了大量的数据。这会导致其他的客户无法接入，因 为调用线程和工作者线程都不能处理其他的事件或完成通知。通常情况下，调用非阻塞异步接收函数，先返回WSAEWOULDBLOCK ， 然后数据间断性的传输，而不采取连续接收的方式。 &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 120%;" mce_style=" text-indent: 19pt;  line-height: 120%;"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;从以上测试结果，可以看出&lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt;WSAEventSelect 模型 和重叠I/O 模型是性能表现最佳的。两种基于事件通知的模型中，创建线程池来等待事件完成通知并作 后续处理是很繁琐的，但是并不影响以它们来架构中型服务器的良好性能。当线程的数量随着客户端连接数量而逐增时，CPU 将 花费大量时间在线程的上下文切换上，这将影响服务器的伸缩性，因为连接量达到一定数量后，便饱和了。完成端口模型提供了最佳的可扩展性，因为CPU 使用率低，其支持的客户连接量相对其他模型最多。&lt;/span&gt;  &lt;/p&gt; &lt;p mce_style="margin: 0cm  0cm 0pt;"&gt;&lt;strong style="font-family: Comic Sans MS;"&gt;I/O &lt;span&gt;模型的选择 &lt;/span&gt; &lt;/strong&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 120%;" mce_style=" text-indent: 19pt;  line-height: 120%;"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;通过上一节对各种模型的测试分析，对于如何挑选最适合自己应用程序的&lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt;I/O 模 型已经很明晰了。同开发一个简单的运行多线程的锁定模式应用相比，其他每种I/O 模型都需要更为复 杂的编程工作。因此，针对客户机和服务器应用开发模型的选择，有以下原则。 &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 120%;" mce_style=" text-indent: 19pt;  line-height: 120%;"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;1.  &lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt;客户端 &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 120%;" mce_style=" text-indent: 19pt;  line-height: 120%;"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;若打算开发一个客户机应用，令其同时管理一个或多个套接字，那么建议采用重叠&lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt;I/O 或WSAEventSelect 模型，以便在一定程度上提升性能。然而，假如开发的是一个以Windows 为基础的应用程序，要进行窗口消息的管理，那么WSAAsyncSelect 模 型恐怕是一种最好的选择，因为WSAAsyncSelect 本身便是从Windows 消息模型借鉴来的。采用这种模型，程序需具备消息处理功能。 &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 120%;" mce_style=" text-indent: 19pt;  line-height: 120%;"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;2.  &lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt;服务器端 &lt;/span&gt; &lt;/p&gt; &lt;p style="text-indent: 19pt; line-height: 120%;" mce_style=" text-indent: 19pt;  line-height: 120%;"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;若开发的是一个服务器应用，要在一个给定的时间，同时控制多个套接字，建议采用 重叠I/O 模型，这同样是从性能角度考虑的。但是，如果服务器在任何给定的时间，都会为大量I/O 请求提供服务，便应考虑使用I/O 完成端口模型， 从而获得更佳的性能。 &lt;/span&gt; &lt;/p&gt; &lt;p mce_style="margin: 0cm  0cm 0pt;"&gt;&lt;strong style="font-family: Comic Sans MS;"&gt;说明： &lt;/strong&gt; &lt;/p&gt; &lt;span&gt; &lt;p style="text-indent: 19pt;" mce_style=" text-indent: 19pt;"&gt;&lt;span style="font-family: Comic Sans MS;"&gt;本文主要译 自&lt;/span&gt;&lt;span style="font-family: Comic Sans MS;"&gt; 《 &lt;/span&gt;&lt;em style="font-family: Comic Sans MS;"&gt;Network programming for microsoft windows  &lt;/em&gt; 》 一书的&lt;span&gt;6.4 节 《服务器策略》。&lt;/span&gt; &lt;/p&gt; &lt;/span&gt; &lt;/div&gt; &lt;/div&gt;&lt;img src="http://www.cnblogs.com/DotCpp/aggbug/1670538.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/DotCpp/archive/2010/02/21/1670538.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/DotCpp/archive/2010/02/02/1661555.html</id><title type="text">关于windows ddk的一些问题</title><summary type="text">一、DDK安装问题  相信很多新手学习驱动开发的时候，DDK安装不好一切都免谈。我在自己的博客 http://hi.baidu.com/anglecloudy/blog/item/9b8d841636c6b84321a4e901.html 里面专门介绍了一下武安河winxp 2000 wdm开发的环境配置。完全可以装我那篇文章里面的软件XP 2600 DDK和Driver Studio 3.2(当...</summary><published>2010-02-02T02:35:00Z</published><updated>2010-02-02T02:35:00Z</updated><author><name>.CPP</name><uri>http://www.cnblogs.com/DotCpp/</uri></author><link rel="alternate" href="http://www.cnblogs.com/DotCpp/archive/2010/02/02/1661555.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/DotCpp/archive/2010/02/02/1661555.html"/></entry></feed>
