﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-春暖花开-文章分类-Window Mobile</title><link>http://www.cppblog.com/SpringSnow/category/7626.html</link><description>雪化了，花开了，春天来了</description><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2009 12:32:32 GMT</lastBuildDate><pubDate>Thu, 23 Apr 2009 12:32:32 GMT</pubDate><ttl>60</ttl><item><title>转:Pocket PC/Smartphone软件安装包之制作DIY</title><link>http://www.cppblog.com/SpringSnow/articles/80876.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Thu, 23 Apr 2009 10:40:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/articles/80876.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/80876.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/articles/80876.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/80876.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/80876.html</trackback:ping><description><![CDATA[摘自:http://blog.csdn.net/dotnet_editor/archive/2005/08/19/459018.aspx<br><strong><br></strong>　　本文来自《msdn开发精选》杂志2005年第4期&#8220;特别策划&#8221;栏目<br><br>
<p class=myheader>作者：RAYMAN</p>
<p>　　当我们开发完Pocket PC或者Smartphone的软件后，都需要考虑如何制作给最终用户使用的软件安装包。专门用于制作安装包的软件有很多，如Install Shield等。但在许多情况下，我们仅仅需要一些比较简单的安装过程，这时候我们完全可以利用SDK中提供的工具和一些免费的软件来制作安装包。另外，我们制作的软件经常会需要在不同的平台下运行，例如笔者开发的一个软件同时支持HPC，PPC，Smartphone等平台，HPC和PPC平台上还有3种CPU类型。如果每一步操作完成后都需要人工介入进行操作的话，每一次构建过程都会相当的繁琐和耗时。所以我们会考虑如何将一系列的操作采用脚本串接起来，只需要运行一个命令就能够生成最终需要的所有安装包。</p>
<h2>用命令行编译链接程序</h2>
<p>　　虽然EVC里提供了Batch Build的功能，但该功能只能用于同一平台的不同CPU版本的编译链接操作。在切换不同平台进行编译时，需要在GUI环境中手工执行，无法达到我们要求。所以我们需要研究如何在命令行状态下进行程序的编译运行。实际上EVC程序本身是提供了一系列的命令可以用于命令行编译的。</p>
<p class=code_p>D:\Program Files\Microsoft eMbedded Tools\Common\EVC\Bin&gt;evc /?<br>Usage:<br>&nbsp;&nbsp;&nbsp; EVC [myprj.vcp|mywksp.vcw] - load project/workspace<br>&nbsp;&nbsp;&nbsp; [&lt;filename&gt;] - load source file<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /? - display usage information<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /EX &lt;macroname&gt; - execute a VBScript macro<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /OUT &lt;filename&gt; - redirect command line output to a file<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /USEENV - ignore tools.options.directories settings<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /MAKE [&lt;target&gt;] [...] - build specified target(s)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;project&gt; - &lt;platform&gt; &lt;configname&gt;]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [[&lt;project&gt;|ALL] - [DEBUG|RELEASE|ALL]]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /CLEAN - delete intermediate files but don't build<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /REBUILD - clean and build<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /NORECURSE - don't build dependent projects<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /CECONFIG [&lt;configuration&gt;] - use specified configuration</p>
<p>　　其中主要是运用MAKE命令。假设我们需要编译的程序名叫做Demo，工作环境文件名为demo.vcw，PPC版的工程项目文件为Demo.vcp，Smartphone版本的项目文件为DemoSP.vcp.我们为EVC3编写好的批处理文件build.bat如下：</p>
<p class=code_p>REM @echo off<br>set EVC="D:\Program Files\Microsoft eMbedded Tools\Common\EVC\Bin\EVC.EXE" &lt;-指向EVC 3.0程序所在目录<br>set CFG=<br>set CECONFIG=<br><br>%EVC% Demo.vcw /make "%CFG%" /CEConfig=%CECONFIG% /rebuild &lt;-执行编译并生成目标可执行文件<br>if errorlevel 1 goto :eof &lt;-如果编译失败则终止批处理<br><br>:pocketpc<br>set CFG=Demo - Win32 (WCE ARM) Release&lt;-将要进行编译的项目名称和编译出来的目标代码的平台和CPU类型。其中&#8220;-&#8221;前面的是项目名称，&#8220;-&#8221;后面的部分是平台和CPU类型以及编译的是Release版还是Debug版。格式可以参照在EVC的Build-&gt;Configurations中的写法, EVC3 和 EVC4的表达方式略有不同。<br>set CECONFIG="Pocket PC" &lt;-编译PPC平台版本<br>%EVC% Demo.vcw /make "%CFG%" /CEConfig=%CECONFIG% /rebuild<br>if errorlevel 1 goto :eof<br><br>set CFG=Demo - Win32 (WCE MIPS) Release<br>%EVC% Demo.vcw /make "%CFG%" /CEConfig=%CECONFIG% /rebuild<br>if errorlevel 1 goto :eof<br><br>set CFG=Demo - Win32 (WCE SH3) Release<br>%EVC% Demo.vcw /make "%CFG%" /CEConfig=%CECONFIG% /rebuild<br>if errorlevel 1 goto :eof<br><br>:sp2002<br>set CFG=DemoSP - Win32 (WCE ARM) Release<br>set CECONFIG="Smartphone 2002" &lt;-编译Smartphone平台版本<br>%EVC% Demo.vcw /make "%CFG%" /CEConfig=%CECONFIG% /rebuild<br>if errorlevel 1 goto :eof<br><br>echo build successfully finished!!<br>pause</p>
<p>　　根据上面的代码，现在我们只需要运行一次build.bat文件即可编译生成PPC，Smartphone等不同平台的目标文件。</p>
<h2>制作cab文件</h2>
<p>　　生成目标文件后，我们就需要考虑如何将程序安装到设备上。cab文件是一种压缩并且带有各种安装信息的打包文件，所有的安装软件实际上都是将软件的cab文件拷贝到相应设备上，然后利用设备上的wceload程序进行最后的设备安装步骤。我们可以使用PocketPC或者Smartphone SDK中附带的cabwiz.exe （在Smartphone上是CabWizSP.exe）对程序进行打包生成cab文件。</p>
<p>　　在制作cab文件之前，我们通常需要做好以下的规划：</p>
<ul>
    <li>程序的详细信息，例如公司名称，程序名称等等
    <li>目标的硬件平台，如PPC还是Smartphone，什么类型的CPU
    <li>有哪些源文件，源文件存放在PC机上面的什么目录中
    <li>拷贝到设备上的文件存放在什么路径下
    <li>是否需要创建快捷方式，快捷方式到什么文件，图标是什么
    <li>是否需要修改注册表，修改项目和内容是什么 </li>
</ul>
<p>　　cab文件的生成需要制作一个.inf文件作为cabwiz程序的输入。当我们做好计划之后就可以动手编写这个.inf文件。这个文件是整个制作过程中最关键的一步，也是最困难的一步。.inf文件与windows里的ini文件十分相似，都是用文本方式保存的，里面包含若干的段（Section）， 关键字（Key）和值（Value）组成的描述信息。我们同样是采用对例子进行解释说明的方式进行介绍。</p>
<p>　　一般来说，inf文件都有四个主要组成部分，PPC的写法和Smartphone的写法略有不同，我们先介绍PPC的写法。</p>
<p>　　inf文件的第一部分是一些全局信息的定义：</p>
<p class=code_p>[Version] &lt;-版本信息，必须有该段<br>Signature = "$Windows NT$" &lt;-必须是$Windows NT$或者$Windows 98$, 不要改动<br>Provider = "Demo Soft" &lt;-提供商, 完整的程序名字会是"&lt;Provider&gt; &lt;AppName&gt;"<br>CESignature = "$Windows CE$" &lt;-必须是该值<br><br>[CEStrings] &lt;-该段主要是定义安装程序用到的一些字符串,必须有该段<br>AppName = "DemoApp" &lt;-程序的名字<br>InstallDir = &#8220;%CE1%\Octopus Studio\%AppName%&#8221; &lt;-定义程序在目标设备中的安装目录<br><br>[Strings] &lt;-该段用于用户自己定义的字符串, 该段可选<br>ExeBaseDir = "C:\ProjectHome\demo\Release\platform" &lt;-和平台相关的文件放在这个目录下<br>CommonDir = "C:\ProjectHome\demo\Release" &lt;-与平台无关的文件放在这个目录里</p>
<p>　　其中InstallDir中出现的&#8220;%CE1%&#8221;是inf文件定义的系统目录标记，下面列出的是PPC 2002和Smartphone 2002下可以使用的目录宏：</p>
<table borderColor=#808080 cellSpacing=0 align=center border=1>
    <tbody>
        <tr>
            <th>目录标记</th>
            <th>目录路径</th>
        </tr>
        <tr>
            <td>%CE1%</td>
            <td>\Program Files</td>
        </tr>
        <tr>
            <td>%CE2%</td>
            <td>\Windows</td>
        </tr>
        <tr>
            <td>%CE4%</td>
            <td>\Windows\StartUp</td>
        </tr>
        <tr>
            <td>%CE5%</td>
            <td>\My Documents</td>
        </tr>
        <tr>
            <td>%CE8%</td>
            <td>\Program Files\Games</td>
        </tr>
        <tr>
            <td>%CE11%</td>
            <td>\Windows\Start Menu\Programs</td>
        </tr>
        <tr>
            <td>%CE14%</td>
            <td>\Windows\Start Menu\Programs\Games</td>
        </tr>
        <tr>
            <td>%CE15%</td>
            <td>\Windows\Fonts</td>
        </tr>
        <tr>
            <td>%CE17%</td>
            <td>\Windows\Start Menu</td>
        </tr>
        <tr>
            <td>%CE19%</td>
            <td>\Application Data（仅用于Smartphone)</td>
        </tr>
    </tbody>
</table>
<p>　　这些目录标记在进行安装的时候会替换成相应的系统目录路径。此外这些系统目录在安装过程中会自动根据需要进行自动调节。例如%CE1%是指系统缺省的程序安装目录，指向&#8220;\Program Files&#8221;。而当用户选择程序安装在存储卡中时，该目录也会做相应改变。</p>
<p>　　[CEString]和[Strings]中定义的变量以及上面提到的目录标记可以用于替换inf文件中的任意部分。下面的说明中会有使用的例子。</p>
<p>　　第二部分是用来声明支持的设备CPU类型，操作系统类型和版本号要求：</p>
<p class=code_p>[CEDevice.ARM] &lt;-目标设备声明，如果支持多种设备/CPU就会有多个CEDevice段，并且在用设备标号作为后缀表示。如果只支持一种设备，可以直接用[CEDevice]表示<br>ProcessorType = 2577 &lt;-该目标设备是StrongARM CPU<br>UnsupportedPlatforms = &#8220;Smartphone&#8221;,"HPC","Jupiter","Palm PC2" &lt;-不支持smarthphone和HPC等旧设备<br>VersionMin = 3.00 &lt;-对应设备德操作系统的最低版本号要求是3.0,版本号说明见下面的说明<br>VersionMax = 5.00 &lt;-假设我们的程序要求的操作系统最高版本号是5.0<br><br>[CEDevice.MIPS]<br>ProcessorType = 4000 &lt;-CPU要求是 MIPS_R4000<br>UnsupportedPlatforms = &#8220;Smartphone&#8221;,"HPC","Jupiter","Palm PC2"<br>VersionMin = 3.00<br>VersionMax = 5.00<br><br>[CEDevice.SH3]<br>ProcessorType = 10003 &lt;- CPU要求是 Hitachi_SH3<br>UnsupportedPlatforms = &#8220;Smartphone&#8221;,"HPC","Jupiter","Palm PC2"<br>VersionMin = 3.00<br>VersionMax = 5.00</p>
<p>　　WinCE各个平台的表示法和相应的版本号如下表，UnsupportedPlatform和VersionMin/VersionMax的值可以参考该表进行填写。</p>
<table borderColor=#808080 cellSpacing=0 align=center border=1>
    <tbody>
        <tr>
            <th>Platform</th>
            <th>Platform type</th>
            <th>Windows CE version</th>
        </tr>
        <tr>
            <td>Smartphone 2003</td>
            <td>Smartphone</td>
            <td>4.2</td>
        </tr>
        <tr>
            <td>Smartphone 2002</td>
            <td>Smartphone</td>
            <td>3.0</td>
        </tr>
        <tr>
            <td>Pocket PC 2003</td>
            <td>Pocket PC</td>
            <td>4.2</td>
        </tr>
        <tr>
            <td>Pocket PC 2002</td>
            <td>Pocket PC</td>
            <td>3.0</td>
        </tr>
        <tr>
            <td>Pocket PC 2000</td>
            <td>Palm PC2</td>
            <td>3.0</td>
        </tr>
        <tr>
            <td>Palm Size PC v2</td>
            <td>Palm PC</td>
            <td>2.11</td>
        </tr>
        <tr>
            <td>Palm Size PC v1</td>
            <td>Palm PC</td>
            <td>2.1</td>
        </tr>
        <tr>
            <td>Handheld PC 2000</td>
            <td>Jupiter</td>
            <td>3.0</td>
        </tr>
        <tr>
            <td>Handheld PC Pro</td>
            <td>Jupiter</td>
            <td>2.11</td>
        </tr>
        <tr>
            <td>Handheld PC</td>
            <td>HPC</td>
            <td>2.0</td>
        </tr>
    </tbody>
</table>
<p>　　inf文件的第三部分是定义源文件的组成和其在桌面机器的目录：</p>
<p class=code_p>[SourceDisksNames] &lt;-源文件所在目录，段名称不加后缀表示与平台无关的文件所在目录.必须有该段<br>1=, "SourceDisk01",,%CommonDir% &lt;-格式为 &lt;source ID&gt; = ,&lt;label&gt;,,&lt;source directory&gt;其中Source ID用来在后续内容中指定源文件目录用，label只是说明，无用处。Source directory则是指源文件在PC系统中的所在目录。<br><br>[SourceDisksNames.ARM] &lt;-段名称的后缀与前面的CEDevice段相对应<br>2=, "SourceDisk02",,%ExeBaseDir%\ppc\arm<br><br>[SourceDisksNames.MIPS]<br>2=, "SourceDisk03",,%ExeBaseDir%\ppc\mips<br><br>[SourceDisksNames.SH3]<br>2=, "SourceDisk04",,%ExeBaseDir%\ppc\sh3<br><br>[SourceDisksFiles] &lt;-说明源文件分别放在什么目录下,必须有该段<br>"demo.htm" = 1 &lt;- 格式为&lt;filename&gt; = &lt;source ID&gt;,其中filename是文件名，Source ID是指上面SourceDiskName中定义的源目录ID.&#8220;demo.htm&#8221;=1表示demo.htm文件是放在SourceDiskNames里定义的%CommonDir%目录里。<br>"demo.exe" = 2<br>"demo.dll" = 2</p>
<p>　　inf文件的第四部分是定义安装的操作</p>
<p class=code_p>[DefaultInstall] &lt;-指明安装包需要进行的操作，例如文件拷贝，快捷方式创建等。必须有该段<br>CopyFiles = Files.InstallDir, Files.Windows &lt;-指明需要进行文件拷贝的说明段，参看下面的说明<br>CEShortcuts = Links &lt;-指定需要生成的快捷方式定义. 除了这连个安装操作外，开发人员还可以指定注册表修改(AddReg), 自定的安装/卸载时的可执行代码(CESetupDLL), 注册DLL文件(CESelfRegister).具体可以参考SDK帮助文件<br><br>[Files.InstallDir] &lt;-文件拷贝操作中指明的文件拷贝操作定义,用于定义每个文件如何被拷贝到设备上<br>"demo.htm",,,0x40000001 &lt;- 格式为&lt;dest filename&gt;,&lt;source filename&gt;,,&lt;copy flags&gt;, 其中dest filename 表示拷贝到目标设备后文件名; source filename源文件的文件名，如果为空则dest filename用来表示源文件文件名;copy flags表示拷贝文件时的方式,该值是一些标志位的组合，可用的标志如下：</p>
<table borderColor=#808080 cellSpacing=0 align=center border=1>
    <tbody>
        <tr>
            <th>标志</th>
            <th>含义</th>
        </tr>
        <tr>
            <td>0x00000001</td>
            <td>警告用户如果在拷贝该文件时发生错误, 而用户采用跳过操作的话</td>
        </tr>
        <tr>
            <td>0x00000002</td>
            <td>不允许用户在拷贝该文件时发生错误才取跳过操作</td>
        </tr>
        <tr>
            <td>0x00000010</td>
            <td>当目标目录中有同名文件存在时不进行覆盖操作</td>
        </tr>
        <tr>
            <td>0x00000400</td>
            <td>当目标目录存在同名文件时才进行拷贝（覆盖）操作</td>
        </tr>
        <tr>
            <td>0x20000000</td>
            <td>如果目标文件比该文件新则不进行拷贝操作</td>
        </tr>
        <tr>
            <td>0x40000000</td>
            <td>拷贝文件时不检查文件日期</td>
        </tr>
        <tr>
            <td>0x80000000</td>
            <td>创建一个对该文件的链接，主要是用于共享dll文件</td>
        </tr>
    </tbody>
</table>
<p class=code_p>"demo.exe",,,0x40000003<br><br>[Files.Windows] &lt;-同上，用户定义文件拷贝操作<br>"demo.dll",,,0x80000013<br><br>[DestinationDirs] &lt;-定义设备上的目标文件目录<br>Files.InstallDir = 0,%InstallDir% &lt;- 格式为&lt;section name&gt; = 0,&lt;dest directory&gt;, 其中section name 对应[DefaultInstall] CopyFiles中的值。dest directory则是目标设备上的目的目录。例如Files.InstallDir里列出的文件将会拷贝到目标设备的%InstallDir%目录下。<br>Files.Windows = 0, %CE2%<br>Links = 0, %CE11%<br><br>[Links] &lt;- 该段对应[DefaultInstall]中CEShortcuts的定义，用来说明需要创建的快捷方式<br>%AppName%,0,"demo.exe",%CE11% &lt;- 格式为&lt;shortcut filename&gt;,&lt;shortcut type&gt;,&lt;target file/path&gt;,&lt;standard dest path&gt;。其中 shortcut filename是指生成的快捷方式的文件名; shortcut type 指明链接的是文件名还是目录,0表示文件，非0表示目录; target file/path 是指被链接的文件的文件名或者目录路径; standard dest path 指快捷方式存放在那个目录下。</p>
<p>　　以上是针对PPC的inf文件写法。由于PPC支持多种的CPU所以比较复杂一些，而Smartphone目前实际上目前只支持一种CPU类型，所以我们可以对inf文件进行简化。其中文件的第1和第4部分的内容还是和PPC一样。而第2和第3部分则可以简化成：</p>
<p class=code_p>[CEDevice]<br>ProcessorType = 2577<br>UnsupportedPlatforms = &#8220;Pocket PC&#8220;,"HPC","Jupiter","Palm PC2" &lt;-不支持PPC和HPC等设备<br>VersionMin = 3.00<br>VersionMax = 5.00<br><br>[SourceDisksNames]<br>1=, "SourceDisk01",,%CommonDir%<br>2=, "SourceDisk02",,%ExeBaseDir%\sp<br><br>[SourceDisksFiles]<br>"demo.htm" = 1 <br>"demo.exe" = 2<br>"demo.dll" = 2</p>
<p>　　把以上四个部分拼成一个文件就是一个完整的inf文件了。制作完inf文件后，我们就可以使用cabwiz.exe文件来生成.cab文件。该命令的语法如下：</p>
<p class=code_p>cabwiz.exe "inf_file" <br>[/dest dest_directory] <br>[/err error_file] <br>[/cpu cpu_type [cpu_type]] </p>
<p>　　参数的含义为：</p>
<p class=code_p>inf_file &#8211; 指向inf文件的全路径 <br>dest_directory &#8211; 生成的cab文件的存放路径，如不指定则生成在inf文件所在目录<br>error_file &#8211; 错误报告文件，将所有的执行信息都输出到该文件。不指定该参数时，所有的错误信息都会用消息框来显示。该参数主要用于自动化构建<br>cpu_type &#8211; 指定需要生成的CPU类型，需要与inf文件中定义的CEDevice段的后缀一致。可以同时指定多个CPU类型</p>
<p>　　假设我们前面例子中的inf文件名为demo.inf文件。则对应的执行命令为：</p>
<p class=code_p>cabwiz demo.inf /err buildppc.err /cpu ARM MIPS SH3</p>
<p>　　这样就会生成 demo.arm.cab, demo.mips.cab, demo.sh3.cab 三个文件，分别对应3种不同的CPU（平台）的安装文件。</p>
<h2>制作自动安装执行文件</h2>
<p>　　生成了cab文件并不意味着大功告成。虽然用户可以手工将cab文件拷贝到设备上安装，但这样需要用户自己懂得区分CPU类型等许多的专业知识。所以我们通常都会进一步生成一个可执行的自动化安装包，达到傻瓜化安装的目的。如果你的安装过程比较简单的话，可以使用Spb Software House（<a href="http://www.spbsoftwarehouse.com/" target=_blank><font color=#336699>http://www.spbsoftwarehouse.com</font></a>）公司提供的免费软件ezsetup进行可执行安装文件的制作。该软件生的安装程序功能比较简单：显示产品信息和软件授权协议，然后安装cab文件。虽然功能比较少，但大部分的PPC/Smartphone软件的安装过程也只需要这几个功能就足够了。</p>
<p>　　首先我们需要制作一个demo.ini文件。该文件的格式很简单，PPC和Smartphone对应的格式都一样。例子如下：</p>
<p class=code_p>[CEAppManager]<br>Version = 1.0 &lt;- 这个是CeAppMgr程序的版本号，不是要安装的软件的版本号,不必修改<br>Component = Demo &lt;- 软件的模块,与下面的段的名称一致<br><br>[Demo]<br>Description = Demo App For PPC &lt;- 软件的描述<br>CabFiles = demo.arm.cab,demo.mips.cab,demo.sh3.cab &lt;-列出需要所有的cab文件，注意文件名之间不要有空格</p>
<p>　　ezsetup程序是一个命令行运行的程序，这可以方便我们进行自动化构建。命令的使用方法如下：</p>
<p class=code_p>ezsetup &lt;-l language&gt; &lt;-i inifilename&gt; &lt;-r readme.txt&gt; <br>&lt;-e eula.txt&gt; &lt;-o outputexe&gt;<br><br>-l language 是指定安装过程中使用的语言，暂时不支持中文，所以我们选English<br>-i inifilename ini文件的全路径<br>-r readme.txt readme文件的全路径，用于在安装过程中显示给用户<br>-e eula.txt最终用户授权协议文件的全路径，用于安装过程中授权协议界面的显示<br>-o outputexe 生成的exe文件的名称</p>
<p>　　我们可以用下面的命令来生成可执行安装文件:</p>
<p class=code_p>ezsetup -l english -i demo.ini -r Readme.txt -e License.txt -o demo_setup.exe</p>
<h2>自动化构建</h2>
<p>　　前面分别介绍了如何在命令行编译链接目标程序，制作cab文件，以及生成自动化安装程序。这些步骤都是可以通过命令行方式执行的，所以我们可以把这些命令在批处理脚本中串接起来制作自动化构建脚本。这样我们就可以&#8220;一键&#8221;完成从代码编译到生成最终可执行安装包的全过程。</p>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/80876.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2009-04-23 18:40 <a href="http://www.cppblog.com/SpringSnow/articles/80876.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转:Windows Mobile，DMProcessConfigXML 使用实例 </title><link>http://www.cppblog.com/SpringSnow/articles/80625.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Tue, 21 Apr 2009 08:50:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/articles/80625.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/80625.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/articles/80625.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/80625.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/80625.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 摘自:http://www.cnblogs.com/biosli/articles/1414259.htmlWindows Mobile，DMProcessConfigXML 使用实例 最近遇到了创建连接点的问题(飞信就能自己创建来着)，到网上搜罗了一下解决方法。这里总结一下：这些方法主要是针对函数DMProcessConfigXML里面的第一个参数来的，函数的具体使用方法参见...&nbsp;&nbsp;<a href='http://www.cppblog.com/SpringSnow/articles/80625.html'>阅读全文</a><img src ="http://www.cppblog.com/SpringSnow/aggbug/80625.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2009-04-21 16:50 <a href="http://www.cppblog.com/SpringSnow/articles/80625.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：Windows高级程序设计</title><link>http://www.cppblog.com/SpringSnow/articles/76304.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Thu, 12 Mar 2009 02:21:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/articles/76304.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/76304.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/articles/76304.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/76304.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/76304.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转自：http://www.cic.tsinghua.edu.cn/jdx/book4/dlz.htm&#160;第六章&nbsp;Windows高级程序设计&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本节介绍Windows高级程序设计技术，掌握了这些技术，用户就可以开发较为大型的应用程序，并且能够使用Windows标准的网络程序接口进行网络程序设计了。本...&nbsp;&nbsp;<a href='http://www.cppblog.com/SpringSnow/articles/76304.html'>阅读全文</a><img src ="http://www.cppblog.com/SpringSnow/aggbug/76304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2009-03-12 10:21 <a href="http://www.cppblog.com/SpringSnow/articles/76304.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 转:MultiByteToWideChar和WideCharToMultiByte用法详解收藏</title><link>http://www.cppblog.com/SpringSnow/articles/73315.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Mon, 09 Feb 2009 09:10:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/articles/73315.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/73315.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/articles/73315.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/73315.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/73315.html</trackback:ping><description><![CDATA[//========================================================================<br>//TITLE:<br>//&nbsp;&nbsp;&nbsp; MultiByteToWideChar和WideCharToMultiByte用法详解<br>//AUTHOR:<br>//&nbsp;&nbsp;&nbsp; norains<br>//DATE:<br>//&nbsp;&nbsp;&nbsp; 第一版:Monday&nbsp; 25-December -2006<br>//&nbsp;&nbsp;&nbsp; 增补版:Wednesday 27-December -2006<br>//&nbsp;&nbsp;&nbsp; 修订版:Wednesday 14-March-2007 (修正之前的错误例子)<br>//&nbsp;&nbsp;&nbsp; 再次修订版:Tuesday 18-September-2007 (修正代码的参数错误)<br>//Environment:<br>//&nbsp; EVC4.0 + Standard SDK<br>//========================================================================<br>&nbsp; <br>1.使用方法详解<br><br>&nbsp; 在本文开始之处,先简要地说一下何为短字符和宽字符.<br>&nbsp; 所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码.而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE.关于windows下的ASCII和UNICODE的更多信息,可以参考这两本经典著作:《windows 程序设计》,《windows 核心编程》.这两本书关于这两种字符都有比较详细的解说.<br>&nbsp; <br>&nbsp; 宽字符转换为多个短字符是一个难点,不过我们只要掌握到其中的要领,便可如鱼得水.<br>&nbsp; 好吧,那就让我们开始吧.<br>&nbsp; <br>&nbsp; 这个是我们需要转化的多字节字符串: &nbsp;<br>&nbsp; char sText[20] = {"多字节字符串!OK!"};<br>&nbsp; <br>&nbsp; 我们需要知道转化后的宽字符需要多少个数组空间.虽然在这个里程里面,我们可以直接定义一个20*2宽字符的数组,并且事实上将运行得非常轻松愉快.但假如多字节字符串更多,达到上千个乃至上万个,我们将会发现其中浪费的内存将会越来越多.所以以多字节字符的个数的两倍作为宽字符数组下标的声明绝对不是一个好主意.<br>&nbsp; 所幸,我们能够确知所需要的数组空间.<br>&nbsp; 我们只需要将MultiByteToWideChar()的第四个形参设为-1,即可返回所需的短字符数组空间的个数:<br>&nbsp; DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, sText, -1, NULL, 0);<br>&nbsp; <br>&nbsp; 接下来,我们只需要分配响应的数组空间:<br>&nbsp; wchar_t *pwText;<br>&nbsp; pwText = new wchar_t[dwNum];<br>&nbsp; if(!pwText)<br>&nbsp; {<br>&nbsp;&nbsp; delete []pwText;<br>&nbsp; }<br>&nbsp; <br>&nbsp; 接着,我们就可以着手进行转换了.在这里以转换成ASCII码做为例子:<br>&nbsp; MultiByteToWideChar (CP_ACP, 0, sText, -1, pwText, dwNum);<br>&nbsp; <br>&nbsp; 最后,使用完毕当然要记得释放占用的内存:<br>&nbsp; delete []pwText;<br>&nbsp; <br>&nbsp;<br>&nbsp; 同理,宽字符转为多字节字符的代码如下: &nbsp;<br>&nbsp; wchar_t wText[20] = {L"宽字符转换实例!OK!"};<br>&nbsp; DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,wText,-1,NULL,0,NULL,FALSE);<br>&nbsp; char *psText;<br>&nbsp; psText = new char[dwNum];<br>&nbsp; if(!psText)<br>&nbsp; {<br>&nbsp;&nbsp; delete []psText;<br>&nbsp; }<br>&nbsp; WideCharToMultiByte (CP_OEMCP,NULL,wText,-1,psText,dwNum,NULL,FALSE);<br>&nbsp; delete []psText;<br>&nbsp; <br>&nbsp;&nbsp; 如果之前我们已经分配好空间,并且由于字符串较短,可以不理会浪费的空间,仅仅只是想简单地将短字符和宽字符相互转换,那有没有什么简便的方法呢?<br>&nbsp;&nbsp; WIN32 API里没有符合这种要求的函数,但我们可以自己进行封装:<br>&nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp; //-------------------------------------------------------------------------------------<br>&nbsp; //Description:<br>&nbsp; // This function maps a character string to a wide-character (Unicode) string<br>&nbsp; //<br>&nbsp; //Parameters:<br>&nbsp; // lpcszStr: [in] Pointer to the character string to be converted <br>&nbsp; // lpwszStr: [out] Pointer to a buffer that receives the translated string. <br>&nbsp; // dwSize: [in] Size of the buffer<br>&nbsp; //<br>&nbsp; //Return Values:<br>&nbsp; // TRUE: Succeed<br>&nbsp; // FALSE: Failed<br>&nbsp; // <br>&nbsp; //Example:<br>&nbsp; // MByteToWChar(szA,szW,sizeof(szW)/sizeof(szW[0]));<br>&nbsp; //---------------------------------------------------------------------------------------<br>&nbsp; BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; // Get the required size of the buffer that receives the Unicode <br>&nbsp;&nbsp;&nbsp; // string. <br>&nbsp;&nbsp;&nbsp; DWORD dwMinSize;<br>&nbsp;&nbsp;&nbsp; dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0);<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; if(dwSize &lt; dwMinSize)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; <br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp;&nbsp; // Convert headers from ASCII to Unicode.<br>&nbsp;&nbsp;&nbsp; MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize); &nbsp;<br>&nbsp;&nbsp;&nbsp; return TRUE;<br>&nbsp; }<br>&nbsp; <br>&nbsp; //-------------------------------------------------------------------------------------<br>&nbsp; //Description:<br>&nbsp; // This function maps a wide-character string to a new character string<br>&nbsp; //<br>&nbsp; //Parameters:<br>&nbsp; // lpcwszStr: [in] Pointer to the character string to be converted <br>&nbsp; // lpszStr: [out] Pointer to a buffer that receives the translated string. <br>&nbsp; // dwSize: [in] Size of the buffer<br>&nbsp; //<br>&nbsp; //Return Values:<br>&nbsp; // TRUE: Succeed<br>&nbsp; // FALSE: Failed<br>&nbsp; // <br>&nbsp; //Example:<br>&nbsp; // MByteToWChar(szW,szA,sizeof(szA)/sizeof(szA[0]));<br>&nbsp; //---------------------------------------------------------------------------------------<br>&nbsp; BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize)<br>&nbsp; {<br>&nbsp;&nbsp; DWORD dwMinSize;<br>&nbsp;&nbsp; dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);<br>&nbsp;&nbsp; if(dwSize &lt; dwMinSize)<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; return FALSE;<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,lpszStr,dwSize,NULL,FALSE);<br>&nbsp;&nbsp; return TRUE;<br>&nbsp; }<br>&nbsp; <br>&nbsp; <br>&nbsp; 使用方法也很简单,示例如下:<br>&nbsp; wchar_t wText[10] = {L"函数示例"};<br>&nbsp; char sText[20]= {0};<br>&nbsp; WCharToMByte(wText,sText,sizeof(sText)/sizeof(sText[0]));<br>&nbsp; MByteToWChar(sText,wText,sizeof(wText)/sizeof(wText[0]));<br>&nbsp; <br>&nbsp; 这两个函数的缺点在于无法动态分配内存,在转换很长的字符串时可能会浪费较多内存空间;优点是,在不考虑浪费空间的情况下转换较短字符串非常方便.<br><br>&nbsp; <br>2.MultiByteToWideChar()函数乱码的问题<br><br>&nbsp; 有的朋友可能已经发现,在标准的WinCE4.2或WinCE5.0 SDK模拟器下,这个函数都无法正常工作,其转换之后的字符全是乱码.及时更改MultiByteToWideChar()参数也依然如此.<br>&nbsp; 不过这个不是代码问题,其结症在于所定制的操作系统.如果我们定制的操作系统默认语言不是中文,也会出现这种情况.由于标准的SDK默认语言为英文,所以肯定会出现这个问题.而这个问题的解决,不能在简单地更改控制面板的"区域选项"的"默认语言",而是要在系统定制的时候,选择默认语言为"中文".<br>&nbsp; 系统定制时选择默认语言的位置于:<br>&nbsp; Platform -&gt; Setting... -&gt; locale -&gt; default language ,选择"中文",然后编译即可.<br><br>摘自:<br><a href="http://blog.csdn.net/norains/archive/2006/12/25/1461174.aspx">http://blog.csdn.net/norains/archive/2006/12/25/1461174.aspx</a>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/73315.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2009-02-09 17:10 <a href="http://www.cppblog.com/SpringSnow/articles/73315.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不解的多语言</title><link>http://www.cppblog.com/SpringSnow/articles/67258.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Wed, 19 Nov 2008 01:58:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/articles/67258.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/67258.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/articles/67258.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/67258.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/67258.html</trackback:ping><description><![CDATA[<a href="http://forums.microsoft.com/msdn/showpost.aspx?postid=2486338&amp;siteid=1">http://forums.microsoft.com/msdn/showpost.aspx?postid=2486338&amp;siteid=1</a><br><br>在论坛上看到的一篇帖子，也是关于多语言的，未尝试过mfc上的多语言，暂且记录下来，以备参考。<br><br><span>Hi,<br>I'm trying to localize my English Windows Mobile 5.0 MFC application using mui dlls / satellite dlls but haven't got it to work.<br>I have read several instruction, have looked at the MuiHello example (Smartphone SDK) and Googled, but to no help.<br>To test, I create a Swedish resource dll/mui file with one resource item changed.<br><br>I'm not really sure if the technique used in <a title=http://msdn2.microsoft.com/EN-US/library/ms881385.aspx href="http://msdn2.microsoft.com/EN-US/library/ms881385.aspx"><u><font color=#0000ff>MuiHello</font></u></a> can be appliced on MFC applications or not.<br><br>I have named the out put file for my dll project to MyApp.exe.04d1.mui and placed it in the exe directory of the application.<br>When I execute the application (MyApp.exe) in a Smartphone with user language set to Swedish, the swedish resource is not loaded.<br>Originally I made resource-only dlls with no entry point but as the sample MuiHello has an entry point I have also tried to add this.<br><br>I have also tried out the things found <a title=http://msdn2.microsoft.com/en-us/library/8fkteez0%28VS.80%29.aspx href="http://msdn2.microsoft.com/en-us/library/8fkteez0(VS.80).aspx"><u><font color=#0000ff>here, "Localized Resources in MFC Applications: Satellite DLLs"</font></u></a><br>but with no success.<br>I have tried out the following:<br>
<ul>
    <li>Named my resource-only dll to MyAppSVE.dll, place it in the same directory as the exe.
    <li>Extracting the English resources from the exe and placed them in a resource-only dll named, MyRes.dll. Renamed the resource-only Swedish resource dll to MyResSVE.dll. Used LoadLibrary("MyRes.dll") and AfxSetResourceHandle to set the resource instance. <br></li>
</ul>
The result is the same, the Swedish resource is not loaded.<br><br>If I explicitly load the Swedish resource dll and use AfxSetResourceHandle it works, but that is not just good enough.<br><br>I have checked that the GetUserDefaultUILanguage() returns 0x04d1(Swedish)<br><br>Been stuck with this for two days now and getting really frustrated.<br><br>Does anyone know what I am doing wrong or how to do it in MFC?<br>Any pointers and directions are appreciated.<br><br>Cheers <br>Martin<br><br><span>&nbsp;
<p>Hi again,</p>
<p align=left>I'm still unable to get the correct resource dll to load.</p>
<p align=left>Instead I implemented the app so that it dynamically loaded the correct localized resoures.</p>
<p align=left>I implemeted it in a way so the I can choose to localize on Locale (sub language &amp; primary language) or primary language.</p>
<p align=left>&nbsp;</p>
<p align=left>
<div class=codeseg>
<div class=codecontent>
<div class=codesniptitle><span style="WIDTH: 100%">Code Block</span></div>
<p align=left>HINSTANCE g_hInst;</p>
<font size=2>
<p align=left>HINSTANCE GetResHInstFormLangId(LANGID langId)</p>
<p align=left>{</p>
<blockquote dir=ltr style="MARGIN-RIGHT: 0px">
<p align=left>CString resDllName;</p>
<p align=left>resDllName.Format(_T(</font><font color=#a31515 size=2>"res%04x.dll"</font><font size=2>), langId);</p>
<p align=left>HINSTANCE hInst = LoadLibrary(resDllName);</p>
<p align=left></font><font color=#0000ff size=2>if</font><font size=2>(!hInst)</p>
<p align=left>{</p>
<blockquote dir=ltr style="MARGIN-RIGHT: 0px">
<p align=left>LANGID priLangId = PRIMARYLANGID(langId);</p>
</font><font size=2>
<p align=left>resDllName.Format(_T(</font><font color=#a31515 size=2>"res%02x.dll"</font><font size=2>), priLangId);</p>
<p align=left>hInst = LoadLibrary(resDllName);</p>
</blockquote>
<p align=left>}</p>
<p align=left></font><font color=#0000ff size=2>return</font><font size=2> hInst;</p>
</blockquote>
<p align=left>}</p>
<p align=left>&nbsp;</p>
<font size=2>
<p align=left>BOOL ClocalizedApp::InitInstance()</p>
<p align=left>{</p>
</font><font color=#0000ff size=2>
<p dir=ltr align=left>#if</font><font size=2> </font><font color=#0000ff size=2>defined</font><font size=2>(WIN32_PLATFORM_PSPC) || </font><font color=#0000ff size=2>defined</font><font size=2>(WIN32_PLATFORM_WFSP)</p>
<blockquote dir=ltr style="MARGIN-RIGHT: 0px"></font><font size=2>
<p align=left>SHInitExtraControls();</p>
</font><font color=#0000ff size=2></blockquote>
<p dir=ltr align=left>#endif</font><font size=2> </font><font color=#008000 size=2>// WIN32_PLATFORM_PSPC || WIN32_PLATFORM_WFSP</p>
<blockquote dir=ltr style="MARGIN-RIGHT: 0px"></font><font size=2>
<p align=left>SetRegistryKey(_T(</font><font color=#a31515 size=2>"Local AppWizard-Generated Applications"</font><font size=2>));</p>
<p align=left></font><font color=#008000 size=2>//Home made localization support</p>
</font><font size=2>
<p align=left>LANGID userLangId = GetUserDefaultUILanguage();</p>
<p align=left>g_hInst&nbsp;= GetResHInstFormLangId(userLangId);</p>
<p align=left></font><font color=#0000ff size=2>if</font><font size=2>(!g_hInst&nbsp;)</p>
<p align=left>{</p>
<blockquote dir=ltr style="MARGIN-RIGHT: 0px">
<p align=left>sysLangId = GetSystemDefaultUILanguage();</p>
<p align=left>if(userL</font></font>andId != sysLangId)</p>
<font size=2><font size=2>
<blockquote dir=ltr style="MARGIN-RIGHT: 0px">
<p align=left>g_hInst&nbsp;= GetResHInstFormLangId(sysLangId);</p>
</blockquote></blockquote>
<p align=left>}</p>
<p align=left></font><font color=#0000ff size=2>if</font><font size=2>(g_hInst)</p>
<blockquote dir=ltr style="MARGIN-RIGHT: 0px">
<p align=left>AfxSetResourceHandle(g_hInst);</p>
</blockquote>
<p align=left>ClocalizedDlg dlg;</p>
<p align=left>m_pMainWnd = &amp;dlg;</p>
<p align=left>INT_PTR nResponse = dlg.DoModal();</p>
<p align=left></font><font color=#0000ff size=2>if</font><font size=2> (nResponse == IDOK)</p>
<p align=left>{</p>
</font><font size=2>
<p align=left>}</p>
</font><font size=2>
<p align=left></font><font color=#0000ff size=2>return</font><font size=2> FALSE;</p>
</blockquote>
<p align=left>}</p>
</font></font>
<p align=left>&nbsp;</p>
</div>
</div>
<p align=left>&nbsp;</p>
<p>&#160;</p>
<font size=2><font size=2>
<p align=left></p>
<p>&nbsp;</p>
<p align=left>The drawback is of cause the all resource must be included in all localized resource dlls.</p>
<p align=left>If anyone has the solution to the previous thread post please respond.</p>
<p align=left>&nbsp;</p>
<p align=left>/</p>
<p align=left>Martin</p>
<p align=left></font></font></p>
<span>Hi once again,<br><br>Spent a too long time on this until I realized my misstake.<br>Oh God such a simple one.<br><br>In a application code created with the application wizard the virtual CWinApp::InitInstance is never called.<br>If one have a look at the implementation of CWinApp::InitInstance, one can see that it is here where the loading of the resoure dlls are made.<br><br>Simply put the localized dll in the same directory as the exe. <br>If my exe is called myApp.exe, my resource dll for the swedish locale is myAppSVE.dll.<br>In the InitInstance override function call CWinApp::InitInstance.<br><br>As far as I can see CWinApp::InitInstance does not do anything but trying to load localized resources.<br><br>Don't forget to call CWinApp::ExitInstance from any ExitInstance override, this frees the resource dll.<br>(Oh no not again, I answered my own Question)<br>Thanks Martin<br></span></span></span>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/67258.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2008-11-19 09:58 <a href="http://www.cppblog.com/SpringSnow/articles/67258.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：基于Windows CE的嵌入式系统开发流程 </title><link>http://www.cppblog.com/SpringSnow/articles/65419.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Tue, 28 Oct 2008 15:31:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/articles/65419.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/65419.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/articles/65419.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/65419.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/65419.html</trackback:ping><description><![CDATA[<h2><a id=viewpost1_TitleUrl href="http://www.cppblog.com/milkyway/archive/2008/10/28/65397.html"><font color=#2e9ce9 size=3>基于Windows CE的嵌入式系统开发流程</font></a> </h2>
&nbsp;
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 嵌入式系统的设计是使用一组物理硬件和软件来完成所需功能的过程，所以在一个嵌入式系统的设计过程中，软件设计和硬件设计是紧密结合、相互协调的</span><span>。在设计时，从系统功能的实现出发，要把软硬件同时考虑进去。</span><span>一个基于</span><span>Windows CE</span><span>的嵌入式系统开发的主要内容</span><span>有：</span></p>
<p><span>（</span><span>1</span><span>）设计系统硬件。</span></p>
<p><span>（</span><span>2</span><span>）将</span><span>Windows CE</span><span>操作系统移植到目标硬件平台上。</span></p>
<p><span>（</span><span>3</span><span>）建立交叉调试通道，编写和调试应用程序代码。<br></span></p>
<p><span>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 我们可以用下图</span><span>来描述具体的开发流程：</span></p>
<p>&nbsp;&nbsp;&nbsp; <img height=538 alt="" src="http://www.cppblog.com/images/cppblog_com/milkyway/wincede.jpg" width=512 border=0><br><br clear=all><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图 </span><span>&nbsp;</span><span>基于</span><span>Windows CE</span><span>的嵌入式系统开发流程</span></p>
<p><span></span>&nbsp;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;基于</span><span>Windows CE</span><span>的软件开发模式比较统一，通常使用</span><span>Platform Builder</span><span>定制出针对特定硬件平台的操作系统映像文件</span><span>NK.bin</span><span>，使用</span><span>Embedded VC++</span><span>或</span><span>Visual Stidio.net</span><span>开发上层的应用软件。嵌入式</span><span>系统层软件开发过程对应于</span><span>Windows CE</span><span>操作系统在目标硬件平台上的移植和定制过程，嵌入式</span><span>应用层软件的实现即</span><span>Windows CE</span><span>应用程序的开发过程。<br><br>转自：<a href="http://www.cppblog.com/milkyway/archive/2008/10/28/65397.html">http://www.cppblog.com/milkyway/archive/2008/10/28/65397.html</a><br><br>自己做mobile开发的，对于wce不是很了解。收藏下来，学习学习。<br></span></p>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/65419.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2008-10-28 23:31 <a href="http://www.cppblog.com/SpringSnow/articles/65419.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何获取和设置蓝牙无线电的状态</title><link>http://www.cppblog.com/SpringSnow/articles/57069.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Thu, 24 Jul 2008 09:29:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/articles/57069.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/57069.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/articles/57069.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/57069.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/57069.html</trackback:ping><description><![CDATA[<p>蓝牙无线电有打开、关闭、可发现三种状态，那么我们如何实现编程控制呢？</p>
<p>蓝牙设备的三种状态<br><strong>enum BTH_RADIO_MODE {<br>&nbsp; BTH_POWER_OFF,<br>&nbsp; BTH_CONNECTABLE,<br>&nbsp; BTH_DISCOVERABLE<br>};</strong></p>
<p><strong style="FONT-SIZE: 24pt">API介绍</strong><br><strong>BthGetMode <br></strong><em>作用</em>：<br>This function is used to retrieve the current mode of operation of the Bluetooth radio.<br><em>原型</em>：<br>int BthGetMode(DWORD* pdwMode);<br><em>返回值</em>：<br>Returns ERROR_SUCCESS on success or returns an error code on failure.</p>
<p><strong>BthSetMode<br></strong><em>作用</em>：<br>This function is used to set the Bluetooth mode of operation and reflect it in the control panel. This function is also used </p>
<p>to persist that state across hardware insertion and reboot.<br><em>原型</em>：<br>int BthSetMode(DWORD dwMode );<br><em>返回值</em>：<br>Returns ERROR_SUCCESS on success or returns an error code on failure. </p>
<p><em>环境</em>：<br>OS Versions: Windows CE .NET 4.2 and later<br>Header: Declared in bthutil.h<br>Library: Use bthutil.lib</p>
<p><span style="FONT-SIZE: 24pt"><strong>代码示例</strong>：</span><br>功能：获取蓝牙设备状态，如果设备状态是关闭的，则将其设为可发现。设置是否成功，给出提示。</p>
<p><strong>第一步</strong>：</p>
<p>首先需要添加头文件和库文件<br>#include &lt;bthutil.h&gt;<br>#pragma&nbsp; comment(lib, "bthutil.lib")</p>
<p><strong>第二步</strong>：</p>
<p>获取蓝牙设备状态</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">DWORD bthState;<br>if (ERROR_SUCCESS == BthGetMode(&amp;bthState))<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;if (bthState == BTH_POWER_OFF)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (ERROR_SUCCESS == BthSetMode(BTH_DISCOVERABLE))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL, _T("success"), _T("Note"), MB_OK);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL, _T("failed"), _T("Note"), MB_OK);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</div>
<br>设置蓝牙状态是在模拟器上进行的，没有设置成功，这是由于模拟器上没有安装蓝牙设备造成的。<br><br><br>还需要继续学习。<br>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/57069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2008-07-24 17:29 <a href="http://www.cppblog.com/SpringSnow/articles/57069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单个进程所占内存的大小</title><link>http://www.cppblog.com/SpringSnow/articles/56772.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Mon, 21 Jul 2008 08:40:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/articles/56772.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/56772.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/articles/56772.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/56772.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/56772.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如何获得单个进程所占内存的大小，也许很简单，通过GetProcessMemoryInfo可以轻松获得，然而那是在PC上。但在windows mobile 上，这个函数不存在，它的实现机制我也不太清楚。所以如何获得一个进程的占用内存大小，则需要另辟蹊径。不过目前，我还没有找到。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我现在的方法，如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">DWORD&nbsp;GetUsedMemory(DWORD&nbsp;pID)<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img id=Codehighlighter1_31_644_Open_Image onclick="this.style.display='none'; Codehighlighter1_31_644_Open_Text.style.display='none'; Codehighlighter1_31_644_Closed_Image.style.display='inline'; Codehighlighter1_31_644_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_31_644_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_31_644_Closed_Text.style.display='none'; Codehighlighter1_31_644_Open_Image.style.display='inline'; Codehighlighter1_31_644_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_31_644_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_31_644_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;memUsage&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;hSnapShot&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CreateToolhelp32Snapshot(TH32CS_SNAPHEAPLIST,&nbsp;pID);<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(INVALID_HANDLE_VALUE&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;hSnapShot)<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img id=Codehighlighter1_167_620_Open_Image onclick="this.style.display='none'; Codehighlighter1_167_620_Open_Text.style.display='none'; Codehighlighter1_167_620_Closed_Image.style.display='inline'; Codehighlighter1_167_620_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_167_620_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_167_620_Closed_Text.style.display='none'; Codehighlighter1_167_620_Open_Image.style.display='inline'; Codehighlighter1_167_620_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_167_620_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_167_620_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HEAPLIST32&nbsp;heapList;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heapList.dwSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(HEAPLIST32);<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;&nbsp;bOk&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Heap32ListFirst(hSnapShot,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">heapList);<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(;&nbsp;bOk;&nbsp;bOk&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Heap32ListNext(hSnapShot,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">heapList))<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img id=Codehighlighter1_345_564_Open_Image onclick="this.style.display='none'; Codehighlighter1_345_564_Open_Text.style.display='none'; Codehighlighter1_345_564_Closed_Image.style.display='inline'; Codehighlighter1_345_564_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_345_564_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_345_564_Closed_Text.style.display='none'; Codehighlighter1_345_564_Open_Image.style.display='inline'; Codehighlighter1_345_564_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_345_564_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_345_564_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HEAPENTRY32&nbsp;&nbsp;he;<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;he.dwSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(HEAPENTRY32);<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;fOK&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Heap32First(hSnapShot,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">he,&nbsp;pID,&nbsp;heapList.th32HeapID);<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(;&nbsp;fOK;&nbsp;fOK&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Heap32Next(hSnapShot,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">he))<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img id=Codehighlighter1_523_560_Open_Image onclick="this.style.display='none'; Codehighlighter1_523_560_Open_Text.style.display='none'; Codehighlighter1_523_560_Closed_Image.style.display='inline'; Codehighlighter1_523_560_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_523_560_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_523_560_Closed_Text.style.display='none'; Codehighlighter1_523_560_Open_Image.style.display='inline'; Codehighlighter1_523_560_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_523_560_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_523_560_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memUsage&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;he.dwBlockSize;<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;关闭快照句柄</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">24</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseToolhelp32Snapshot(hSnapShot);<br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;<br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;memUsage;<br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>以上的这个方法与实际有出入。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有没有更好的办法呢？希望研究过的和正在研究的人，或者感兴趣的人，能够指点一二，让我能够走出困惑。<br>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/56772.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2008-07-21 16:40 <a href="http://www.cppblog.com/SpringSnow/articles/56772.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>