﻿<?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++博客-春暖花开-随笔分类-Windows Mobile</title><link>http://www.cppblog.com/SpringSnow/category/10317.html</link><description>雪化了，花开了，春天来了</description><language>zh-cn</language><lastBuildDate>Thu, 17 Sep 2009 06:28:30 GMT</lastBuildDate><pubDate>Thu, 17 Sep 2009 06:28:30 GMT</pubDate><ttl>60</ttl><item><title>MoveFile、CopyFile和DeleteAndRenameFile</title><link>http://www.cppblog.com/SpringSnow/archive/2009/09/17/96494.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Thu, 17 Sep 2009 01:38:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/09/17/96494.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/96494.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/09/17/96494.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/96494.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/96494.html</trackback:ping><description><![CDATA[<p>昨天想做这么一个操作，就是将文件从一个文件夹拷贝到另一个文件夹中，同时删除源文件夹中的内容。想着挺简单的，于是就首先使用了MoveFile。<br>当目的文件夹中，不存在文件时，MoveFile成功。而当目的文件夹包含该文件时，MoveFile则调用不成功。他不支持覆盖。所以挪动文件，用MoveFile似乎不是首选。<br>此时，我想到的是DeleteAndRenameFile，<br>在SDK中解释到This function deletes the source file after it copies the content of the source file to the destination file. 拷贝源文件的内容到目的文件，然后删除源文件。看似符合要求，但是他要求调用该函数的时候目的文件必须存在。<br><br>这两个函数都不可行，结合起来到是不错的选择，可以满足要求。可惜我昨天没有这么想，昨天我想到了CopyFile。<br>CopyFile的原型是<br><strong>BOOL</strong> <strong>CopyFile(</strong><br>&nbsp; <strong>LPCTSTR</strong> <em><a class=synParam onclick=showTip(this) href="">lpExistingFileName</a></em><strong>, </strong><br>&nbsp; <strong>LPCTSTR</strong> <em><a class=synParam onclick=showTip(this) href="">lpNewFileName</a></em><strong>, </strong><br>&nbsp; <strong>BOOL</strong> <em><a class=synParam onclick=showTip(this) href="">bFailIfExists</a> </em><br><strong>);</strong> <br><br>最后一个参数表示当目的文件已经存在的时候，CopyFile调用成功还是失败的操作。如果为False，就可以覆盖拷贝了。<br><br>于是我就自己写了一个CopyAndDel的小函数。先拷贝再删除原来的文件。删除文件的时候还需要考虑一下文件属性的问题。<br></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"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">BOOL&nbsp;CopyAndDel(LPCTSTR&nbsp;lpExistingFileName,&nbsp;LPCTSTR&nbsp;lpNewFileName)<br><img id=Codehighlighter1_67_316_Open_Image onclick="this.style.display='none'; Codehighlighter1_67_316_Open_Text.style.display='none'; Codehighlighter1_67_316_Closed_Image.style.display='inline'; Codehighlighter1_67_316_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_67_316_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_67_316_Closed_Text.style.display='none'; Codehighlighter1_67_316_Open_Image.style.display='inline'; Codehighlighter1_67_316_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_67_316_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_67_316_Open_Text><span style="COLOR: #000000">{<br><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;(CopyFile(lpExistingFileName,&nbsp;lpNewFileName,&nbsp;FALSE))<br><img id=Codehighlighter1_127_299_Open_Image onclick="this.style.display='none'; Codehighlighter1_127_299_Open_Text.style.display='none'; Codehighlighter1_127_299_Closed_Image.style.display='inline'; Codehighlighter1_127_299_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_127_299_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_127_299_Closed_Text.style.display='none'; Codehighlighter1_127_299_Open_Image.style.display='inline'; Codehighlighter1_127_299_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_127_299_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_127_299_Open_Text><span style="COLOR: #000000">{<br><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">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">DeleteFile(lpExistingFileName))<br><img id=Codehighlighter1_170_281_Open_Image onclick="this.style.display='none'; Codehighlighter1_170_281_Open_Text.style.display='none'; Codehighlighter1_170_281_Closed_Image.style.display='inline'; Codehighlighter1_170_281_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_170_281_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_170_281_Closed_Text.style.display='none'; Codehighlighter1_170_281_Open_Image.style.display='inline'; Codehighlighter1_170_281_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_170_281_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_170_281_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetFileAttributes(lpExistingFileName,&nbsp;FILE_ATTRIBUTE_NORMAL);<br><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">return</span><span style="COLOR: #000000">&nbsp;DeleteFile(lpExistingFileName);<br><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><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">return</span><span style="COLOR: #000000">&nbsp;TRUE;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><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;FALSE;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p><br>这个小函数的缺陷在于还需要考虑删除文件的属性问题。似乎利用MoveFile和DeleteAndRenameFile组合更好一些。<br><br>这里总结一下：<br><strong>MoveFile</strong>&nbsp;重命名一个文件或目录，包括它所有的孩子。可对文件夹进行操作。不过需要保证的是新文件或新文件夹不存在，否则调用失败。<br><strong>DeleteAndRenameFile</strong> 当拷贝源文件的内容到目的文件后，删除源文件。需要保证目的文件在调用前已经存在。<br><strong>CopyFile</strong> 拷贝一个已经存在的文件，并生成一个新的文件。不能对文件夹进行操作。<br><strong>DeleteFile</strong> 删除一个文件。不能删除文件夹。该函数删除失败的时候，考虑一下文件的属性问题。<br><strong>RemoveDirectory</strong> 删除一个空的文件夹。<br><br>&nbsp;</p>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/96494.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-09-17 09:38 <a href="http://www.cppblog.com/SpringSnow/archive/2009/09/17/96494.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows Mobile中的网络连接</title><link>http://www.cppblog.com/SpringSnow/archive/2009/09/02/95118.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Wed, 02 Sep 2009 09:54:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/09/02/95118.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/95118.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/09/02/95118.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/95118.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/95118.html</trackback:ping><description><![CDATA[<p>我们都知道，在设置中有连接选项，我们可以选择指定的接入点连入网络。但是其原理又是怎样的。这个在我最近的学习中一直找不到很好的解决方案。<br>人们比较熟悉GPRS连接，中国移动的GPRS接入也不外乎分为两种，cmnet和cmwap。通过枚举接入点，获取接入点名称，然后建立连接。看似还是挺简单的。<br>但是我们也注意到，在网络中还存在拨号，这个连接是怎么进行的。我这里还没有想明白。<br>还有如何利用程序自动的选择网络，使其出现在连接设置界面中。好像也还没有人给出答案。为此我还专门跑到MSDN上面去问，不过有人说还没有方法实现。不过我见过一款软件是可以的，但是怎么实现的也不得而知。<br>所以剩下的工作只能自己努力发现了，还有借助这里的力量了。<br><br>如果您有什么建议的话，不妨告诉我。</p>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/95118.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-09-02 17:54 <a href="http://www.cppblog.com/SpringSnow/archive/2009/09/02/95118.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows Mobile 快捷方式的读取和创建</title><link>http://www.cppblog.com/SpringSnow/archive/2009/07/23/90948.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Thu, 23 Jul 2009 10:13:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/07/23/90948.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/90948.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/07/23/90948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/90948.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/90948.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="BACKGROUND: white; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 160%; TEXT-ALIGN: center; mso-pagination: widow-orphan" align=center><strong><span style="FONT-SIZE: 18pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 楷体_GB2312; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体">快捷方式的读取和创建<span lang=EN-US><o:p></o:p></span></span></strong></p>
<h1 style="MARGIN: 6pt 0cm; LINE-HEIGHT: normal"><font color=#000000><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">一、快捷方式的获取</span><span lang=EN-US style="FONT-SIZE: 12pt; mso-font-kerning: 0pt"><o:p></o:p></span></font></h1>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><strong><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt">SHGetShortcutTarget<o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Georgia">功能：</span></strong><strong><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">获取快捷方式的目标路径</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Georgia">原型：</span></strong><strong><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">BOOL SHGetShortcutTarget(<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-spacerun: yes">&nbsp; </span>LPTSTR szShortcut, <o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-spacerun: yes">&nbsp; </span>LPTSTR szTarget, <o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-spacerun: yes">&nbsp; </span>int cbMax <o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">);<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Georgia">参数：</span></strong><strong><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">szShortcut </span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">：包含快捷方式名字的字符串</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">szTarget </span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">：包含快捷方式目标路径的字符串，</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"> </span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">字符串的大小至少是</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">cbMax</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">。</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">cbMax </span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">：将被拷贝到缓存</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">szTarget</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">的最大字符串</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Georgia">返回值：</span></strong><strong><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">成功返回</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">TRUE,</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">否则返回</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">FALSE</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">。</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Georgia">示例代码：</span></strong><strong><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">TCHAR StartMenuFilePath[MAX_PATH];<br></span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">::SHGetSpecialFolderPath(NULL, StartMenuFilePath, CSIDL_PROGRAMS, FALSE);<br></span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">TCHAR szShortPath[MAX_PATH];<br></span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">wsprintf(szShortPath, _T("%s\\%s"), StartMenuFilePath, _T("</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">搜索</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">.lnk"));<br></span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">TCHAR szFilePath[MAX_PATH];<br></span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">:SHGetShortcutTarget(szShortPath, szFilePath, sizeof(szFilePath));<br></span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia"><br>执行完毕后，<br></span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">szFilePath </span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">的值为</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">shfind.exe<o:p></o:p></span></p>
<h1 style="MARGIN: 6pt 0cm; LINE-HEIGHT: normal"><font color=#000000><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">二、快捷方式的创建</span><span lang=EN-US style="FONT-SIZE: 12pt; mso-font-kerning: 0pt"><o:p></o:p></span></font></h1>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><strong><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt">SHCreateShortcut<o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Georgia">功能：</span></strong><strong><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">创建快捷方式。</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Georgia">原型：</span></strong><strong><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">DWORD WINAPI SHCreateShortcut(<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-spacerun: yes">&nbsp; </span>LPTSTR szShortcut, <o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-spacerun: yes">&nbsp; </span>LPTSTR szTarget <o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">);<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Georgia">参数：</span></strong><strong><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">szShortcut </span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">：包含快捷方式名字和路径的字符串。在路径指定的位置创建快捷方式。</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">szTarget</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">：</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"> </span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">包含快捷方式目标路径和参数的字符串。大小限定在</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">256</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">个字符以内。</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Georgia">返回值：</span></strong><strong><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">成功返回</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">TRUE</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">，否则返回</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">FALSE</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">。如果指定的快捷方式已经存在的话将返回</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">FALSE</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">。</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Georgia">示例代码：</span></strong><strong><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-font-size: 12.0pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">SHCreateShortcut(_T("\\</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">搜索</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">.lnk"), _T("shfind.exe"));<br></span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">执行结果为在根目录下创建了&#8220;搜索</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">.lnk</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">&#8221;这个快捷方式文件。</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<h1 style="MARGIN: 6pt 0cm; LINE-HEIGHT: normal"><font color=#000000><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">三、补充说明</span><span lang=EN-US style="FONT-SIZE: 12pt; mso-font-kerning: 0pt"><o:p></o:p></span></font></h1>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">这里主要针对获取快捷方式的内容进行几点说明：</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">我们获取快捷方式的时候，内容不一定只包含路径，有可能存在一下的情况，如：</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm 3pt 10.5pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-para-margin-top: 3.0pt; mso-para-margin-right: 0cm; mso-para-margin-bottom: 3.0pt; mso-para-margin-left: 1.0gd" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">1</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">、路径后跟随名称</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm 3pt 10.5pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-para-margin-top: 3.0pt; mso-para-margin-right: 0cm; mso-para-margin-bottom: 3.0pt; mso-para-margin-left: 1.0gd" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">\Windows\</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">&#8220;开始&#8221;菜单</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">\</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">程序</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">\</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">任务</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">.lnk<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm 3pt 10.5pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-para-margin-top: 3.0pt; mso-para-margin-right: 0cm; mso-para-margin-bottom: 3.0pt; mso-para-margin-left: 1.0gd" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">2</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">、缩写名</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm 3pt 10.5pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-para-margin-top: 3.0pt; mso-para-margin-right: 0cm; mso-para-margin-bottom: 3.0pt; mso-para-margin-left: 1.0gd" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">poutlook.exe tasks<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm 3pt 10.5pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-para-margin-top: 3.0pt; mso-para-margin-right: 0cm; mso-para-margin-bottom: 3.0pt; mso-para-margin-left: 1.0gd" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">\Windows\</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">&#8220;开始&#8221;菜单</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">\</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">程序</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">\ActiveSync.lnk<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm 3pt 10.5pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-para-margin-top: 3.0pt; mso-para-margin-right: 0cm; mso-para-margin-bottom: 3.0pt; mso-para-margin-left: 1.0gd" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">:MSSYNCAPP<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm 3pt 10.5pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-para-margin-top: 3.0pt; mso-para-margin-right: 0cm; mso-para-margin-bottom: 3.0pt; mso-para-margin-left: 1.0gd" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">3</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">、路径后跟随数字</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm 3pt 10.5pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-para-margin-top: 3.0pt; mso-para-margin-right: 0cm; mso-para-margin-bottom: 3.0pt; mso-para-margin-left: 1.0gd" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">\Windows\</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">&#8220;开始&#8221;菜单</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">\</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">程序</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">\</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">游戏</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">\icon.lnk<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm 3pt 10.5pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-para-margin-top: 3.0pt; mso-para-margin-right: 0cm; mso-para-margin-bottom: 3.0pt; mso-para-margin-left: 1.0gd" align=left><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">shellres.dll,-8229<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 20pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-char-indent-count: 2.0" align=left><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">考虑以上这几种情况，我们在获取快捷方式路径时，需要对路径做一些特殊处理。这里重点说一下第二种情况，这个缩写代表什么意思？在网上搜索了一下，原来我们可以在</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">[HKEY_LOCAL_MACHINE\Software\Microsoft\Shell\Rai\]</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">键值下找到名为</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">:MSSYNCAPP</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">的子键，键值为</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">1</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">的子键数值指明了名为</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">:MSSYNCAPP</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">的程序名称。但我们从这里获得的值，有时也不是路径，还会再次出现上述三种情况。所以，如果我们想从快捷方式中获取路径的话，就需要留意一些了。</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 20pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-char-indent-count: 2.0" align=left><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体; mso-ascii-font-family: Georgia">至于为什么会这样，我还不是很明白。</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Georgia; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/90948.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-07-23 18:13 <a href="http://www.cppblog.com/SpringSnow/archive/2009/07/23/90948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序图标的获取</title><link>http://www.cppblog.com/SpringSnow/archive/2009/07/23/90935.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Thu, 23 Jul 2009 08:03:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/07/23/90935.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/90935.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/07/23/90935.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/90935.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/90935.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="BACKGROUND: white; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 160%; TEXT-ALIGN: center; mso-pagination: widow-orphan" align=center><strong><span style="FONT-SIZE: 18pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 楷体_GB2312; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体">程序图标的获取<span lang=EN-US><o:p></o:p></span></span></strong></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt">在我们的手机中，不同的程序有不同的图标，怎么抓取这些程序的图标呢？不用急啊，系统给我们提供了一个<span lang=EN-US>API</span>：<span lang=EN-US>ExtractIconEx</span>。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt">这个函数使用起来很简便，下面是一个示例代码，一看就会了。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt">已知程序路径<span lang=EN-US>szFilePath<br></span></span><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt">&nbsp;&nbsp;&nbsp;&nbsp;HICON hIcon = NULL;<br>&nbsp;&nbsp;&nbsp; </span><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt">ExtractIconEx(szFilePath, 0, NULL, &amp;hIcon, 1);<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt">函数具体怎么用呢？下面我们简单看一下：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; mso-pagination: widow-orphan"><strong><span lang=EN-US style="FONT-SIZE: 15pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'">ExtractIconEx<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 24.1pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><strong><span style="FONT-SIZE: 12pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'">作用</span></strong><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt">从指定的执行文件或<span lang=EN-US>DLL</span>中获得图标句柄。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 24.1pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><strong><span style="FONT-SIZE: 12pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'">原型<span lang=EN-US><o:p></o:p></span></span></strong></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt">HICON ExtractIconEx(<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt"><span style="mso-spacerun: yes">&nbsp; </span>LPCTSTR <span style="mso-field-code: ' HYPERLINK '''">lpszFile</span>, <o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt"><span style="mso-spacerun: yes">&nbsp; </span>int <span style="mso-field-code: ' HYPERLINK '''">nIconIndex</span>, <o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt"><span style="mso-spacerun: yes">&nbsp; </span>HICON FAR* <span style="mso-field-code: ' HYPERLINK '''">phiconLarge</span>, <o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt"><span style="mso-spacerun: yes">&nbsp; </span>HICON FAR* <span style="mso-field-code: ' HYPERLINK '''">phiconSmall</span>, <o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt"><span style="mso-spacerun: yes">&nbsp; </span>UINT <span style="mso-field-code: ' HYPERLINK '''">nIcons</span><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt">);<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 24.1pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><strong><span style="FONT-SIZE: 12pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'">参数<span lang=EN-US><o:p></o:p></span></span></strong></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt"><span style="mso-field-code: ' HYPERLINK '''">lpszFile</span></span><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt">：抽取图标的执行文件或<span lang=EN-US>DLL</span>文件的路径<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt"><span style="mso-field-code: ' HYPERLINK '''">nIconIndex</span></span><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt">：第一个图标的索引。如果是<span lang=EN-US>Windows CE 2.10</span>或以后的版本，该值必须为<span lang=EN-US>0</span>或<span lang=EN-US>-N</span>，当<span lang=EN-US>N</span>为指定资源标识。<span lang=EN-US><span style="mso-field-code: ' HYPERLINK '''">nIcons</span></span>该值必须为<span lang=EN-US>1.<o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt"><span style="mso-field-code: ' HYPERLINK '''">phiconLarge</span></span><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt">：从文件中抽取的大图标句柄。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt"><span style="mso-field-code: ' HYPERLINK '''">phiconSmall</span></span><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt">：从文件中抽取的小图标句柄。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt"><span style="mso-field-code: ' HYPERLINK '''">nIcons</span></span><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt">：从文件中抽取的图标数<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 24.1pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><strong><span style="FONT-SIZE: 12pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'">返回值<span lang=EN-US><o:p></o:p></span></span></strong></p>
<span style="FONT-SIZE: 10.5pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Arial Unicode MS'; mso-bidi-font-weight: bold; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp;&nbsp;&nbsp;&nbsp;如果是<span lang=EN-US>Windows CE 2.10</span>或以后的版本，该函数返回获得的图标数组的第一个图标句柄。如果<span lang=EN-US>phiconLarge</span>和<span lang=EN-US>phiconSmall</span>都不为<span lang=EN-US>NULL</span>的话，则返回值默认为第一个大图标。</span>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/90935.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-07-23 16:03 <a href="http://www.cppblog.com/SpringSnow/archive/2009/07/23/90935.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在指定目录下创建文件夹</title><link>http://www.cppblog.com/SpringSnow/archive/2009/07/21/90755.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Tue, 21 Jul 2009 10:14:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/07/21/90755.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/90755.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/07/21/90755.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/90755.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/90755.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="BACKGROUND: white; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 160%; TEXT-ALIGN: center; mso-pagination: widow-orphan" align=center><strong><span style="FONT-SIZE: 18pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 楷体_GB2312; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体">在指定目录下创建文件夹<span lang=EN-US><o:p></o:p></span></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt; mso-char-indent-count: 2.0"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">在博客里，有人问我这个问题：如何在指定目录下创建文件夹。这个我还真的没有做过。用<span lang=EN-US>CreateFile</span>，似乎里面也没有跟文件夹相关的任何东西。于是就在<span lang=EN-US>SDK</span>中搜了一下，<span lang=EN-US>CreateDirectory</span>。不错，这个就可以用来创建文件夹。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt; mso-char-indent-count: 2.0"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">下面来仔细学习一下这个<span lang=EN-US>API</span>。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 15pt; FONT-FAMILY: 黑体; mso-font-kerning: 0pt; mso-hansi-font-family: 宋体; mso-bidi-font-family: 宋体">CreateDirectory<o:p></o:p></span></p>
<p><span style="FONT-FAMILY: 黑体">功能</span><font face=宋体>： </font></p>
<p><span lang=EN-US><font face=宋体>This function creates a new directory. If the underlying file system supports security on files and directories, the function applies a specified security descriptor to the new directory. </font></span></p>
<p><font face=宋体>（创建一个新的文件夹。如果基本的文件系统在文件或文件夹上支持安全描述，那么该函数将在新建的文件夹上应用指定的安全描述）</font></p>
<p><span style="FONT-FAMILY: 黑体">原型：<span lang=EN-US><o:p></o:p></span></span></p>
<pre><span lang=EN-US><font face=宋体>BOOL CreateDirectory(</font></span></pre>
<pre><span lang=EN-US><font face=宋体><span style="mso-spacerun: yes">&nbsp; </span>LPCTSTR <span style="mso-field-code: ' HYPERLINK '''">lpPathName</span>, </font></span></pre>
<pre><span lang=EN-US><font face=宋体><span style="mso-spacerun: yes">&nbsp;&nbsp;</span>LPSECURITY_ATTRIBUTES <span style="mso-field-code: ' HYPERLINK '''">lpSecurityAttributes</span> </font></span></pre>
<pre><span lang=EN-US><font face=宋体>);</font></span></pre>
<p><span style="FONT-FAMILY: 黑体">参数：<span lang=EN-US><o:p></o:p></span></span></p>
<pre style="MARGIN-LEFT: 76.75pt; TEXT-INDENT: -76.75pt; mso-char-indent-count: -6.37"><font face=宋体><strong style="mso-bidi-font-weight: normal"><span lang=EN-US><span style="mso-field-code: ' HYPERLINK '''">lpPathName</span></span></strong>：包含将被创建的文件夹路径的字符串，字符串的长度不超过<span lang=EN-US>MAX_PATH</span>。</font></pre>
<pre><font face=宋体><strong style="mso-bidi-font-weight: normal"><span lang=EN-US><span style="mso-field-code: ' HYPERLINK '''">lpSecurityAttributes</span></span></strong>：忽略，设为<span lang=EN-US>NULL</span></font></pre>
<p><span style="FONT-FAMILY: 黑体">返回值：<span lang=EN-US><o:p></o:p></span></span></p>
<pre><font face=宋体>成功则返回非零，失败则返回零。</font></pre>
<p><span style="FONT-FAMILY: 黑体">备注：<span lang=EN-US><o:p></o:p></span></span></p>
<p><span lang=EN-US><font face=宋体>Some file systems, such as NTFS file system, support compression or encryption for individual files and directories. On volumes formatted for such a file system, a new directory inherits the compression and encryption attributes of its parent directory. </font></span></p>
<p><span lang=EN-US><font face=宋体>In Windows CE 5.0 and later, full path canonicalization is performed before <strong><span style="BACKGROUND: #335ea8; COLOR: white">CreateDirectory</span></strong> processes a path name. As a result, trailing backslashes that may appear in a user-provided path name are ignored.</font></span></p>
<pre style="TEXT-INDENT: 24pt; mso-char-indent-count: 2.0"><font face=宋体>一些文件系统，像<span lang=EN-US>NTFS</span>文件系统，对于个别的文件或目录支持压缩或加密。以卷格式化的文件系统，一个新的目录将继承它父目录的压缩和加密特性。</font></pre>
<pre style="TEXT-INDENT: 24pt; mso-char-indent-count: 2.0"><font face=宋体>在<span lang=EN-US>Windows CE 5.0</span>或以后的版本中，全路径的规范化将在<span lang=EN-US>CreateDirectory</span>处理路径名字前执行。结果是，出现在用户指定的路径名中的反斜线将被忽略。</font></pre>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/90755.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-07-21 18:14 <a href="http://www.cppblog.com/SpringSnow/archive/2009/07/21/90755.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对话框显示OK或CANCEL的简便方法</title><link>http://www.cppblog.com/SpringSnow/archive/2009/07/21/90753.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Tue, 21 Jul 2009 10:13:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/07/21/90753.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/90753.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/07/21/90753.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/90753.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/90753.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="BACKGROUND: white; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 160%; TEXT-ALIGN: center; mso-pagination: widow-orphan" align=center><strong><span style="FONT-SIZE: 18pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 楷体_GB2312; mso-font-kerning: 0pt; mso-hansi-font-family: Georgia; mso-bidi-font-family: 宋体">对话框显示<span lang=EN-US>OK</span>或<span lang=EN-US>CANCEL</span>的简便方法<span lang=EN-US><o:p></o:p></span></span></strong></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">最近很忙，有时也犯点懒。转的东西多些，自己写东西的时候少了好多。曾经豪言的<span lang=EN-US>100</span>篇总结，似乎也只完成了<span lang=EN-US>5</span>或<span lang=EN-US>6</span>篇。离目标还有很远的距离。所以继续。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">这次是一个很小的知识点，只是简单的改变对话框的<span lang=EN-US>OK</span>或<span lang=EN-US>CANCEL</span>按钮。我们的法宝是</span><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'">SHDoneButton</span></strong><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">函数。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm 6pt; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">我先给几个小示例：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt"><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">已知想要改变的窗口句柄<span lang=EN-US>hWnd;<o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">// </span><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">显示<span lang=EN-US>OK</span>按钮<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">&nbsp; SHDoneButton(hWnd, SHDB_SHOW);<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">// </span><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">显示<span lang=EN-US>CANCEL</span>按钮<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">&nbsp; SHDoneButton(hWnd, SHDB_SHOWCANCEL);<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 6pt 0cm 3pt; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">我们再具体看一下这个函数的使用。原来我认为挺简单的，仔细看了一下<span lang=EN-US>SDK</span>，竟然还有那么多的注意事项，那我们来学习一下这个函数<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; mso-pagination: widow-orphan"><span lang=EN-US style="FONT-SIZE: 15pt; COLOR: #4b4b4b; FONT-FAMILY: 黑体; mso-font-kerning: 0pt; mso-hansi-font-family: 宋体; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">SHDoneButton</span><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'"><br></span><span style="FONT-SIZE: 12pt; COLOR: #4b4b4b; FONT-FAMILY: 黑体; mso-font-kerning: 0pt; mso-hansi-font-family: 宋体; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">功能</span><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">：<span lang=EN-US>This function is provided for applications that need to dynamically show or hide the OK button based on the state of the application.</span>（可以使应用程序动态的显示或隐藏<span lang=EN-US>OK</span>按钮）<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; mso-pagination: widow-orphan"><span style="FONT-SIZE: 12pt; COLOR: #4b4b4b; FONT-FAMILY: 黑体; mso-font-kerning: 0pt; mso-hansi-font-family: 宋体; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">原型</span><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">BOOL SHDoneButton(<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'"><span style="mso-spacerun: yes">&nbsp; </span>HWND <span style="mso-field-code: ' HYPERLINK '''">hwndRequester</span>,<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'"><span style="mso-spacerun: yes">&nbsp; </span>DWORD <span style="mso-field-code: ' HYPERLINK '''">dwState</span><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">);<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; mso-pagination: widow-orphan"><span style="FONT-SIZE: 12pt; COLOR: #4b4b4b; FONT-FAMILY: 黑体; mso-font-kerning: 0pt; mso-hansi-font-family: 宋体; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">参数：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan"><strong><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'">hwndRequester</span></strong><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'"> </span><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">：<span lang=EN-US>[in] Handle to the top-level window requesting the Done button. </span>（指定窗口）<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan"><strong><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'">dwState</span></strong><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'"> </span><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">：<span lang=EN-US>[in] Specifies the button state. </span>（指定按钮的状态）<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; mso-pagination: widow-orphan"><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">按钮的状态有三个值，分别为：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; mso-pagination: widow-orphan"><strong><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'">SHDB_SHOW</span></strong><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">：添加属性<span lang=EN-US>WS_EX_CAPTIONOKBTN</span>到指定的窗口。当指定窗口成为最前的窗口时，<span lang=EN-US>OK</span>按钮将会显现。注意指定窗口不能设置为样式<span lang=EN-US>WS_CAPTION</span>。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; mso-pagination: widow-orphan"><strong><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'">SHDB_HIDE</span></strong><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">：从指定窗口移出<span lang=EN-US>WS_EX_CAPTIONOKBTN</span>属性。下次当指定窗口成为最前窗口时，<span lang=EN-US>OK</span>按钮将不再显示。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; mso-pagination: widow-orphan"><strong><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 'Arial Unicode MS'">SHDB_SHOWCANCEL</span></strong><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">：将在窗口显示<span lang=EN-US>[X]</span>按钮。当<span lang=EN-US>[X]</span>按钮按下的时候，将会发送一个<span lang=EN-US>WM_COMMAND</span>消息，指定<span lang=EN-US>IDCANCEL</span>值。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; mso-pagination: widow-orphan"><span style="FONT-SIZE: 12pt; COLOR: #4b4b4b; FONT-FAMILY: 黑体; mso-font-kerning: 0pt; mso-hansi-font-family: 宋体; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">返回值：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan"><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">成功则返回<span lang=EN-US>TRUE</span>，失败则返回<span lang=EN-US>FALSE</span>。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; mso-pagination: widow-orphan"><span style="FONT-SIZE: 12pt; COLOR: #4b4b4b; FONT-FAMILY: 黑体; mso-font-kerning: 0pt; mso-hansi-font-family: 宋体; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">备注：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">Typically, the Done button (the OK button that appears in the upper-right corner of the screen) is managed by the shell, and showing or hiding the OK button happens automatically. A top-level window that needs the Done button to appear should use the following window styles: <o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">Must have WS_EX_CAPTIONOKBTN <o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">Must not have WS_CAPTION<br>WS_CHILD <o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">Note&nbsp;&nbsp;&nbsp;WS_CAPTION is defined as (WS_BORDER<br>WS_DLGFRAME). To make the OK button appear, you must ensure that your window does not have either of these styles.<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">Whenever the foreground window changes, the shell checks the style bits of the window to determine if the OK button should appear in the navigation bar.<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">To suppress the OK button, use the WS_NONAVDONEBUTTON style.<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">（通常情况下，确定按钮是由<span lang=EN-US>shell</span>控制的，自动的显示和隐藏<span lang=EN-US>OK</span>按钮。一个最顶层的窗口需要确定按钮出现时需要使用下列窗口样式：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">必须具有<span lang=EN-US>WS_EX_CAPTIONOKBTN</span>属性<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">必须不能含有<span lang=EN-US>WS_CAPTION</span>和<span lang=EN-US>WS_CHILD</span>属性样式。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">当最前窗口改变时，<span lang=EN-US>shell</span>将检查窗口的样式来决定<span lang=EN-US>OK</span>按钮是否出现在导航按钮中。）<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; mso-pagination: widow-orphan"><span lang=EN-US style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 3pt 0cm; TEXT-INDENT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: 2.0"><span style="COLOR: #4b4b4b; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-weight: bold; mso-bidi-font-family: 'Arial Unicode MS'">对于这个备注，我没有怎么注意过。所以为了验证我这里做了一下实验。发现<span lang=EN-US>WS_CAPTION</span>这个属性对<span lang=EN-US>OK</span>按钮的显示没有多大影响。只是显示<span lang=EN-US>[X]</span>按钮没有实验出来。<span lang=EN-US><o:p></o:p></span></span></p>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/90753.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-07-21 18:13 <a href="http://www.cppblog.com/SpringSnow/archive/2009/07/21/90753.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转: 使Pocket PC震起来</title><link>http://www.cppblog.com/SpringSnow/archive/2009/07/17/90357.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Fri, 17 Jul 2009 08:56:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/07/17/90357.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/90357.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/07/17/90357.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/90357.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/90357.html</trackback:ping><description><![CDATA[&nbsp;摘自: <a href="http://yulinlu.blog.163.com/blog/static/58815698200812284225975/">http://yulinlu.blog.163.com/blog/static/58815698200812284225975/</a><br><br>
<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"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">windows.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">nled.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;LedOn(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;id)&nbsp;<br><img id=Codehighlighter1_61_196_Open_Image onclick="this.style.display='none'; Codehighlighter1_61_196_Open_Text.style.display='none'; Codehighlighter1_61_196_Closed_Image.style.display='inline'; Codehighlighter1_61_196_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_61_196_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_61_196_Closed_Text.style.display='none'; Codehighlighter1_61_196_Open_Image.style.display='inline'; Codehighlighter1_61_196_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_61_196_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_61_196_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;NLED_SETTINGS_INFO&nbsp;settings;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;settings.LedNum</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;id;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;settings.OffOnBlink</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;NLedSetDevice(NLED_SETTINGS_INFO_ID,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">settings);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;LedOff(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;id)&nbsp;<br><img id=Codehighlighter1_220_354_Open_Image onclick="this.style.display='none'; Codehighlighter1_220_354_Open_Text.style.display='none'; Codehighlighter1_220_354_Closed_Image.style.display='inline'; Codehighlighter1_220_354_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_220_354_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_220_354_Closed_Text.style.display='none'; Codehighlighter1_220_354_Open_Image.style.display='inline'; Codehighlighter1_220_354_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_220_354_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_220_354_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;NLED_SETTINGS_INFO&nbsp;settings;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;settings.LedNum</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;id;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;settings.OffOnBlink</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;NLedSetDevice(NLED_SETTINGS_INFO_ID,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">settings);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;WINAPI&nbsp;WinMain(HINSTANCE&nbsp;hInstance,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HINSTANCE&nbsp;hPrevInstance,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPTSTR&nbsp;lpCmdLine,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;nCmdShow)<br><img id=Codehighlighter1_476_589_Open_Image onclick="this.style.display='none'; Codehighlighter1_476_589_Open_Text.style.display='none'; Codehighlighter1_476_589_Closed_Image.style.display='inline'; Codehighlighter1_476_589_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_476_589_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_476_589_Closed_Text.style.display='none'; Codehighlighter1_476_589_Open_Image.style.display='inline'; Codehighlighter1_476_589_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_476_589_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_476_589_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_510_571_Open_Image onclick="this.style.display='none'; Codehighlighter1_510_571_Open_Text.style.display='none'; Codehighlighter1_510_571_Closed_Image.style.display='inline'; Codehighlighter1_510_571_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_510_571_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_510_571_Closed_Text.style.display='none'; Codehighlighter1_510_571_Open_Image.style.display='inline'; Codehighlighter1_510_571_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_510_571_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_510_571_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LedOn(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(</span><span style="COLOR: #000000">400</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LedOff(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(</span><span style="COLOR: #000000">200</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><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">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;</span></div>
<br><br>运行了一下,还蛮有意思的
<img src ="http://www.cppblog.com/SpringSnow/aggbug/90357.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-07-17 16:56 <a href="http://www.cppblog.com/SpringSnow/archive/2009/07/17/90357.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转: WinCE中的未公开函数</title><link>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90251.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Thu, 16 Jul 2009 08:37:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90251.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/90251.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90251.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/90251.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/90251.html</trackback:ping><description><![CDATA[<p>摘自: <a href="http://yulinlu.blog.163.com/blog/static/588156982008113111911557/">http://yulinlu.blog.163.com/blog/static/588156982008113111911557/</a><strong><br>PerformCallBack4</strong><br>强制令别的进程调用某个API，如果这个API是LoadLibrary的话，就相当于线程注入了，由coredll.dll提供</p>
<p>PerformCallBack4函数的定义：</p>
<p>[DllImport("coredll.dll")]<br>public static extern uint PerformCallBack4(ref CallBackInfo CallBackInfo,<br>IntPtr ni_pVoid1,IntPtr ni_pVoid2,IntPtr ni_pVoid3);</p>
<p>其中函数的参数CallBackInfo结构定义:<br>public struct CallBackInfo<br>{<br>public IntPtr hProc; //远程的目标进程<br>public IntPtr pfn; //指向远程目标进程的函数地址的指针<br>public IntPtr pvArg0; //函数的需要的第一个参数<br>}</p>
<p>而PerformCallback4的 ni_pVoid1、ni_pVoid2、ni_pVoid3为传递到远程目标进程执行函数的其它三个参数。</p>
<p>例子：<br>/*-------------------------------------------------------------------<br>&nbsp;&nbsp; FUNCTION: CallCoredllInProc<br>&nbsp;&nbsp; PURPOSE:&nbsp; CallCoredllInProc uses undocumented method <br>&nbsp;&nbsp;&nbsp; PerformCallBack4 to call exported methods from coredll.dll in <br>&nbsp;&nbsp;&nbsp; the specified process.<br>&nbsp;&nbsp; PARAMETERS:<br>&nbsp;&nbsp;&nbsp; HANDLE&nbsp; p_hProcess - handle to the process, where the call should<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; be made<br>&nbsp;&nbsp;&nbsp; LPCTSTR p_pszMethodName - name of method exported from coredll, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; such as VirtualAlloc, VirtualFree, etc.<br>&nbsp;&nbsp;&nbsp; DWORD p_dwParam1, p_dwParam2, p_dwParam3, p_dwParam4 - arguments<br>&nbsp;&nbsp;&nbsp; DWORD * p_pdwResult - pointer to the return value<br>&nbsp;&nbsp; RETURNS:<br>&nbsp;&nbsp;&nbsp; TRUE on success, FALSE on failure<br>-------------------------------------------------------------------*/<br>BOOL CallCoredllInProc<br>(<br>&nbsp;&nbsp;&nbsp; HANDLE&nbsp; p_hProcess,<br>&nbsp;&nbsp;&nbsp; LPCTSTR p_pszMethodName,<br>&nbsp;&nbsp;&nbsp; DWORD&nbsp;&nbsp; p_dwParam1, DWORD p_dwParam2, <br>&nbsp;&nbsp;&nbsp; DWORD&nbsp;&nbsp; p_dwParam3, DWORD p_dwParam4,<br>&nbsp;&nbsp;&nbsp; DWORD * p_pdwResult)<br>{<br>&nbsp;&nbsp;&nbsp; HINSTANCE l_hCoreDll = NULL;<br>&nbsp;&nbsp;&nbsp; BOOL l_bReturn = FALSE;<br>&nbsp;&nbsp;&nbsp; __try<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Use undocumented method PerformCallBack4 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //to call method in NK.EXE.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CALLBACKINFO CallbackInfo;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallbackInfo.m_hDestinationProcessHandle = p_hProcess;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l_hCoreDll = LoadLibrary(_T("COREDLL"));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallbackInfo.m_pFunction = <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (FARPROC)GetProcAddress(l_hCoreDll, p_pszMethodName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!CallbackInfo.m_pFunction)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*HTRACE(TG_Error, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _T("GetProcAddress(%x, %s) failed. Err %d"), <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l_hCoreDll, p_pszMethodName, GetLastError());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallbackInfo.m_pFirstArgument = (LPVOID)p_dwParam1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD l_dwResult = PerformCallBack4<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&amp;CallbackInfo, p_dwParam2, p_dwParam3, p_dwParam4);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(p_pdwResult)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *p_pdwResult = l_dwResult;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l_bReturn = TRUE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; __except(1)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTRACE(TG_Error, _T("Exception in CallCoredllInProc(%s)"), <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p_pszMethodName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l_bReturn = FALSE;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; if(l_hCoreDll)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FreeLibrary(l_hCoreDll);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return l_bReturn;<br>}//BOOL CallCoredllInProc</p>
<p><br><strong>CreateAPISet</strong><br>CE6.0以前是个未公开API，不过6.0以后就公开了<br>This function creates an API set from the list of functions passed as a parameter.</p>
<p>Syntax </p>
<p>HANDLE CreateAPISet(<br>&nbsp; char acName[4],<br>&nbsp; USHORT cFunctions,<br>&nbsp; const PFNVOID *ppfnMethods,<br>&nbsp; const ULONGLONG *pu64Sig<br>);<br>Parameters <br>acName <br>[in] Name of the API set.</p>
<p>cFunctions <br>[in] Number of functions for this API set.</p>
<p>ppfnMethods <br>[in] Array of functions for the API set.</p>
<p>pu64Sig <br>[in] Array of signatures for the functions.</p>
<p><br>Return Value <br>A handle to the API set.</p>
<p>Remarks <br>Before any process can become a handle server, the process must create and register a handle-based API set with this function and RegisterAPISet.</p>
<p>Requirements <br>Header pkfuncs.h <br>Library coredll.lib <br>Windows Embedded CE Windows Embedded CE 6.0 and later <br>CE6.0以前在coredll.dll里面有这个函数</p>
<p><br><strong>RegisterAPISet</strong><br>CE6.0以前是个未公开API，不过6.0以后就公开了<br>This function registers an API set.</p>
<p>Syntax <br>BOOL RegisterAPISet(<br>&nbsp; HANDLE hASet,<br>&nbsp; DWORD dwSetID<br>);</p>
<p>Parameters <br>hASet <br>[in] Handle to API set created by the CreateAPISet function.</p>
<p>dwSetID <br>[in] Type of API set. You must perform a bitwise OR operation on this parameter with REGISTER_APISET_TYPE to create a handle-based API set.</p>
<p>Return Value <br>TRUE indicates success. FALSE indicates failure. Call GetLastError to get extended error information.</p>
<p>Remarks <br>Before any process can become a handle server, the process must create and register a handle-based API set with CreateAPISet and RegisterAPISet.</p>
<p>Requirements <br>Header pkfuncs.h <br>Library coredll.lib <br>Windows Embedded CE Windows Embedded CE 6.0 and later <br>CE6.0以前在coredll.dll里面有这个函数</p>
<p>&nbsp;</p>
<p><strong>QueryAPISetID</strong><br>根据名字查询该API的ID，由coredll.dll提供<br>Syntax <br>int QueryAPISetID(<br>&nbsp; char *pName<br>);</p>
<p>Parameters<br>pName <br>[in] API的名字</p>
<p>Return Value <br>API的ID</p>
<p>&nbsp;</p>
<p><strong>GetAPIAddress</strong><br>获取特定API的特定Method的地址，由coredll.dll提供<br>FARPROC GetAPIAddress(<br>&nbsp; int setId,<br>&nbsp; int iMethod<br>);</p>
<p>Parameters <br>setId <br>[in] API的ID</p>
<p>iMethod <br>[in] Method的ID</p>
<p>Return Value <br>该Method的地址</p>
<p>&nbsp;</p>
<p><strong>GetProcessIndexFromID</strong><br>根据进程的ID计算出进程的序号（这个序号就是进程处于第几个slot），由coredll.dll提供<br>Syntax <br>DWORD GetProcessIndexFromID(<br>&nbsp; HANDLE hProc<br>);</p>
<p>Parameters <br>hProc<br>[in] 进程的句柄，这里为什么不是进程的ID而是进程的句柄呢？非常简单，因为在CE中进程的句柄就是进程的ID！</p>
<p>Return Value <br>进程的序号<br></p>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/90251.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-07-16 16:37 <a href="http://www.cppblog.com/SpringSnow/archive/2009/07/16/90251.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转: Windwos CE 跨进程内存注入</title><link>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90247.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Thu, 16 Jul 2009 08:11:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90247.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/90247.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90247.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/90247.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/90247.html</trackback:ping><description><![CDATA[摘自: <a href="http://www.yonsm.net/read.php?296">HTTP://WWW.Yonsm.NET/read.php?296</a><br><br>近日，由于程序设计需要，我对WincowsCE 的内存布局进行了研究，由于发现国内在这方面的文档资料较少，于是在研究告一段落之际，形成这篇示例文档，以望抛砖引玉，得到别的高手的指正。　　<br>一、程序实现的先决条件　　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于windows系统的窗体消息总是投递至一个特定进程的指定窗体消息函数中。于是在本地进程（自己的应用程序）中取得属于其它进程的窗体的消息必须实现以下两个部分：　<br>　1、将需要挂接窗体的代码放到目标进程的地址空间中去。　<br>　2、执行这一段代码，并获得目标进程窗体的消息。　<br>　这两步看起来很简单，但在实现过程中就比较困难。由于Windows CE作为嵌入式移动设备操作系统，与windows 98/2000/XP等桌面操作系统在内核的设计理念以及API的支持上有极大的区别。这就直接导致了常规的桌面系统利用全局鼠标钩子注入/远程线程注入等方法在CE中完全得不通。不过可喜的是，微软在开发工具中提供的remotexxx等远程调试程序使我清楚这个目标并不是不可能的任务，微软既然可以做到，那就是说在CE的内部一定有一套完整的跨进程内存访问/代码注入的机制。　　<br>二、程序实现的基本原理　　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 经过两天的google 搜索，在网上我发现了一个没有在微软文档中声明的有趣的API函数：PerformCallBack4，传说中这个函数可以在自己的应用程序中执行指定的进程中的一个函数，So Cool!这好象正是我所需要的东西。虽然网上也传闻这个函数在wm5不受支持，其实经过实践这个传闻只是谣传而已！　　PerformCallBack4函数的定义：<br>[DllImport("coredll.dll")]<br>public static extern uint PerformCallBack4<br>(ref CallBackInfo CallBackInfo,<br>IntPtr ni_pVoid1,<br>IntPtr ni_pVoid2,<br>IntPtr ni_pVoid3);　　<br>其中函数的参数CallBackInfo结构定义:<br>[StructLayout(LayoutKind.Sequential)]<br>public struct CallBackInfo{public IntPtr hProc; //远程的目标进程<br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public IntPtr pfn; //指向远程目标进程的函数地址的指针<br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public IntPtr pvArg0; //函数的需要的第一个参数}<br>//end struct　　<br>而PerformCallback4的 ni_pVoid1、ni_pVoid2、ni_pVoid3为传递到远程目标进程执行函数的其它三个参数。　　至于将代码放到目标进程的内存空间，我们可以利用CE设计上的一个特性：　　<br>1、为了节约内存使用，CE将所有程序调用的动态链接库（DLL）都映射到同一个内存地址中。　　<br>2、CE的内存布局中划分有一个slot0的内存位置，这个内存位置是由正在执行的进程所占有的，每一个特定的时间片，只能有一个进程可以占有这个内存空间。在进程要求执行时，系统并不直接执行进程所处内存位置的代码，而是将该进程的执行代码复制到slot0的内存位置中产生一个副本执行。也就是说进程在执行时内存将会有进程执行代码的两个完全一样的版本：存在于slot0中正在执行的进程代码和进程本身所处的内存中的代码。　　在这个特性下，可以得到结论：如果进程A通过LoadLibrary函数装载Test.dll，而进程B也通过LoadLibrary函数装载同一个Test.dll，这个Test.dll的所有函数在进程A和进程B中执行时，相对于slot0中的进程执行代码都会得到同一地址。　　<br>3、在CE中，系统在内存中划分出33个slot，slot0保留给正在执行的进程，然后在进程启动时将所有的代码放到除slot0以外的一个slot中（这就是臭名昭著的CE系统中内存最多只能有不多于32个程序执行的限制的来由）。在进程执行时，每个应用程序的内存访问默认只能访问slot0内存空间中的地址以及进程所处的slot内存空间的地址。 但为使设备驱动程序可以访问到它们所需的其它应用程序数据，CE提供了两个函数以打破这个限制，SetKmode和SetProcPermission，SetKmode函数告诉系统，当前运行的进程是否需要在内核模式中执行；SetProcPermission函数可以接受一个位掩码，每一位代码一个slot的访问控制，1代表可以访问该slot的内存内容。0表示不能访问该slot的内存内容。这两个函数在msdn中有帮助文档，可参阅msdn的文档说明。　　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本文我们对实现的原理进行了剖析，在下一篇文章中我们将以一个小示例程序演示实现的全过程。 在文章《浅析Windows CE跨进程内存注入实现窗体消息挂接（上）》中，我们已经得到了这个七巧板游戏所需要的所有小板块，剩下的事就是等待我们按一定顺序将合适的板块放到合适的位置，本章我们开始进行真刀真枪的实战演练。<br>程序目标：捕获explore窗体（也就是程序窗体的消息并输出到WinProcInfo.txt中）<br>程序的执行步骤设计如下：<br>1、编写一个窗体消息挂接DLL，这个DLL提供一个，函数中利用setwindowlong函数将窗体的默认消息处理过程改为这个挂接DLL中定义的一个窗体过程。<br>2、在C#程序中利用findwindow等API函数获得exlore类窗体的句柄及窗体所属的进程，并使用performcallback4在目标进程空间中执行coredll.dll的loadLibrary函数将我们写的挂接dll放到目标进程中。<br>3、在C#程序中使用performcallback4在目标进程空间中执行挂接DLL提供的导出接口函数实现跨进程窗体消息截获.<br>一、程序的实现如下：<br>在VS2005中建立一个智能设备的MFC DLL，命名为HookWindowsProcMFCDLL。<br>在HookWindowsProcMFCDLL.cpp中进行挂接DLL的核心编码： <br>LRESULT CALLBACK fnHookWindowProc(HWND hwnd,UINT msg,WPARAM wparam, LPARAM lparam);<br>int __declspec(dllexport) WINAPI fnAttachWinProc(HWND ni_hAttatchWin,PVOID ,PVOID,PVOID);<br>int __declspec(dllexport) WINAPI fnDetachWinMsgProc(HWND ni_hDetachWin);<br>WNDPROC tpOldWindowProc; <br>FILE *m_pDebugOutputFile;<br>//将一个窗体消息处理挂接到net精简版MessageWindow对象上的代码typedef struct{ 　WNDPROC OldWinProc;//保留窗体原始消息处理过程的函数指针　HWND WindowHandle;//保存net精简版中对应的窗口挂接的MessageWindow对象的句柄} DEFUDT_AttachWinInfo; //end struct<br>CMap&lt;HWND,HWND,DEFUDT_AttachWinInfo,DEFUDT_AttachWinInfo&gt; m_aAttachWinInfoMap;<br>//对指定的窗口进程进行挂接<br>int __declspec(dllexport) WINAPI fnAttachWinProc(HWND ni_hAttatchWin,PVOID ni_0,PVOID ni_1,PVOID ni_2 )<br>{　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEFUDT_AttachWinInfo tudtAttachWinInfo;　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pDebugOutputFile = fopen("&#92;&#92;Storage Card&#92;&#92;WinProcInfo.txt", "w");　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WNDPROC tpOldWindowProc=(WNDPROC)::SetWindowLong(ni_hAttatchWin, GWL_WNDPROC,(LONG) fnHookWindowProc );　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(m_pDebugOutputFile,"Attatch successfully! OldWindowProc: %08X&#92;n",tpOldWindowProc);　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tudtAttachWinInfo.OldWinProc=tpOldWindowProc ;　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tudtAttachWinInfo.WindowHandle=ni_hAttatchWin;　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_aAttachWinInfoMap.SetAt(ni_hAttatchWin,tudtAttachWinInfo);　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(m_pDebugOutputFile);　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 77; // (int)tpOldWindowProc ;<br>}//end function<br>int __declspec(dllexport) WINAPI fnDetachWinMsgProc(HWND ni_hDetachWin)<br>{　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEFUDT_AttachWinInfo tudtAttachWinInfo;　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WNDPROC tpOldWindowProc; //取得在ncf中消息接收窗口对应的原始消息处理函数的函数指针　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_aAttachWinInfoMap.Lookup(ni_hDetachWin,tudtAttachWinInfo) ;//将窗体的消息处理函数设为默认的处理过程　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tpOldWindowProc =(WNDPROC) SetWindowLong(ni_hDetachWin,GWL_WNDPROC , (LONG)tudtAttachWinInfo.OldWinProc); //将挂接信息消息处理映谢类中删除　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_aAttachWinInfoMap.RemoveKey(ni_hDetachWin);<br>　&nbsp;&nbsp;return (int)tpOldWindowProc ;<br>}//end function<br>LRESULT CALLBACK fnHookWindowProc(HWND hwnd,UINT msg,WPARAM wparam, LPARAM lparam)<br>{　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEFUDT_AttachWinInfo tudtAttachWinInfo;　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_aAttachWinInfoMap.Lookup(hwnd,tudtAttachWinInfo) ;　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pDebugOutputFile = fopen("&#92;&#92;Storage Card&#92;&#92;WinProcInfo.txt", "a");　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (m_pDebugOutputFile!=NULL)　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;　　fprintf(m_pDebugOutputFile,"HWND: %08X Msg: %08X Wparam %08X Lparam %08X&nbsp;&#92;n",hwnd,msg,wparam,lparam);<br>　&nbsp;&nbsp;&nbsp;}//EHD IF<br>　&nbsp;&nbsp;&nbsp;fclose(m_pDebugOutputFile);　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//tudtAttachWin=maatt　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LRESULT tobjResult= ::CallWindowProc(tudtAttachWinInfo.OldWinProc ,hwnd,msg,wparam,lparam);　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return tobjResult;<br>}//end function <br>而在C#的主程序中，我们使用这个DLL挂接explore类的程序窗体，以下给出挂接部分的代码：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int m_hTargetWindow;//要挂接的目标窗体句柄I<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ntPtr m_hTargetProcess;//目标窗体所属的进程<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntPtr m_hModule; //挂接DLL的句柄<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private void Form1_Load(object sender, EventArgs e)<br>{　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntPtr tpTemp = IntPtr.Zero, tpTempa = IntPtr.Zero;　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint tuntApiRet;<br>　&nbsp;&nbsp;&nbsp;m_hTargetWindow = (int)clsCECoreAPI.FindWindow("Explore", null ); //资源管理器 0x0013e800;<br>　&nbsp;&nbsp;&nbsp;//挂接指定的进程窗体消息　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntPtr thCurrentProcess = clsCECoreAPI.GetCurrentProcess();　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_hTargetProcess=IntPtr.Zero ;// (IntPtr) (unchecked((int)0xedd84e4a));　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tuntApiRet= clsCECoreAPI.GetWindowThreadProcessId(new IntPtr(unchecked((int) m_hTargetWindow)),ref m_hTargetProcess);<br>　&nbsp;&nbsp;&nbsp;string tstrArgument;　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tstrArgument = "&#92;&#92;Program Files&#92;&#92;processinject&#92;&#92;HookWindowsProcMFCDLL.dll";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// HookWindowsProcMFCDLL.dll";　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntPtr tpArg0;<br>　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int tintOriginalKMode = clsCECoreAPI.SetKMode(1);　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int tintOriginalProcPermission = (int)clsCECoreAPI.SetProcPermissions(0xffffffff);<br>　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntPtr tpFuncProc = clsCECoreAPI.GetProcAddress(clsCECoreAPI.GetModuleHandle("coredll.dll"), "LoadLibraryW");<br>　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CallBackInfo tudtCALLBACKINFO;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　tpArg0 = clsCECoreAPI.MapPtrToProcess(tstrArgument, thCurrentProcess);<br>　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tudtCALLBACKINFO.hProc = m_hTargetProcess;// Proc;　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tudtCALLBACKINFO.pfn = clsCECoreAPI.MapPtrToProcess(tpFuncProc, m_hTargetProcess);　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tudtCALLBACKINFO.pvArg0 = tpArg0;　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_hModule =new IntPtr(unchecked((int) clsCECoreAPI.PerformCallBack4(reftudtCALLBACKINFO,IntPtr.Zero,IntPtr.Zero,IntPtr.Zero )));　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//clsCECoreAPI.Sleep(1000);<br>　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntPtr thModule = clsCECoreAPI.LoadLibrary("HookWindowsProcMFCDLL.dll");　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tpFuncProc = clsCECoreAPI.GetProcAddress(thModule, "fnAttachWinProc");<br>　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tpArg0 = (IntPtr) m_hTargetWindow;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// clsCECoreAPI.MapPtrToProcess(ref thTargetWindow, thCurrentProcess);<br>　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tudtCALLBACKINFO.hProc = m_hTargetProcess;　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tudtCALLBACKINFO.pfn = clsCECoreAPI.MapPtrToProcess(tpFuncProc, m_hTargetProcess);　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tudtCALLBACKINFO.pvArg0 = tpArg0 ;　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tuntApiRet = clsCECoreAPI.PerformCallBack4(reftudtCALLBACKINFO,IntPtr.Zero,IntPtr.Zero,IntPtr.Zero );　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//clsCECoreAPI.Sleep(5000);<br>}<br>&nbsp;&nbsp;&nbsp;[DllImport("HookWindowsProcMFCDLL.dll")]<br>&nbsp;&nbsp;&nbsp;public static extern int fnAttachWinProc(IntPtr ni_hAttatchWin);<br>&nbsp;&nbsp;&nbsp;[DllImport("HookWindowsProcMFCDLL.dll")]<br>&nbsp;&nbsp;&nbsp;public static extern int fnDetachWinMsgProc(IntPtr ni_hDetachWin); <br>取消挂接的代码根据上述代码很容易就可以建立，不再细叙。<br>注：clsCECoreAPI的函数全是封装的标准CE API，由于这些API在msdn 中都有详细的文档注释，因篇幅所限，不再将代码一一列举.<br>在执行这个程序时，将模拟器的共享路径设为PC机的桌面，这样模拟器的storage card目录就等同桌面了，点模拟器的开始菜单，选程序，你就可以看到explore窗体的消息都输出到桌面的WinProcInfo.txt文件中了，运行结果如下：　　 　<br>目前本程序只在PPC2003/wm5 for PPC测试通过,由于smartphone系统在编译时使用了和ppc系统不同的机制，内存运作不明，本程序在smartphone上无法正确运行，有好的建议的话请指教一二,谢谢. <br>作者：莫艺潜转自：<a href="http://cqreview.yesky.com/dev/185/2590685.shtml">http://cqreview.yesky.com/dev/185/2590685.shtml</a><br><br>一个令我好奇的领域.
<img src ="http://www.cppblog.com/SpringSnow/aggbug/90247.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-07-16 16:11 <a href="http://www.cppblog.com/SpringSnow/archive/2009/07/16/90247.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转: 异步非阻塞套接字Winsock开发网络通信程序的经典入门</title><link>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90242.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Thu, 16 Jul 2009 07:56:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90242.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/90242.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90242.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/90242.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/90242.html</trackback:ping><description><![CDATA[转: 异步非阻塞套接字Winsock开发网络通信程序的经典入门<br>摘自: <a href="http://hi.baidu.com/mcu%5Fspaces/blog/item/aee07a66ed816323ab184cdf.html">http://hi.baidu.com/mcu%5Fspaces/blog/item/aee07a66ed816323ab184cdf.html</a><br><br><font face=Tahoma size=2>对于许多初学者来说，网络通信程序的开发，普遍的一个现象就是觉得难以入手。许多概念，诸如：同步(Sync)/异步(Async)，阻塞(Block)/非阻塞(Unblock)等，初学者往往迷惑不清，只知其所以而不知起所以然。</font>
<p><font face=Tahoma size=2><br>　　<font color=#ff00ff>异步方式指的是发送方不等接收方响应，便接着发下个数据包的通信方式；而同步指发送方发出数据后，等收到接收方发回的响应，才发下一个数据包的通信方式。<br></font><br>　　阻塞套接字是指执行此套接字的网络调用时，直到成功才返回，否则一直阻塞在此网络调用上，比如调用recv()函数读取网络缓冲区中的数据，如果没有数据到达，将一直挂在recv()这个函数调用上，直到读到一些数据，此函数调用才返回；而非阻塞套接字是指执行此套接字的网络调用时，不管是否执行成功，都立即返回。比如调用recv()函数读取网络缓冲区中数据，不管是否读到数据都立即返回，而不会一直挂在此函数调用上。在实际Windows网络通信软件开发中，异步非阻塞套接字是用的最多的。平常所说的C/S（客户端/服务器）结构的软件就是异步非阻塞模式的。<br><br>　　对于这些概念，初学者的理解也许只能似是而非，我将用一个最简单的例子说明异步非阻塞Socket的基本原理和工作机制。目的是让初学者不仅对Socket异步非阻塞的概念有个非常透彻的理解，而且也给他们提供一个用Socket开发网络通信应用程序的快速入门方法。操作系统是Windows 98（或NT4.0），开发工具是Visual C++6.0。<br><br>　　MFC提供了一个异步类CAsyncSocket，它封装了异步、非阻塞Socket的基本功能，用它做常用的网络通信软件很方便。但它屏蔽了Socket的异步、非阻塞等概念，开发人员无需了解异步、非阻塞Socket的原理和工作机制。因此，建议初学者学习编网络通信程序时，暂且不要用MFC提供的类，而先用Winsock2&nbsp;&nbsp;&nbsp;&nbsp; API，这样有助于对异步、非阻塞Socket编程机制的理解。<br><br>　　为了简单起见，服务器端和客户端的应用程序均是基于MFC的标准对话框，网络通信部分基于Winsock2 API实现。<br>　　先做服务器端应用程序。<br>　　用MFC向导做一个基于对话框的应用程序SocketSever，注意第三步中不要选上Windwos Sockets选项。在做好工程后，创建一个SeverSock，将它设置为异步非阻塞模式，并为它注册各种网络异步事件，然后与自定义的网络异步事件联系上，最后还要将它设置为监听模式。在自定义的网络异步事件的回调函数中，你可以得到各种网络异步事件，根据它们的类型，做不同的处理。下面将详细介绍如何编写相关代码。<br>　　在SocketSeverDlg.h文件的类定义之前增加如下定义：<br></font><font face=Fixedsys size=2><br>#define&nbsp;&nbsp;&nbsp;&nbsp; NETWORK_EVENT&nbsp;&nbsp;&nbsp;&nbsp; WM_USER+166&nbsp;&nbsp;&nbsp;&nbsp; file://定义网络事件<br>&nbsp;&nbsp;&nbsp;<br>SOCKET ServerSock; file://服务器端Socket<br>在类定义中增加如下定义：<br>class CSocketSeverDlg : CDialog<br>{<br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOCKET ClientSock[CLNT_MAX_NUM]; file://存储与客户端通信的Socket的数组</font></p>
<p><font face=Fixedsys size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*各种网络异步事件的处理函数*/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void OnClose(SOCKET CurSock);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file://对端Socket断开<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void OnSend(SOCKET CurSock);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file://发送网络数据包<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void OnReceive(SOCKET CurSock); file://网络数据包到达<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void OnAccept(SOCKET CurSock);&nbsp;&nbsp;&nbsp;&nbsp; file://客户端连接请求</font></p>
<p><font face=Fixedsys size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOL InitNetwork();&nbsp;&nbsp;&nbsp;&nbsp; file://初始化网络函数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void OnNetEvent(WPARAM wParam, LPARAM lParam); file://异步事件回调函数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;<br>};<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></font><font face=Arial size=2>在SocketSeverDlg.cpp文件中增加消息映射，其中OnNetEvent是异步事件回调函数名：</font><font face=Fixedsys size=2><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ON_MESSAGE(NETWORK_EVENT,OnNetEvent)<br></font><font face=Arial size=2>定义初始化网络函数，在SocketSeverDlg.cpp文件的OnInitDialog（）中调此函数即可。</font><font face=Fixedsys size=2><br>BOOL CSocketSeverDlg::InitNetwork()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WSADATA wsaData;</font></p>
<p><font face=Fixedsys size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //初始化TCP协议<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOL ret = WSAStartup(MAKEWORD(2,2), &amp;wsaData);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ret != 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox('初始化网络协议失败!');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face=Fixedsys size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建服务器端套接字<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServerSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ServerSock == INVALID_SOCKET)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox('创建套接字失败!');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; closesocket(ServerSock);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WSACleanup();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face=Fixedsys size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //绑定到本地一个端口上<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sockaddr_in localaddr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localaddr.sin_family = AF_INET;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localaddr.sin_port = htons(8888);&nbsp;&nbsp;&nbsp;&nbsp; //端口号不要与其他应用程序冲突<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localaddr.sin_addr.s_addr = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(bind(ServerSock ,(struct sockaddr*)&amp;localaddr,sizeof(sockaddr))<br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = = SOCKET_ERROR)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox('绑定地址失败!');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; closesocket(ServerSock);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WSACleanup();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将SeverSock设置为异步非阻塞模式，并为它注册各种网络异步事件，其中m_hWnd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //为应用程序的主对话框或主窗口的句柄<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(WSAAsyncSelect(ServerSock, m_hWnd, NETWORK_EVENT, FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE) == SOCKET_ERROR)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox('注册网络异步事件失败!');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WSACleanup();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listen(ServerSock, 5); file://设置侦听模式<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return TRUE;<br>}</font></p>
<p><font face=Arial size=2>下面定义网络异步事件的回调函数</font><font face=Fixedsys size=2><br>void CSocketSeverDlg::OnNetEvent(WPARAM wParam, LPARAM lParam)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //调用Winsock API函数，得到网络事件类型<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iEvent = WSAGETSELECTEVENT(lParam);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //调用Winsock API函数，得到发生此事件的客户端套接字<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOCKET CurSock= (SOCKET)wParam;</font></p>
<p><font face=Fixedsys size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch(iEvent)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case FD_ACCEPT:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //客户端连接请求事件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OnAccept(CurSock);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case FD_CLOSE:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //客户端断开事件:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OnClose(CurSock);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case FD_READ:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //网络数据包到达事件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OnReceive(CurSock);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case FD_WRITE:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //发送网络数据事件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OnSend(CurSock);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default: break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>}<br>&nbsp;&nbsp;&nbsp;</font><font face=Tahoma size=2><br>　　以下是发生在相应Socket上的各种网络异步事件的处理函数，其中OnAccept传进来的参数是服务器端创建的套接字，OnClose()、OnReceive()和OnSend()传进来的参数均是服务器端在接受客户端连接时新创建的用与此客户端通信的Socket。<br></font><font face=Fixedsys size=2>void CSocketSeverDlg::OnAccept(SOCKET CurSock)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //接受连接请求，并保存与发起连接请求的客户端进行通信Socket<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //为新的socket注册异步事件，注意没有Accept事件<br>}<br><br>void CSocketSeverDlg::OnClose(SOCET CurSock)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //结束与相应的客户端的通信，释放相应资源<br>}</font></p>
<p><font face=Fixedsys size=2>void CSocketSeverDlg::OnSend(SOCET CurSock)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //在给客户端发数据时做相关预处理<br>}</font></p>
<p><font face=Fixedsys size=2>void CSocketSeverDlg::OnReceive(SOCET CurSock)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //读出网络缓冲区中的数据包<br>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font face=Tahoma size=2><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>　　用同样的方法建立一个客户端应用程序。初始化网络部分，不需要将套接字设置为监听模式。注册异步事件时，没有FD_ACCEPT，但增加了FD_CONNECT事件，因此没有OnAccept()函数，但增加了OnConnect()函数。向服务器发出连接请求时，使用connect()函数，连接成功后，会响应到OnConnect()函数中。下面是OnConnect()函数的定义，传进来的参数是客户端Socket和服务器端发回来的连接是否成功的标志。<br></font><font face=Fixedsys size=2>void CSocketClntDlg::OnConnect(SOCKET CurSock, int error)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(0 = = error)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(CurSock = = ClntSock)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox('连接服务器成功!');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>}</font><font face=Tahoma size=2><br>　　定义OnReceive()函数，处理网络数据到达事件;<br>　　定义OnSend()函数，处理发送网络数据事件;<br>　　定义OnClose()函数，处理服务器的关闭事件。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>　　以上就是用基于Windows消息机制的异步I/O模型做服务器和客户端应用程序的基本方法。另外还可以用事件模型、重叠模型或完成端口模型，读者可以参考有关书籍。<br>　　在实现了上面的例子后，你将对Winsock编网络通信程序的机制有了一定的了解。接下来你可以进行更精彩的编程, 不仅可以在网上传输普通数据，而且还以传输语音、视频数据，你还可以自己做一个网络资源共享的服务器软件，和你的同学在实验室的局域网里可以共同分享你的成果。</font></p>
<p>&#160;</p>
<p>&#160;</p>
<p>同步服务器套接字挂起应用程序的执行，直到套接字上接收到连接请求。同步服务器套接字不适用于在操作中大量使用网络的应用程序，但它们可能适用于简单的网络应用程序。使用 <a href="http://msdn2.microsoft.com/zh-cn/library/system.net.sockets.socket.bind(VS.80).aspx"><u><font color=#0000ff>Bind</font></u></a> 和 <a href="http://msdn2.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(VS.80).aspx"><u><font color=#0000ff>Listen</font></u></a> 方法设置 <a href="http://msdn2.microsoft.com/zh-cn/library/system.net.sockets.socket(VS.80).aspx"><u><font color=#0000ff>Socket</font></u></a> 以在终结点上侦听之后，Socket 就可以随时使用 <a href="http://msdn2.microsoft.com/zh-cn/library/system.net.sockets.socket.accept(VS.80).aspx"><u><font color=#0000ff>Accept</font></u></a> 方法接受传入的连接请求了。应用程序被挂起，直到调用 Accept 方法时接收到连接请求。</p>
<div class=seeAlsoNoToggleSection>
<p>接收到连接请求时，Accept 返回一个与连接客户端关联的新 Socket 实例。下面的示例读取客户端数据，在控制台上显示该数据，然后将该数据回显到客户端。Socket 不指定任何消息协议，因此字符串&#8220;&lt;EOF&gt;&#8221;标记消息数据的结尾。它假定一个名为 <tt><font face=新宋体>listener </font></tt>的 Socket 已初始化，并绑定到一个终结点。</p>
<p>Console.WriteLine("Waiting for a connection...");<br>Socket handler = listener.Accept();<br>String data = null;</p>
<p>while (true) {<br>&nbsp;&nbsp;&nbsp;&nbsp; bytes = new byte[1024];<br>&nbsp;&nbsp;&nbsp;&nbsp; int bytesRec = handler.Receive(bytes);<br>&nbsp;&nbsp;&nbsp;&nbsp; data += Encoding.ASCII.GetString(bytes,0,bytesRec);<br>&nbsp;&nbsp;&nbsp;&nbsp; if (data.IndexOf("&lt;EOF&gt;") &gt; -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>Console.WriteLine( "Text received : {0}", data);</p>
<p>byte[] msg = Encoding.ASCII.GetBytes(data);<br>handler.Send(msg);<br>handler.Shutdown(SocketShutdown.Both);<br>handler.Close();</p>
<p>msdn官方说明:http://msdn2.microsoft.com/zh-cn/library/80z2essb(VS.80).aspx</p>
</div>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/90242.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-07-16 15:56 <a href="http://www.cppblog.com/SpringSnow/archive/2009/07/16/90242.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转: WinCE驱动开发问题精华集锦-4</title><link>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90241.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Thu, 16 Jul 2009 07:52:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90241.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/90241.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90241.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/90241.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/90241.html</trackback:ping><description><![CDATA[<div class=cnt id=blog_text>WinCE驱动开发问题精华集锦-4<br>摘自: <a href="http://hi.baidu.com/mcu%5Fspaces/blog/item/528dde03af8c5d733912bb40.html">http://hi.baidu.com/mcu%5Fspaces/blog/item/528dde03af8c5d733912bb40.html</a><br><br><span style="COLOR: red">61、WINCE的socket函数好像不支持发送/接收超时？</span>&nbsp;&nbsp; <br>是的，最早版本的WINCE支持选项SO_RCVTIMEO、SO_SNDTIMEO，后来却不支持了。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">62、WINCE下如何设置窗口最大化和最小化？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; WINCE的帮助文档在介绍API ShowWindow函数的参数时指出SW_MAXIMIZE, SW_MINIMIZE, SW_RESTORE, SW_SHOWDEFAULT, SW_SHOWMAXIMIZED, SW_SHOWMINIMIZED, SW_SHOWMINNOACTIVE都不被支持，但实际上并不完全是这样，具体来说：&nbsp;&nbsp; <br>SW_MAXIMIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比原来窗口大，但不是最大化&nbsp;&nbsp; <br>SW_MINIMIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编译成功，但是不起作用&nbsp;&nbsp; <br>SW_SHOWMAXIMIZED&nbsp;&nbsp;&nbsp;&nbsp; 最大化&nbsp;&nbsp; <br>SW_SHOWMINIMIZED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编译出错&nbsp;&nbsp; <br>SW_RESTORE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 能恢复&nbsp;&nbsp; <br>SW_SHOWDEFAULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编译出错&nbsp;&nbsp; <br>SW_SHOWMINNOACTIVE&nbsp;&nbsp; 编译出错&nbsp;&nbsp; <br>SW_HIDE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 能够隐藏&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">63、如何用程序调用控制面板的触摸屏校对程序？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 两种办法：&nbsp;&nbsp; <br>1）、调用API TouchCalibrate函数&nbsp;&nbsp; <br>2）、调用CreateProcess，参数1为L"\\windows\\ctlpnl.exe"，参数2为L"cplmain.cpl,9"。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">64、 如何获得U盘或者其它类型的存储器总容量和剩余可用容量？</span>&nbsp;&nbsp; <br>调&nbsp;&nbsp; 用API GetStoreInfo得到扇区数、每扇区字节数，相乘即是总容量。调用API GetDiskFreeSpaceEx得到剩余可用容量。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">65、三星2440头文件定义#define IIC_BASE 0xB1400000 // 54000000，datasheet是54000000，那么怎么转成0xB1400000？&nbsp;&nbsp; <br></span>&nbsp;&nbsp;&nbsp;&nbsp; 物理地址映射方法分为两种，一种静态映射另一种为动态映射。在OEMAddressTable中定义了物理地址与虚拟地址的映射关系属于静态映射，用VirtualCopy映射属于动态映射，采用哪种办法都可以。问题中提到的属于静态映射，2440的BSP在map.a文件中定义了IIC控制寄存器的物理起始地址和对应的虚拟地址如下：&nbsp;&nbsp; <br>DCD 0x91400000, 0x54000000, 1 ;&nbsp;&nbsp; <br>&nbsp;&nbsp; 在OEMAddressTable中定义的虚拟地址范围在0x8000 0000—0x9FFF FFFF，这部分可缓存，适合内核程序和应用程序使用，同时WINCE内核在0xA000 0000—0xBFFF FFFF中映射了另一份，指向了同样的物理地址，这部分不可缓存，适合驱动程序使用。三星ARM处理器带有L1级高速缓存，可缓存会提高执行效率。对于特殊的设备寄存器适合映射到不可缓存的虚拟地址。&nbsp;&nbsp; <br>&nbsp;&nbsp; 当驱动程序调用VirtualCopy对0xB1400000地址读写时，WINCE自动将这个地址减去0x2000 0000，也就是0x91400000，对应的物理地址就是0x54000000，也就是IIC控制寄存器的物理起始地址。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">66、基于RAM的注册表如何保存数据？&nbsp;&nbsp; <br></span>&nbsp;&nbsp; 调用API RegCopyFile备份注册表。调用API RegRestoreFile恢复注册表，然后调用KernelIoControl热启动使恢复生效。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">67、如何隐藏和显示winCE下标准外壳的任务栏？</span>&nbsp;&nbsp; <br>HANDLE&nbsp;&nbsp; hTaskBar = FindWindow(L"HHTaskBar", NULL);&nbsp;&nbsp; <br>ShowWindow(hTaskBar, SW_HIDE);&nbsp;&nbsp; <br>ShowWindow(hTaskBar, SW_SHOWNORMAL);&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">68、如果能让WINCE的IE浏览器播放flash动画？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 播放flash需要Macromedia Flash Player SDK，参见http://www.adobe.com/products/flashplayer_sdk/。这和real player相似，都需要WINCE平台的SDK，都需要申请。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">69、WINCE下内核模式和用户模式有什么区别？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 为了使读者能够详细了解WINCE的地址映射原理还有两种模式，在这里我分几个部分说明：&nbsp;&nbsp; <br>1）、WINCE内核nk.exe的任务是管理操作系统核心功能。按照OEMAddressTable的映射要求，所有物理地址都映射到0x80000000以上，所以对于内核程序nk.exe和内核模式下的线程来说，只要访问0x80000000以上的有效虚拟地址经MMU就能够访问物理地址，无需再映射是内核模式的一个特点。内核模式的第二个特点是没有地址访问限制，内核模式线程可以访问任何有效虚拟地址，所谓有效虚拟地址是指有实际事物对应。&nbsp;&nbsp; <br>2）、用户模式线程只能访问0x80000000以下的虚拟地址空间，WINCE6.0之前版本的内核为每个进程划分32MB的地址空间，在不调用特殊函数的情况下不能相互访问，这样的设计使得WINCE系统更安全、更稳定，限制访问地址是用户模式的第一个特点。第二个特点就是需要多一层映射，如果线程要访问物理内存的话需要先映射到0x80000000以上，再经MMU访问物理内存地址。&nbsp;&nbsp; <br>&nbsp;&nbsp; WINCE的线程具有转移性（参考API GetCallerProcess的说明，有一个很好的例子），当应用程序的线程调用API或者调用驱动程序接口函数时，该线程会转移到gwes.exe、device.exe、filesys.exe等进程中执行，转移是由WINCE内核操作的，它会修改线程的上下文，记录线程的当前进程、调用者进程、拥有者进程三个值。&nbsp;&nbsp; <br>3）、如果在定制内核的时候选择了&#8220;Full Kernel Mode&#8221;，那么在这个内核上运行的所有线程都处于内核模式，即使调用SetKMode(FALSE)后线程仍然具有内核模式的特点，能够访问任何有效的虚拟地址。假设现有一个64MB RAM的WINCE产品，RAM映射从0x80000000到0x84000000，如果线程处于内核模式，它就直接可以访问这个范围的虚拟地址：&nbsp;&nbsp; <br>&nbsp;&nbsp; 在OnButton1()中编写&nbsp;&nbsp; <br>DWORD oldMode = SetKMode(FALSE);&nbsp;&nbsp; <br>volatile int *piTemp = (volatile int*)(0x20000000+0x84000000-0x00019000); ///或者(0x84000000-0x00019000)&nbsp;&nbsp; <br>*piTemp = 12345;&nbsp;&nbsp; <br>在OnButton2()中编写&nbsp;&nbsp; <br>DWORD oldMode = SetKMode(FALSE);&nbsp;&nbsp; <br>volatile int *piTemp = (volatile int*)(0x20000000+0x84000000-0x00019000); ///或者(0x84000000-0x00019000)&nbsp;&nbsp; <br>int iTemp = *piTemp;&nbsp;&nbsp; <br>&nbsp;&nbsp; 先只执行OnButton1()然后关闭程序，再重启程序然后执行OnButton2()，iTemp仍然等于12345。结果说明了两点：内核模式线程可以直接访问0x80000000以上的有效虚拟地址；我们写到RAM中的数据没有丢失，说明虚拟地址有效。&nbsp;&nbsp; <br>&nbsp;&nbsp; 如果在定制内核的时候没有选择&#8220;Full Kernel Mode&#8221;，那么在这个内核上运行的所有线程都处于用户模式。可以调用SetKMode(TRUE)使调用线程暂时处于内核模式，还是原来的假设环境，我再举个例子：&nbsp;&nbsp; <br>在OnButton1()中编写&nbsp;&nbsp; <br>DWORD oldMode = SetKMode(TRUE);&nbsp;&nbsp; <br>volatile int *piTemp = (volatile int*)(0x20000000+0x84000000-0x00019000); ///或者(0x84000000-0x00019000)&nbsp;&nbsp; <br>*piTemp = 12345;&nbsp;&nbsp; <br>&nbsp;&nbsp; 在用户模式下，如果不调用SetKMode(TRUE)，那么执行*piTemp = 12345一定会弹出对话框，提示地址访问非法，如果调用SetKMode(TRUE)就不会提示地址访问非法，而且在OnButton2()中仍然能得到12345这个值。&nbsp;&nbsp; <br>&nbsp;&nbsp; 通过这两个例子我相信读者能够完全了解两种模式的区别了。&nbsp;&nbsp; <br>4）、WINCE提供了两个函数SetKMode和SetProcPermissions，其中SetKMode能够把调用线程切换到内核模式，还可以切换回用户模式。SetProcPermissions + GetCurrentPermissions添加当前进程访问权限给调用线程，SetProcPermissions (0xFFFFFFFF)能让调用线程访问所有进程空间，但是调用线程仍然处于用户模式。SetKMode和SetProcPermissions函数使得用户模式的特点不那么明晰。&nbsp;&nbsp; <br>&nbsp;&nbsp; 如上所说一个应用程序的线程可能转移到其它两个进程地址空间中读写数据，而每一个线程在被创建的时候只有访问创建它的进程地址空间的权限，所以驱动程序开发者必须在驱动程序读写数据前调用SetKMode或者SetProcPermissions增加调用此函数的线程访问其它进程空间的权限。如果一个应用程序的线程只转移到一个进程地址空间，一般为设备管理器进程device.exe，这种情况下不必增加线程访问其它进程空间的权限，但如果驱动程序本身创建了一个线程，那还是要调用SetKMode或者SetProcPermissions增加新的线程访问其它进程的权限的，因为驱动程序创建线程时，当前进程为设备管理器，所以新线程只具有访问设备管理器进程空间的权限，而不具备访问应用程序进程空间的权限。&nbsp;&nbsp; <br>5）、可能一个编写过简单的流驱动的初学者会很疑惑，因为开发一个简单的流驱动程序根本不需要调用这些函数，也没有调用过MapPtrToProcess，那是因为如果标准流驱动接口函数的参数为指针（ReadFile、WriteFile、DeviceIoControl参数都有指针），WINCE内核会自动映射指针包含的地址，但仅此而已，其余任何情况都要求开发者自行处理，比如流接口函数的参数是一个指向结构体的指针PA，而结构体中包括指针PB，PB指针就必须在流接口函数中映射，映射后才能访问，否则就会造成地址访问非法。所以结构体中每个指针都要映射。&nbsp;&nbsp; <br>&nbsp;&nbsp; 为了让读者能了解其中的原因，我举个例子：&nbsp;&nbsp; <br>&nbsp;&nbsp; 假设设备管理器被加载到Slot4，应用程序A被加载到Slot 8，A只有一个主线程T，T开始执行，按照WINCE的规定，正获得CPU的进程必须映射到Slot0，那么在执行代码的时候A的所有虚拟地址都被减去一个偏移值，也就是8&#215;0x02000000，A调用DeviceIoControl，传递一个指向一个结构体的指针B，而这个结构体中包含一个指针C，指针C包含的地址假设为0x00030000，当执行DeviceIoControl时WINCE把设备管理器的进程地址空间映射到Slot0，因为放在注册表[HKLM\Drivers\BuiltIn]下的驱动程序是由设备管理器加载的，自然驱动程序的代码段被加载到设备管理器进程空间，但是线程仍然是T，此时T的当前所在进程为设备管理器（CurrentProcess），A变成了T的调用者进程（CallerProcess），T自动具有了访问调用者进程空间的权限。这时访问Slot0中的虚拟地址其实质就是访问设备管理器的进程地址空间，要把地址加上一个偏移值，也就是4&#215;0x02000000，所以DeviceIoControl访问指针C包含的地址时本应该加上8&#215;0x02000000，却加上4&#215;0x02000000，结果地址并不是设备管理器的合法区域，系统就会提示地址访问非法。而如果做了一个映射，指针C包含的地址就会被加一个正确的偏移值，使地址处于A的地址空间Slot 8中，T此时具有访问A进程空间的权限，访问到正确的虚拟地址当然会得到正确的数据了。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">70、 为什么WINCE目录下的例子用build+sysgen能够编译成EXE文件，而我添加的例子就不能编译呢？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 如果这个例子是一个应用程序，那么肯定包括代码文件（.h .c .cpp）和资源文件（.rc和其它资源文件），build工具根据source文件内容把代码文件编译成lib文件，资源文件编译成.res文件，sysgen工具根据makefile文件内容将source文件中列出的需要链接的各个库文件合并成一个EXE文件。所以说关键在于makefile文件，WINCE目录下凡是能够用build+sysgen编译的都在makefile中有如何链接的设置，而我们添加的例子当然没有在makefile中找到如何链接的设置，nmake工具就会提示不知道如何创建。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">71、pcienum.exe干什么用的？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 如果你要开发某一个PCI设备的驱动程序，首先要知道这个PCI设备的信息（如VendorID、DeviceID、BaseClass、SubClass）和PCI总线的信息。运行这个pcienum.exe就能得到相关信息。pcienum.exe提供了源码，位置\Public\Common\Oak\Drivers\Ceddk\Test\Pcienum。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">72、wince下如何让操作系统进入待机模式？又如何把它激活？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 通过注册表就可以设置，前提是你的驱动和硬件都支持。注册表项参见标题为&#8220;GWES Suspend Time-outs&#8221;的帮助文档。&nbsp;&nbsp; <br>[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Power]&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "BattPowerOff"=dword:300&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "ExtPowerOff"=dword:0&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "WakeupPowerOff"=dword:60&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "ScreenPowerOff"=dword:0&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">73、 现有一个GPRS模块，如何通过GPRS连接到Internet？</span>&nbsp;&nbsp; <br>1）、先在内核中加入WAN下面的几个组件，如RAS/PPP、TAPI。WINCE采用unimodem驱动，所以不必担心没有Modem驱动的支持。&nbsp;&nbsp; <br>2）、WINCE启动后新建一个拨号连接，比如名称叫&#8220;gprs1&#8221;，输入用户名、密码、电话号码。电话号码不同，所采用的模式不一样，例如&#8220;*99#&#8221;是GPRS模式，&#8220;17201&#8221;是普通的数据模式，速度差很多，价钱也差很多。&nbsp;&nbsp; <br>3）、开始连接，连接过程会在对话框中显示，直到显示&#8220;连接成功&#8221;。&nbsp;&nbsp; <br>4）、打开浏览器或者自己开发的通讯软件测试网络连接情况。&nbsp;&nbsp; <br>5）、关闭连接。&nbsp;&nbsp; <br>6）、保存[HKEY_CURRENT_USER\Comm\RasBook\gprs1]下的所有数据，添加到project.reg中，重新编译后内核中就有了一个拨号连接&#8220;gprs1&#8221;。&nbsp;&nbsp; <br>7）、调用RAS函数可以修改拨号连接&#8220;gprs1&#8221;的参数，如用户名、密码、电话号码，但是不能修改硬件设置，如波特率、串口、数据位、停止位等。RAS函数还能够拨号、挂断。为了修改波特率可以多保存几个拨号连接，也可以直接调用TAPI开发拨号软件，另外WINCE自带的拨号连接是有源码的，位置在\PUBLIC\COMMON\OAK\DRIVERS\NETSAMP\CONNMC。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">74、采用基于HIVE的注册表如何删除用户保存在注册表中的数据，恢复到出厂时的注册表？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 用户修改的数据保存在user.hv文件中，直接删除一定失败，所以不能通过删除文件实现恢复出厂设置。微软考虑到了这个问题，在WINCE启动过程中filesys.exe加载注册表时会调用OEMIoControl函数并传递一个IOCTL，这个IOCTL在pkfuncs.h中定义如下：&nbsp;&nbsp; <br>#define&nbsp;&nbsp; IOCTL_HAL_GET_HIVE_CLEAN_FLAG&nbsp;&nbsp; CTL_CODE(FILE_DEVICE_HAL, 49, METHOD_BUFFERED, FILE_ANY_ACCESS)&nbsp;&nbsp; <br>f&nbsp;&nbsp; ilesys.exe会分别传递参数HIVECLEANFLAG_SYSTEM和HIVECLEANFLAG_USERS，如果返回值为TRUE那么filesys.exe清除原来的注册表文件，如果返回值为FALSE那么filesys.exe保留原来的注册表文件。默认WINCE并没有实现这个IOCTL，所以OEM要删除注册表文件就必须先编写这个IOCTL代码。代码的例子可参考标题为&#8220;IOCTL_HAL_GET_HIVE_CLEAN_FLAG&#8221;的帮助文档。另外必须在ioctl.h和ioctl.c两个文件中编写该代码。在ioctl.c文件中找到const OAL_IOCTL_HANDLER g_oalIoCtlTable[]，添加IOCTL和对应的处理函数。要进一步了解这个全局数组，参见标题为&#8220;IOCTL Library&#8221;的帮助文档。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">75、如何在不删除必要组件的前提下减小内核文件长度？&nbsp;&nbsp; <br></span>&nbsp;&nbsp; 要减小内核文件长度首先要在使用PB的定制内核向导中选择自定义，也就是说对于每个组件都由自己来选择，而不是选择PB的标准配置。但减小内核文件长度最有效最直接的办法是缩小字体，尤其对于东亚字体，采用字体压缩技术并且选择合理的字库文件将明显缩小文件长度。&nbsp;&nbsp; <br>1）、在定制内核时选择AGFA AC3 Font Compression组件。SYSGEN变量为SYSGEN_AGFA_FONT。&nbsp;&nbsp; <br>2）、参考标题为&#8220;East Asian Font Versions&#8221;的帮助文档，从中选择你需要的字库文件加到内核中，从文档可以看出加AC3压缩比不加压缩在文件长度方面差距很大。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">76、如何得到WAV文件播放的总时间？</span>&nbsp;&nbsp; <br>1、直接读取wav文件头信息，从文件起始地址偏移28个字节长度为4个字节保存的是每秒钟播放的字节数，从文件起始地址偏移40个字节长度为4个字节保存的是声音数据的总的字节数，相除就是播放时间。&nbsp;&nbsp; <br>2、调用IGraphBuilder::RenderFile打开一个wav文件，然后通过IGraphBuilder得到IMediaSeeking指针，再调用IMediaSeeking::GetDuration得到总的时间（结果要除以10000000），IMediaSeeking::GetCurrentPosition得到当前播放时间。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">77、如何在Dialog-Based程序中加入menubar？&nbsp;&nbsp; <br></span>&nbsp;&nbsp; 先调用CommandBar_Create再调用CommandBar_InsertMenubar。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">78、请问MultiByteToWideChar与_T、L、TEXT的区别？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; MultiByteToWideChar函数转换的对象可以是常量也可以是变量。其它只能转换常量。_T和TEXT会根据当前系统是否定义_UNICODE宏来决定是否转换，而L就是转换成宽字符，当然也包括其他类型常量的转换。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">79、 在用USB线缆通过ActiveSync同步有效的情况下，如何插上USB线缆后WINCE自动与PC同步？</span>&nbsp;&nbsp; <br>1）、新建一个拨号连接，假设名称为&#8220;usb1&#8221;，选择连接类型为&#8220;直接连接&#8221;，并在连接设备里选择通过USB线缆连接。&nbsp;&nbsp; <br>2）、将注册表[HKEY_CURRENT_USER\Comm\RasBook\usb1]下的数据添加到project.reg或者platform.reg中。&nbsp;&nbsp; <br>3）、在[HKEY_CURRENT_USER\ControlPanel\Comm]下添加如下：&nbsp;&nbsp; <br>"AutoCnct"=dword:1&nbsp;&nbsp; ///直接连接&nbsp;&nbsp; <br>"Cnct"="usb1"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///连接名称&nbsp;&nbsp; <br>4）、重新编译内核。为了节省编译时间也可以在内核工程下搜索*.reg文件，将2、3步骤中的注册表数据添加其中，然后直接make image。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">80、如何通过进程句柄来获得该进程的主窗口句柄？&nbsp;&nbsp; <br></span>&nbsp;&nbsp; 好像没有API能够通过进程句柄直接获得主窗口的句柄，因为并非每个应用程序都带UI。但是可以反过来，先枚举当前系统所有主窗口，然后根据每个窗口的句柄调用GetWindowThreadProcessId函数得到进程的ID，再调用OpenProcess得到进程句柄，与现有的进程句柄比较。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">81、我做的显示驱动DLL已经编译成功了，但是在加载显示驱动的过程中弹出话框，提示如下：</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; unhandled exception&nbsp;&nbsp; in&nbsp;&nbsp; gwes.exe&nbsp;&nbsp; (0xc0000005 access violation)&nbsp;&nbsp; <br>&nbsp;&nbsp; 提示的错误——地址访问非法，表明你的驱动程序代码并没有在读写数据前添加SetKMode(TRUE)或者SetProcPermissions(0xFFFFFFFF)函数让线程能够访问任何进程的地址空间。你可以调用 IsBadReadPtr和IsBadWritePtr函数检测地址是否能够合法访问。编写和gwes有关的驱动程序应该首先调用SetKMode(TRUE)或者SetProcPermissions(0xFFFFFFFF)函数，这是一个好习惯。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">82、请问在嵌入式系统中如何设置GPRS拔号用的APN？</span>&nbsp;&nbsp; <br>对一个拨号连接比如&#8220;我的连接&#8221;单击鼠标右键，在弹出的菜单中选择&#8220;属性&#8221;，然后单击&#8220;配置&#8221;—&#8220;拨号选项&#8221;，在&#8220;附加设置&#8221;中添加AT命令如&#8220;+cgdc,"ip","cmnet"&#8221;。&#8220;cmnet&#8221;位置即为APN。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">83、WINCE的IP Phone功能如何？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; WINCE的voip需要c-s-c结构，既需要服务器的中转，而skype采用第三代p2p技术就不需要中转，但是在gprs下也做不到语音流畅。skype有pocket pc版本，但是无线方面需要wlan或者cdma。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">84、 三星ARM平台如何定义自己的中断ID？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 以S3C2410为例，在oalintr.h文件中定义中断ID，也称SYSINTR，例如 #define SYSINTR_MYINT&nbsp;&nbsp; (SYSINTR_FIRMWARE+20)，最大值不能超过SYSINTR_FIRMWARE+23。然后在armint.c文件中找到OEMInterruptHandler函数，用if (IntPendVal == INTSRC_XXX) 判断当前发生的中断源号，然后返回SYSINTR_MYINT。内核分别调用OEMInterruptDisable（禁止当前中断）、OEMInterruptDone（中断处理结束）、OEMInterruptEnable（当前中断有效）三个函数，参数都为中断ID，在这三个函数中用 case SYSINTR_MYINT判断当前要处理的中断。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">85、如何开发软件从PC端复制文件到基于WINCE的设备？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 调用RAPI（Remote Application Programming Interface）函数，此函数集由桌面计算机调用，由基于WINCE的设备执行。一旦连接上就可以在桌面计算机端调用RAPI。通过注册表还可以限制RAPI能够访问目录的范围。具体参考RAPI和RDP（远程桌面协议）。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">86、请问如何对NandFlash分区、格式化？&nbsp;&nbsp; <br></span>&nbsp;&nbsp; 你看看WINCE420\PUBLIC\COMMON\OAK\DRIVERS\ETHDBG\BOOTPART\bootpart.cpp，在Eboot中先要调用BP_LowLevelFormat(&nbsp;&nbsp; <br>DWORD dwStartBlock, DWORD dwNumBlocks, DWORD dwFlags)再flash的一个区域建立空的MBR,然后连续两次调用BP_OpenPartition(DWORD dwStartSector, DWORD dwNumSectors, DWORD dwPartType, BOOL fActive, DWORD dwCreationFlags)函数来建立BINFS和FAT分区。建好后，将nk.bin烧入binfs分区中。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">87、要做个弹出对话框具有 always on top 属性，如何实现？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 调用SetWindowPos(.. , HWND_TOPMOST, ...., SWP_NOACTIVATE)。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">88、s3c2410＋WINCE下网络PING一会就断，如何解决？&nbsp;&nbsp; <br></span>&nbsp;&nbsp; 原因在于中断处理程序把已经产生的中断标志清除掉了，这样就丢失一次中断。因为原驱动里配置中断为上升沿触发，一次中断丢失就导致不会再产生中断信号跳变，因为只有在中断服务中读取了cs8900的 Interrupt status queue寄存器后，才会产生下一次中断！解决办法：&nbsp;&nbsp; <br>1）、在cfw.c文件中全局定义BOOL Inited = FALSE&nbsp;&nbsp; <br>2）、修改OEMInterruptEnable()中case SYSINTR_ETHER: 下面的语句为：&nbsp;&nbsp; <br>if(Inited == FALSE)&nbsp;&nbsp; <br>{&nbsp;&nbsp; <br>s2410IOP-&gt;rEINTPEND = 0x200;&nbsp;&nbsp; <br>s2410INT-&gt;rSRCPND = BIT_EINT8_23;&nbsp;&nbsp; <br>if (s2410INT-&gt;rINTPND &amp; BIT_EINT8_23)&nbsp;&nbsp; <br>s2410INT-&gt;rINTPND = BIT_EINT8_23;&nbsp;&nbsp; <br>Inited = TRUE;&nbsp;&nbsp; <br>}&nbsp;&nbsp; <br>s2410IOP-&gt;rEINTMASK &amp;= ~0x200;&nbsp;&nbsp; <br>s2410INT-&gt;rINTMSK &amp;= ~BIT_EINT8_23;&nbsp;&nbsp; <br>break；&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">89、已经搜索到文件，如何用CListBox以图标形式显示出来？&nbsp;&nbsp; <br></span>CListCtrl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ListCtrl;&nbsp;&nbsp; <br>CImageList&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImageList;&nbsp;&nbsp; <br>ImageList.Create(IDB_BITMAP, 48, 2, RGB(0,0,0));&nbsp;&nbsp; <br>ListCtrl.SetImageList(&amp;ImageList, LVSIL_NORMAL);&nbsp;&nbsp; <br>ListCtrl.InsertItem(iListIndex, strItem, 1);&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">90、如何改变控制面板中电源属性对话框的尺寸?</span>&nbsp;&nbsp; <br>1）、需要修改对话框的尺寸是因为对话框是以资源方式加载的，不会根据当前系统显示分辨率而自我调节尺寸。&nbsp;&nbsp; <br>2）、安装WINCE后有一些组件（feature）的资源文件*.res就已经有了，如果你不改变，那么build内核的时候PB只是把这些.res复制到工程目录下，然后与*.obj合并成EXE、DLL、CPL。所以修改了.rc文件里面的对话框尺寸后要重新编译.rc文件为.res文件，然后再覆盖原来WINCE自带的.res文件。&nbsp;&nbsp; <br>3）、改变对话框尺寸有两种办法：一种方法是更改系统字体字号，系统字体的字号变化会影响对话框的尺寸，但是缺点是所有系统字体有关的UI都会改变。另一种是在.rc文件中调整对话框尺寸，然后编译成.res文件，再将.res复制到对应的语言目录里，比如目录名为0804（中文），再执行Rebuild命令重新编译内核，或者执行sysgen＋build。在研究中我发现.res文件虽然能够直接用EVC打开、修改、保存，但是和其它Obj链接成EXE、DLL、CPL后并不能运行，所以还是建议读者用CE自带的rc工具编译最好。读者可在PB的命令行中键入&#8220;rc /?&#8221;了解rc.exe工具的用途和参数。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">91、使用EVC build之后连接模拟器的时候，提示download file等了一会又出现download failed？&nbsp;&nbsp; <br>一般这样的问题从下面几个步骤解决：&nbsp;&nbsp; <br></span>1）、如果之前能启动模拟器而现在不能，那么先clean然后重启计算机再build。&nbsp;&nbsp; <br>2）、如果开发的主机为WINXP+SP2，可能存在与EVC模拟器不兼容的情况，检查C:\boot.ini，将/noexecute=optin改为/execute=optin。&nbsp;&nbsp; <br>3）、检查你的模拟器是否能运行，假设你正用的SDK名称为MYSDK，单击菜单tools—configure platform manager，选择MYSDK—MYSDK emulator，再单击properties—test，看看模拟器是否能够启动，如果能启动那问题就不大。&nbsp;&nbsp; <br>4）、单击菜单build—update remote output files，看看模拟器是否能够启动。&nbsp;&nbsp; <br>5）、如果上述办法均不行，关闭EVC然后重新建立一个新的工程，编译，看看模拟器是否能够启动，如果能启动说明原来工程出了问题，最好恢复原工程的备份。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">92、如何设置能够自动拨号、禁止自动拨号？</span>&nbsp;&nbsp; <br>在[HKEY_LOCAL_MACHINE\Comm\Autodial]下是自动拨号的注册表设置。&nbsp;&nbsp; <br>Enabled=DWORD:1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///是否能够自动拨号&nbsp;&nbsp; <br>FailRetryWaitMS=DWORD&nbsp;&nbsp;&nbsp;&nbsp; ///如果失败再次拨号的等待时间&nbsp;&nbsp; <br>RasEntryName1= REG_SZ&nbsp;&nbsp;&nbsp;&nbsp; ///自动拨号采用的拨号连接名称&nbsp;&nbsp; <br>更多细节请参考标题为&#8220;Auto Dial Registry Settings&#8221;的帮助文档。</div>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/90241.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-07-16 15:52 <a href="http://www.cppblog.com/SpringSnow/archive/2009/07/16/90241.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转: WinCE驱动开发问题精华集锦-3</title><link>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90236.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Thu, 16 Jul 2009 07:45:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90236.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/90236.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90236.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/90236.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/90236.html</trackback:ping><description><![CDATA[WinCE驱动开发问题精华集锦-3<br>摘自: <a href="http://hi.baidu.com/mcu%5Fspaces/blog/item/4f3139df56ec7e1763279847.html">http://hi.baidu.com/mcu%5Fspaces/blog/item/4f3139df56ec7e1763279847.html</a><br><br><span style="COLOR: red">41、WinCE下如何读写几百兆的大文件呢? 使用内存映射文件吗?</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 一般嵌入式设备配备128MB物理内存就算顶级的了，所以要读写几百MB的文件用内存映射文件技术是最好的选择了。映射文件之后读数据是非常容易的，要注意的是写数据，内存映射方面的API没有提供改变文件长度的功能，所以要在关闭映射文件对象后用文件API改变文件长度。&nbsp;&nbsp; <br><br><span style="COLOR: red">42、请问如何改系统调度的默认时间片值？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 更改schedule.c文件中的dwDefaultThreadQuantum 变量，然后重新编译该文件并SYSGEN。调用API CeGetThreadQuantum就知道更改是否生效。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">43、如何让系统加载自己写的驱动程序？</span>&nbsp;&nbsp; <br>两种办法：&nbsp;&nbsp; <br>1）、在[HKEY_LOCAL_MACHINE\Drivers\BuiltIn]下添加注册键。&nbsp;&nbsp; <br>2）、在应用程序中调用ActivateDeviceEx。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">44、在一些文件中用分号来表示注释，例如下面的内容&nbsp;&nbsp; <br>; @CESYSGEN IF SERVERS_MODULES_HTTPD&nbsp;&nbsp; <br>; @CESYSGEN ENDIF&nbsp;&nbsp; <br>在&#8220;CESYSGEN...&#8221;前加了&#8220;@&#8221;，有没有什么特别的含义？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; 在WINCE的一些文件中，用&#8220;;&#8221;作为注释并在注释文字中用@CESYSGEN作为标记，后面接条件语句。Cefilter.exe工具负责按照条件来筛选文件内容，所以不要轻易地删除包含@CESYSGEN的注释语句。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">45、通过串口建立ActiveSync联接,串口线用三线的可以吗?</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 不可以，因为用串口同步时要用到其余口的状态。&nbsp;&nbsp; <br><br><span style="COLOR: red">46、 WINCE是否支持MAPI？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 不支持。 <br><br><span style="COLOR: red">47、如何旋转屏幕显示的内容？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 例子代码如下（前提是显示驱动程序支持旋转）：&nbsp;&nbsp; <br>DEVMODE&nbsp;&nbsp; devmode = {0};&nbsp;&nbsp; <br>devmode.dmSize = sizeof(DEVMODE);&nbsp;&nbsp; <br>devmode.dmDisplayOrientation = DMDO_90;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///垂直模式&nbsp;&nbsp; <br>devmode.dmFields = DM_DISPLAYORIENTATION;&nbsp;&nbsp; <br>ChangeDisplaySettingsEx(NULL, &amp;devmode, NULL, 0, NULL);&nbsp;&nbsp; ///改变显示的设置&nbsp;&nbsp; <br>CRect&nbsp;&nbsp; rcWorkArea(0, 0, 320, 240);&nbsp;&nbsp;&nbsp;&nbsp; ///整个屏幕尺寸&nbsp;&nbsp; <br>///设置客户区大小并广播消息，这样所有软件也就随之更改显示&nbsp;&nbsp; <br>SystemParametersInfo(SPI_SETWORKAREA, 0, (void*)&amp;rcWorkArea, SPIF_SENDCHANGE);&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">48、请问如何修改字形缓存的容量？</span>&nbsp;&nbsp; <br>[HKEY_LOCAL_MACHINE\System\GDI\GLYPHCACHE]&nbsp;&nbsp; <br>"limit"=dword:0400&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">49、 如何得到从WINCE启动开始到现在的时间？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 调用API GetTickCount，得到的值为32位整数，单位为毫秒。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">50、如何调用WINCE的软键盘？</span>&nbsp;&nbsp; <br>调用API SipShowIM(SIPF_ON)，前提是内核加入了软键盘组件。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">51、 基于HIVE的注册表，如何在系统关闭前保存注册表的数据到文件system.hv？</span>&nbsp;&nbsp; <br>调用API RegFlushKey函数。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">52、使用VirtualAlloc和VirtualCopy的时候需要注意哪些事项？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 1）、VirtualAlloc的作用是申请虚拟地址空间，这肯定不是最终的目的，最终目的可能是申请物理内存、映射寄存器、提交文件等。没有一个目的会在意虚拟地址空间的位置，所以尽量传递参数1为0，也就是让WINCE自动分配虚拟地址空间。VirtualAlloc分配地址空间实际上是以64KB为单位，所以要指定申请的虚拟空间的首地址的话，参数1应该为64KB的整数倍，申请的长度也应该为64KB的整数倍，即使你不需要那么大。&nbsp;&nbsp; <br>&nbsp;&nbsp; 2）、VirtualCopy的主要作用是映射物理地址空间，如果参数2为物理地址，那么最后一个参数要添加PAGE_PHYSICAL，参数2必须是256的整数倍。如果参数2为虚拟地址（0x80000000以上），那么最后一个参数就不要添加PAGE_PHYSICAL，WINCE内核会根据这个虚拟地址找到对应的物理地址。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">53、驱动程序和应用程序之间传递数据时何时调用MapPtrToProcess？&nbsp;&nbsp; <br></span>&nbsp;&nbsp; 因为设备管理器负责加载驱动程序DLL，这意味着当应用程序调用驱动程序接口函数的时候，WINCE内核会将调用驱动程序接口函数的线程转移到设备管理器的进程空间然后执行具体的驱动程序代码，应用程序和设备管理器处于两个进程空间，这就造成设备管理器无法访问应用程序传递的指针（虚拟地址），所以当我们在应用程序中传递指针给流驱动程序接口函数时，WINCE内核从中作了一个地址映射，例如ReadFile、WriteFile、DeviceIoControl函数的参数凡是指针都经过了映射才传递给驱动程序，所以很多驱动程序开发者并不了解其中的奥秘就可以编程了。但是如果参数是一个指向一个结构体的指针，而结构体里包括一个或多个指针，那么WINCE内核并不负责映射，所以就需要开发者在驱动程序接口函数中调用API函数MapPtrToProcess来映射地址。例如：pPointer_retval = MapPtrToProcess(pPointer, GetCallerProcess());&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">55、 如何判断可插拔的设备是否存在？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 1）、通过查找注册表的值。凡是由API ActivateDeviceEx加载的驱动程序都在[HKEY_LOCAL_MACHINE\Drivers\Active]键下有注册键，通过查找&#8220;name&#8221;或者其它键值就能够找到。设备管理器就调用这个API。如果是PCI设备，在注册表[HLM\Drivers\BuiltIn\PCI\Instance]下查找关键字，例如[HLM\Drivers\BuiltIn\PCI\Instance\WaveDev1]，说明音频驱动已经加载。&nbsp;&nbsp; <br>&nbsp;&nbsp; 2）、调用驱动程序接口函数，根据返回值或者执行结果来判断。&nbsp;&nbsp; <br><br><span style="COLOR: red">56、如何做到通过串口过来的一个信号启动自己开发的应用程序？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 创建一个线程负责等待串口过来的信号，调用API SetCommMask设置要等待的信号种类，具体可以等待的信号种类参见参数2的说明。然后再调用API WaitCommEvent函数等待这个信号，接收之后再调用API CreateProcess启动应用程序。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">57、在WINCE中如何只能启动应用程序的一个实例？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 常用的两种办法：&nbsp;&nbsp; <br>1）、如果应用程序实例创建了窗口，可通过API FindWindow函数通过窗口类名和窗口标题名称来查找，前提是系统内不会出现窗口名称重复的情况。&nbsp;&nbsp; <br>2）、应用程序初始化的时候创建一个事件或互斥等内核对象，因为内核对象是由内核创建，名称在系统内唯一。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">58、能不能自己编辑一个数字签名文件导入到手机上，这样就可以用这个签名签自己的程序了？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; WINCE的内核签名机制的用途是限制非法的可执行模块EXE、DLL等在设备上运行。要求内核的加载模块用公钥验证请求加载的EXE、DLL的签名是否合法，而这个公钥是在定制内核的时候加进去的，所以除内核的定制者以外的人无法修改这个验证机制。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">59、 在WINCE下是否能够得到某一进程使用的物理内存总量？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 目前没发现有这样一个API能够得到指定进程使用的物理内存总量。只有GlobalMemoryStatus能够得到整个系统使用的物理内存总量。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">60、 应用程序如何控制lcd的亮度？如何获得电池的电量？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 从常见的平台如Geode、三星ARM系列来看，的确在驱动方面没有统一的控制LCD或者其它种类屏幕亮度的接口函数，所以只能根据具体平台提供的接口来做。从帮助文档来看微软的带有DirectDraw功能的显示驱动程序的确有标准的增加亮度的接口函数，关于背景光参见标题为&#8220;Enabling a Backlight&#8221;的帮助文档。&nbsp;&nbsp; <br>获得电池电量有标准的接口函数GetSystemPowerStatusEx，前提是驱动程序和硬件都要支持。
<img src ="http://www.cppblog.com/SpringSnow/aggbug/90236.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-07-16 15:45 <a href="http://www.cppblog.com/SpringSnow/archive/2009/07/16/90236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转: WinCE驱动开发问题精华集锦-2</title><link>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90235.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Thu, 16 Jul 2009 07:41:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90235.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/90235.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/90235.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/90235.html</trackback:ping><description><![CDATA[WinCE驱动开发问题精华集锦-2<br>摘自: <a href="http://hi.baidu.com/mcu%5Fspaces/blog/item/f14d1d2af1a2e33c5243c144.html">http://hi.baidu.com/mcu%5Fspaces/blog/item/f14d1d2af1a2e33c5243c144.html</a><br><br><br><span style="COLOR: red">21、 文件格式如下所示，我想把每行的4个值读到4个变量中，用EVC如何编程？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 第一行： 460.000,&nbsp;&nbsp; 3384672.357342,&nbsp;&nbsp; 521268.972763&nbsp;&nbsp; <br>&nbsp;&nbsp; 第二行： 475.117,&nbsp;&nbsp; 3384663.772419,&nbsp;&nbsp; 521281.415271&nbsp;&nbsp; <br>&nbsp;&nbsp; 伪代码如下：&nbsp;&nbsp; <br>FILE&nbsp;&nbsp; *stream;&nbsp;&nbsp; <br>stream = _wfopen(L"\\a.txt", L"r+");&nbsp;&nbsp; <br>if( stream == NULL )&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; return;&nbsp;&nbsp; <br>fseek(stream, 0L, SEEK_SET );&nbsp;&nbsp; <br>while( !feof( stream ) )&nbsp;&nbsp; <br>{&nbsp;&nbsp; <br>fwscanf(stream, L"%s", WCHAR1);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; fwscanf(stream, L"%f", float1);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; fwscanf(stream, L"%f", float2);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; fwscanf(stream, L"%f", float3);&nbsp;&nbsp; <br>}&nbsp;&nbsp; <br>fclose( stream );&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">22、GWES组件的功能有哪些？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; GWES不仅负责GDI、窗口、消息，还负责管理本机设备驱动程序，负责加载显示、键盘鼠标、触摸屏驱动程序，而且GWES本身包含电源、LED驱动程序。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">23、如何在PB中预先设定好存储内存和程序内存的大小，我想多划分一些空间给程序内存？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 两种办法：&nbsp;&nbsp; <br>&nbsp;&nbsp; 1）、在定制内核时在config.bib文件中设置FSRAMPERCENT = number，具体number可参考标题为&#8220;FSRAMPERCENT &#8221;的帮助文档。这种办法是修改内核的设置，所有一直有效。&nbsp;&nbsp; <br>&nbsp;&nbsp; 2）、在应用程序中调用API SetSystemMemoryDivision，如果函数返回SYSMEM_CHANGED表示成功，如果返回SYSMEM_MUSTREBOOT表示需要热启动才能有效。这种办法需要每次启动后调用API才有效。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">24、 如何取消鼠标光标？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 通过取消SYS变量来实现此目的，在PB命令行下键入&#8220;set SYSGEN_CURSOR=&#8221;，然后回车确认。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">25、EVC下调用TextOut如何编译会出错？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; 类似这样的问题很多，这是因为EVC的帮助文档内容有错误。可能EVC的帮助文档内容是从桌面Windows帮助文档复制过来的，所以很多API函数还有例子代码都有错误，例如帮助文档中包含一个API函数的说明，但是实际编译的时候提示没有这个API，有的例子代码采用ANSI字符串，而WINCE的API都是宽字符版本，造成直接复制过来编译失败。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; 因为MFC for WINCE的CDC类中没有TextOut成员函数，所以编译会出错，可以用其它类成员函数ExtTextOut或者DrawText替换。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">26、我如何将我的dll软件让现有的ce系统认可？尽管我也知道应该使用signfile.exe程序进行签名，但是我并不知道那个ce系统认可的签名应该是啥&nbsp;&nbsp; <br></span>&nbsp;&nbsp;&nbsp;&nbsp; 如果你说的WINCE系统内核已经加入了签名认证机制，那么没有私钥对你的DLL文件签名肯定是无法运行在此内核中的，一般签名密钥的密钥长度都是1024位，很难破解。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">27、如果查看WINCE注册表中的内容？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 两种办法：&nbsp;&nbsp; <br>&nbsp;&nbsp; 1）、建立同步后，用EVC自带的工具&#8220;Remote Registry Editor&#8221;打开查看。&nbsp;&nbsp; <br>&nbsp;&nbsp; 2）、从网上下载注册表查看工具，放到WINCE设备中。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">28、调用directshow出现链接错误，如何解决？</span>&nbsp;&nbsp; <br>player.obj : error LNK2001: unresolved external symbol _IID_IVideoWindow&nbsp;&nbsp; <br>player.obj : error LNK2001: unresolved external symbol _IID_IMediaControl&nbsp;&nbsp; <br><br>这是因为链接器没有找到合适的.lib文件。两种办法：&nbsp;&nbsp; <br>1）、在EVC菜单Tools—options—directories 里把library files的路径重新调整一下。如果你只安装了EVC自带的Standard SDK而没有其它SDK，可以指定WINCE目录中的.lib文件路径，例如D:\WINCE500\PUBLIC\DIRECTX\OAK\LIB\X86\RETAIL。注意CPU的类型。&nbsp;&nbsp; <br>2）、安装SDK，前提是导出SDK的PB内核工程必须包括DirectShow或者其它组件。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">29、在PB的config.bib文件中，&#8220;IMGFLASH&#8221;表示什么意思呢？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; 表示能够刷NK到ROM中，具体请查看标题为&#8220;IMG Environment Variables&#8221;的帮助文档。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">30、x86平台如何映射各种地址空间？如何编写中断服务例程？</span>&nbsp;&nbsp; <br>如果是x86平台，可以调用HalTranslateBusAddress转换物理总线地址到物理系统地址，调用HalTranslateSystemAddress转换物理系统地址到逻辑总线地址，也可以不调用这两个函数，因为x86平台除32位物理地址外还有16位的IO地址空间，对于16位的IO地址空间，可以直接调用WRITE_PORT_UCHAR或者READ_PORT_UCHAR等函数直接读写端口。对于32位物理地址可以调用VirtualAlloc和VirtualCopy来映射。这样做思路清晰，简单明了。&nbsp;&nbsp; <br>在x86平台要实现ISR，有如下几个步骤（以Geode BSP为例）：&nbsp;&nbsp; <br>1）、用SETUP_INTERRUPT_MAP宏关联SYSINTR和IRQ。以&#8220;SYSINTR_&#8221;为前缀的常量由内核使用，用于唯一标识发生中断的硬件，又称为中断ID。在Nkintr.h文件中预定义了一些SYSINTR，OEM可以在Oalintr.h文件中自定义SYSINTR。&nbsp;&nbsp; <br>2）、用HookInterrupt函数关联硬件中断号和ISR。这里提到的硬件中断号为物理中断号，IRQ为逻辑中断号。在InitPICs函数的最后调用了HookInterrupt函数，如下：&nbsp;&nbsp; <br>for (i = 64; i &lt; 80; i++)&nbsp;&nbsp; <br>HookInterrupt(i, (void *)PeRPISR);&nbsp;&nbsp; ///用ISR关联16个中断号&nbsp;&nbsp; <br>3）、调用InterruptInitialize函数关联SYSINTR和IST创建的事件对象，也是IST等待的事件对象。详细内容请参考Geode BSP源码。&nbsp;&nbsp; <br>&nbsp;&nbsp; 在x86平台要实现可安装ISR，先调用LoadIntChainHandler函数注册在注册表中指定的ISR DLL，然后填充GIISR_INFO结构体并调用KernelLibIoControl函数将此结构体传递给可安装ISR。详细内容请参考WINCE帮助文档或者我著的《Windows CE下驱动开发基础》。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">31、修改了WINCE自带的驱动程序后如何编译？如果是自己开发的驱动程序如何编译？&nbsp;&nbsp; <br></span>1）、分为IDE方式和命令行方式。&nbsp;&nbsp; <br>IDE方式的编译很简单，以PB5.0为例，打开定制内核的工程，在左边的&#8220;workspace&#8221;—&#8220;FileView&#8221;中找到你已经修改了的目录，然后单击右键弹出菜单，在菜单中选择&#8220;Build and Sysgen Current Project&#8221;，这样PB就会编译指定的目录中的项目源码文件，然后执行sysgen命令根据source文件中的内容生成目标文件并复制到当前内核工程目录下。&nbsp;&nbsp; <br>命令行方式的编译需要打开&#8220;Build OS&#8221;—&#8220;Open Release Directory&#8221;，以cd命令进入你已经修改的驱动程序目录中，然后键入&#8220;build &#8211;cfs&#8221;，然后键入&#8220;sysgen &#8211;p 项目名称&#8221;，一般项目名称为source文件中的&#8220;TARGETNAME&#8221;。&nbsp;&nbsp; <br>2）、如果想完全自己开发驱动程序，建议直接采用EVC或者PB来编写编译。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">32、开发PCI设备驱动时，InterruptInitialize函数的第一参数是否是PCI卡配置空间信息中的InterruptLine 参数？是否需要在HKLM\Drivers\BuiltIn\PCI\Template 加一個自己的 subkey，并填写相应内容？如何填？</span>&nbsp;&nbsp; <br>1）、InterruptInitialize的第一参数是IRQ，也就是逻辑中断号，而不是物理中断号，InterruptLine是指物理中断号&nbsp;&nbsp; <br>2）、需要在template下加自己的PCI设备的信息，例如：&nbsp;&nbsp; <br>&nbsp;&nbsp; [HKEY_LOCAL_MACHINE\Drivers\PCI\Template\Serial]&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "Dll"="Com16550.Dll"&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "Class"=dword:07&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "SubClass"=dword:00&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "ProgIF"=dword:02&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "VendorID"=multi_sz:"0AF0","B320","B320"&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "DeviceID"=multi_sz:"0020","0300","0302"&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "Prefix"="COM"&nbsp;&nbsp; <br>而这些信息就来自于你执行pcienum.exe的结果。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">33、编译器报错：error C2065: 'CFileFind' : undeclared identifier，如何解决？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; MFC for WINCE版本没有CFileFind类，所以要查找文件只能调用API FindFirstFile 和FindNextFile。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">34、如何设置WINCE系统字体、字号？如何设置自己开发的软件的字体、字号？</span>&nbsp;&nbsp; <br>1）、系统字体通过注册表设置。如下：&nbsp;&nbsp; <br>[HKEY_LOCAL_MACHINE\System\GDI\SysFnt]&nbsp;&nbsp; ///系统字体&nbsp;&nbsp; <br>Wt=420&nbsp;&nbsp; <br>Ht=18&nbsp;&nbsp; <br>Nm=Arial&nbsp;&nbsp; <br>[HKEY_LOCAL_MACHINE\System\GWE\Menu\BarFnt]&nbsp;&nbsp; ///菜单栏字体&nbsp;&nbsp; <br>[HKEY_LOCAL_MACHINE\System\GWE\Menu\PopFnt]&nbsp;&nbsp; ///弹出窗口字体&nbsp;&nbsp; <br>[HKEY_LOCAL_MACHINE\System\GWE\Menu]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///菜单字体&nbsp;&nbsp; <br>HKEY_LOCAL_MACHINE\System\GWE\Button&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///按钮字体&nbsp;&nbsp; <br>2）、创建字体时把字体高度参数设置大点就可以了。如CFont::CreateFont(nHeight,...)，也可以在LOGFONT结构中设置字体高度或者字体种类。如果是控件，调用控件的SetFont成员函数。如果是直接画，在OnPaint响应函数中调用SelectObject选字体到DC。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">35、 nk.bin和nk.nb0有什么区别？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 这里提到的bin是一种二进制镜像格式，以片断（section）为单位组织数据，每个片断都包括一个头，头里指定了起始地址，长度，校验值。Platform Builder调用工具将WINCE内核所有文件以bin格式合并成一个文件，默认文件名为nk.bin。BootLoader又以同样的格式将nk.bin分解成多个文件放到RAM中。可以在命令行中键入&#8220;viewbin nk.bin&#8221;来查看bin文件中具体包括了哪些内容。键入Cvrtbin命令转换.bin格式文件为.sre格式或者.abx格式。&nbsp;&nbsp; <br>&nbsp;&nbsp; nb0格式是原始的二进制镜像，它不包括头，一般情况下将内核下载到设备的RAM中运行都采用nb0格式。要生成nbx格式的文件，需要在相关.bib文件中确定如下值：ROMSTART、ROMWIDTH、ROMSIZE。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">36、在不采用硬件计时器的情况下如何创建更精确的计时器？最精确周期能否达到1毫秒？&nbsp;&nbsp; <br></span>对于精确值的要求不同，所采用的办法不同。以下阐述几种办法。&nbsp;&nbsp; <br>1）、在单线程中循环调用API Sleep函数，Sleep函数精确程度为如果Sleep(N)，那么实际睡眠时间在N到N+1毫秒之间。而且还要注意调用Sleep的线程优先级的问题。如果任务过多并且此线程优先级低，那误差就更大些。&nbsp;&nbsp; <br>2）、调用API QueryPerformanceCounter函数，举例如下：&nbsp;&nbsp; <br>LARGE_INTEGER&nbsp;&nbsp; liFrequency;&nbsp;&nbsp; <br>if (QueryPerformanceFrequency(&amp;liFrequency))&nbsp;&nbsp; // 查询系统时钟的频率，这里将返回1000&nbsp;&nbsp; <br>{&nbsp;&nbsp; <br>&nbsp;&nbsp; liFrequency.QuadPart /= 1000;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; LARGE_INTEGER&nbsp;&nbsp; liTimeOut;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; if (QueryPerformanceCounter(&amp;liTimeOut))&nbsp;&nbsp; //得到截至到当前累计发生的系统时钟中断次数&nbsp;&nbsp; <br>&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; liTimeOut.QuadPart += liFrequency.QuadPart;&nbsp;&nbsp; ///计算下一秒到来时总的中断次数是多少&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LARGE_INTEGER&nbsp;&nbsp; liCurrent;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QueryPerformanceCounter(&amp;liCurrent);&nbsp;&nbsp;&nbsp;&nbsp; // 循环查询累计的的中断次数&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } while (liCurrent.QuadPart &lt; liTimeOut.QuadPart); ///到达下一秒&nbsp;&nbsp; <br>&nbsp;&nbsp; }&nbsp;&nbsp; <br>}&nbsp;&nbsp; <br>调用QueryPerformanceCounter同调用Sleep在本质上都是一样的，都是在单线程中无限循环等到周期一到执行任务，相比较QueryPerformanceCounter要比Sleep更精确些，越精确就越要求线程的优先级，保障线程能够正常得到处理器。&nbsp;&nbsp; <br>3）、以上办法难以保证周期精确到1毫秒并且WINCE系统稳定地运行，所以要从中断入手。以x86平台为例，先在Timer.c中将默认的SetTimer0(TIMER_COUNT)中的TIMER_COUNT /＝2，SetTimer0函数负责设置系统时钟的频率，默认1毫秒发生一次中断，如果除以2就是0.5毫秒发生一次中断。然后在fwpc.c文件中修改ISR函数PeRPISR，因为原来默认是1毫秒发生一次中断，在处理INTR_TIMER0时系统负责累计计数、管理线程的调度，返回相应的SYSINTR值，而我们没有办法再添加代码返回自己定义的SYSINTR值，所以现在要修改原来的处理代码，例如设置一个BOOL型变量，TRUE就执行原来默认的代码，而FALSE就返回我们自己定义的SYSINTR值，这样即不影响原来的ISR处理，又加入了我们的中断响应代码。ISR返回我们定义的SYSINTR后WINCE内核激活相对应的EVENT事件，我们就可以在我们编写的IST里处理任务了。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">37、flash中存放了BootLoader和内核镜像，如何把剩余flash部分划分为一个存储区域供应用程序读写？&nbsp;&nbsp; <br></span>&nbsp;&nbsp; 以WINCE提供的驱动（FAT文件系统和MSFLASH驱动）来举例说明。如果采用默认common.reg中的注册表设置，那么MSFLASH驱动默认把整个flash作为存储区域来读写，这不符合问题的要求，所以必须告诉MSFLASH驱动程序可供读写的区域的起始地址和长度。以下是一个注册表例子：&nbsp;&nbsp; <br>[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\FASLD]&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "Dll"="fasld.dll"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///实际Flash存储器的驱动程序&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "Order"=dword:2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///该驱动程序相对于其它驱动程序的加载顺序&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "Prefix"="DSK"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///前缀&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "Ioctl"=dword:4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///IOCTL码，设备管理器加载驱动的时候调用IOControl函数，传递这个IOCTL码。&nbsp;&nbsp; <br>"Profile"="MSFlash"&nbsp;&nbsp;&nbsp;&nbsp; ///Profile名称，也就是[HLM\System\StorageManager\Profiles\MSFlash]&nbsp;&nbsp; <br>///当设备管理器加载此驱动程序的同时发送通知给系统，IClass（GUID）的值表明这是一个存储设备的驱动程序。&nbsp;&nbsp; <br>"IClass"="{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "MemBase"=dword:00000000&nbsp;&nbsp;&nbsp;&nbsp; ///Flash中可供读写区域的起始物理地址，也就是Flash的首地址+偏移量&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "MemLen"=dword:00000000&nbsp;&nbsp;&nbsp;&nbsp; ///Flash中可供读写区域的长度&nbsp;&nbsp; <br>[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\MSFlash]&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "DefaultFileSystem"="FATFS"&nbsp;&nbsp; ///MSFlash驱动默认采用的文件系统&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "PartitionDriver"="mspart.dll"&nbsp;&nbsp;&nbsp;&nbsp; ///采用的分区驱动程序&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "MountAsRoot"=dword:1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///此目录作为文件系统的根目录&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "Folder"="NOR Flash"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///目录名称&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "Name"="FLASH Disk Block Device"&nbsp;&nbsp; ///Flash驱动名称&nbsp;&nbsp; <br>"PartitionDriverName"="MSPART" ///分区驱动名称&nbsp;&nbsp; <br>"AutoMount"=dword:1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///自动装载检测到的分区&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "AutoPart"=dword:1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///自动分区&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "AutoFormat"=dword:1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///自动格式化分区&nbsp;&nbsp; <br>[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\MSFlash]&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "DriverPath"="Drivers\\BuiltIn\\FASLD"&nbsp;&nbsp;&nbsp;&nbsp; ///Flash驱动在注册表中的位置&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "LoadFlags"=dword:1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///这个值可以被设置为0、1、2。1表示同步加载，其它表示异步加载&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "Order"=dword:0&nbsp;&nbsp; <br>[HKEY_LOCAL_MACHINE\System\StorageManager\FATFS]&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "FriendlyName"="FAT FileSystem"&nbsp;&nbsp;&nbsp;&nbsp; ///文件系统名称&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "Dll"="fatfsd.dll"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///文件系统驱动程序&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "Flags"=dword:00000064&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///标志，详见帮助文档&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "Paging"=dword:1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///是否分页&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "EnableCache"=dword:1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///是否允许缓存数据&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; "CacheSize"=dword:0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ///指定缓存大小，0表示默认&nbsp;&nbsp; <br><br><span style="COLOR: red">38、驱动程序如何发通知给应用程序？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 这里介绍一下常见的两种办法。&nbsp;&nbsp; <br>&nbsp;&nbsp; 1）、驱动程序调用API SendNotifyMessage，发送特定的消息给应用程序，这就要求应用程序要有消息循环机制并且要事先做好消息的处理。参数1为窗口句柄，可以设置HWND_BROADCAST表示广播消息。要注意的是不要在参数中传递指针（虚拟地址），因为执行驱动程序的线程和应用程序并不在同一个进程空间中。解决办法可以利用内存映射文件技术，比如在驱动程序中创建一个内存映射文件对象，申请一块物理内存，然后把对象名称和内存长度传递给应用程序，应用程序打开同名的内存映射文件对象，读取里面的数据。对象名称可以事先协定好，也可以通过注册表来传递，内存长度是32位值，通过消息参数就可以传递，也可以通过注册表来传递。另外一种解决办法是在定制内核时候预留一块物理内存，这样驱动程序和应用程序都可以通过VirtualAlloc和VirtualCopy来映射到同一块物理内存，其原理同内存映射文件技术一样，但是这块物理内存不具备通用性。最后一个办法是应用程序事先将一个缓冲区地址传递给驱动程序，驱动程序调用MapPtrToProcess映射应用程序传递过来的地址，当驱动程序调用SendNotifyMessage后应用程序可以直接到该地址中读取数据。&nbsp;&nbsp; <br>&nbsp;&nbsp; 设备管理器就是调用此函数广播WM_DEVICECHANGE消息的。另外WINCE的一个例子程序RNAApp在拨号连接建立的时候也是调用这个函数广播WM_NETCONNECT消息的。&nbsp;&nbsp; <br>&nbsp;&nbsp; 2）、驱动程序调用API CeEventHasOccurred指明一个事件A发生，在此之前应用程序调用API CeRunAppAtEvent将驱动程序指明的A事件和一个应用程序名称相关联，或者和一个事件B相关联。这样当A事件发生时，如果指明和一个应用程序名称关联，那这个应用程序就会被启动。如果指明了和一个事件B相关联，那么等待事件B的线程将被激活。如果想了解当前系统内部所有驱动程序支持哪些类似事件A的事件，调用API CeNotifyPublic_FilterEvent，在该API的帮助文档里也列举了常见的事件，例如NOTIFICATION_EVENT_NET_CONNECT和 NOTIFICATION_EVENT_NET_DISCONNECT。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><span style="COLOR: red">40、 EVC创建的工程名称如果用中文就出错，该怎么办？</span>&nbsp;&nbsp; <br>&nbsp;&nbsp; 用EVC创建的工程名称如果为中文将导致资源文件打不开和编译出错，可以改资源文件名称为英文，再编辑.rc文件中的资源文件名称。但建议尽量不要用中文为工程名称。&nbsp;&nbsp; <br>&nbsp;&nbsp; 作为习惯，应该在EVC创建一个工程后，立刻在&#8220;project&#8221;—&#8220;settings&#8221;中设置资源的语言属性，然后在&#8220;resource view&#8221;中设置每个资源的语言属性，这些工作做完后再修改资源就没有问题了。有人询问对话框的标题为乱码，其原因就是在没有修改语言属性的情况下设置标题为中文。
<img src ="http://www.cppblog.com/SpringSnow/aggbug/90235.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-07-16 15:41 <a href="http://www.cppblog.com/SpringSnow/archive/2009/07/16/90235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转: WinCE驱动开发问题精华集锦-1</title><link>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90233.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Thu, 16 Jul 2009 07:34:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90233.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/90233.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90233.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/90233.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/90233.html</trackback:ping><description><![CDATA[WinCE驱动开发问题精华集锦-1<br>摘自: <a href="http://hi.baidu.com/mcu%5Fspaces/blog/item/12662a088108f9d563d9867b.html">http://hi.baidu.com/mcu%5Fspaces/blog/item/12662a088108f9d563d9867b.html</a><a href="http://hi.baidu.com/mcu_spaces/blog/item/4f3139df56ec7e1763279847.html"></a><br><br>近日越来越发现知识的匮乏,所以需要好好努力才可以.<br><br>加油,加油!<br><br>精华集锦1__内容如下<br><font color=#ff0000>1、在应用程序中，如何向修改本机的ip 地址等网络参数，并使之立即生效？</font>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 网络设置保存在注册表中，位置[HKEY_LOCAL_MACHINE\Comm\网卡名称\Parms\TcpIp]，例如常见的CS8900网卡设置：&nbsp;&nbsp; <br>[HKEY_LOCAL_MACHINE\Comm\CS89001\Parms\TcpIp]&nbsp;&nbsp; <br>&nbsp;&nbsp; "EnableDHCP"=dword:0&nbsp;&nbsp; <br>&nbsp;&nbsp; "DefaultGateway"="192.168.0.1"&nbsp;&nbsp; <br>&nbsp;&nbsp; "DNS"="111.111.111.111"&nbsp;&nbsp; <br>&nbsp;&nbsp; "UseZeroBroadcast"=dword:0&nbsp;&nbsp; <br>&nbsp;&nbsp; "IpAddress"="192.168.0.2"&nbsp;&nbsp; <br>&nbsp;&nbsp; "Subnetmask"="255.255.255.0"&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; 设置之后要生效有两种办法：一种热启动，调用KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL)，热启动时间很短暂；另外一种调用DevieceIoControl API，传递IOCTL＝IOCTL_NDIS_REBIND_ADAPTER。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><font color=#ff0000>2、如何向控制面板中那样，修改系统声音的音量&nbsp;&nbsp; <br></font>&nbsp;&nbsp;&nbsp;&nbsp; 调用API waveOutSetVolume(HWAVEOUT, dwVolume )，一般参数1为0。在[HKEY_CURRENT_USER\ControlPanel\Volume]下是系统声音的注册表设置。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><font color=#ff0000>3、在应用程序中如何实现jpg、gif图片的显示</font>&nbsp;&nbsp; <br>有几种办法：&nbsp;&nbsp; <br>1）、在MSDN中搜索标题为&#8220;Windows CE .NET Technical Frequently Asked Questions&#8221;的文档，其中有一个问题&#8220;How can I display JPEG, GIF, and other graphics files?&#8221;，下面就是答案。&nbsp;&nbsp; <br>2）、如果安装了Windows CE 5.0，一个例子源码位于WINCE500\PUBLIC\GDIEX\SDK\SAMPLES\SIMPLE。&nbsp;&nbsp; <br>3）、用IWebBrowser组件实现。&nbsp;&nbsp; <br><br><font color=#ff0000>4、 在应用程序中如何实现系统待机&nbsp;&nbsp; <br></font>void GwesPowerOffSystem(void);&nbsp;&nbsp; <br><br><font color=#ff0000>5、&nbsp;&nbsp; 在WINCE中如何得到网卡MAC地址</font>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; 事实证明，获得物理网卡的MAC地址并没有被统一成一个API或者IOCTL，如果网卡驱动程序没有提供接口的话只能直接访问寄存器获得。读者可以参考目录WINCE500\PUBLIC\COMMON\OAK\DRIVERS\NETCARD里的一些驱动源码。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><font color=#ff0000>6、Windows XP Embedded 和Windows CE有何区别&nbsp;&nbsp; <br></font>&nbsp;&nbsp;&nbsp;&nbsp; 简单地说Windows XP Embedded采用Windows XP内核，只能运行在x86处理器上，优点是能够运行PC上现有的应用软件，缺点是授权费太高，标价￥900元；Windows CE采用Windows CE内核，能够运行在多种处理器上，如x86、ARM、SHX、MIPS等，优点是授权费低，最低Core版标价￥30元。缺点是需要单独开发应用软件、定制内核，甚至开发BSP、Driver。&nbsp;&nbsp; <br><br><font color=#ff0000>7、 wince下只是把调制解调器的驱动挂接在了com1，如何将器驱动挂接在com2上？</font>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; 1）、在HLM\drivers\buildin\com2\unimodem下复制和com1一样的数据 <br>&nbsp;&nbsp;&nbsp;&nbsp; 2）、在HLM\ExtModems\HayesCompat下改写Port为COM2:，再改写FriendlyName为"Hayes Compatible 在 COM2:"。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><font color=#ff0000>8、如何定制自己的外壳</font>&nbsp;&nbsp; <br>&nbsp;&nbsp; 1）、先开发一个外壳软件，假设名称为MyShell.exe&nbsp;&nbsp; <br>&nbsp;&nbsp; 2）、删除注册表[HKEY_LOCAL_MACHINE\init]下如下一行：&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Launch50"="explorer.exe"&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; 3）、在注册表[HKEY_LOCAL_MACHINE\init]下添加如下一行：&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Launch50"＝"MyShell.exe"&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; 上述的&#8220;LaunchXX&#8221;中的XX为序列数，内核依据这个序列数按由小到大的顺序来分别执行所有子键列出的应用程序，具体数值应该为多少请参考帮助文档的说明。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; 如果原来的内核中添加了标准外壳（standard shell）组件，或者添加了其它组件而这些组件需要依赖标准外壳，那么在PB中是无法删除标准外壳组件的，解决办法一是保留explorer.exe在内核中，二是删除依赖标准外壳的组件。&nbsp;&nbsp; <br><br><font color=#ff0000>9、我原来的工程是x86版本的，编译选项只有x86，我如何能够编译ARM版本的</font>&nbsp;&nbsp; <br>两种办法：&nbsp;&nbsp; <br>&nbsp;&nbsp; 1)、用EVC新建一个工程的时候，建议复选&#8220;CPUs&#8221;列表，这样发生了这种事情也能够轻易通过选择&#8220;WCE Configuration&#8221;工具栏中的CPU列表来编译不同CPU版本的软件&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; 2)、如果打开工程后CPU列表中只有x86，而此时已经安装了ARM版本的SDK，那么单击EVC菜单&#8220;build&#8221;－&#8220;configurations&#8221;，然后单击&#8220;add&#8221;按钮来添加CPU。&nbsp;&nbsp; <br><br>&nbsp;&nbsp; <br>10、通常情况下WINCE采用串口1作为调试时输出信息用途，要正式出产品前如何去掉串口1的调试功能，正常情况下串口1只有在编译debug版本的内核时才在BootLoader中初始化串口1用于输出信息，而编译release版本会跳过此代码。而有些BSP设计成没有宏定义，也就是说无论什么版本都会在BootLoader中初始化串口1，这样造成WINCE启动后串口1无法被应用程序使用。对于这种情况只能在BootLoader源码中删除初始化代码，如OEMInitDebugSerial。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><font color=#ff0000>11、基于wince的应用程序能建成console project么？</font>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不能&nbsp;&nbsp; <br><br><font color=#ff0000>12、ARM系统外扩一片512K RAM，驱动程序经过映射可以使用这一段RAM。1、应用系统如何使用这一段RAM？要加一层驱动吗？2、如果要将这一段RAM当作RAM盘存储系统，该如何作呢？应该要加文件系统吧，如何加呢？ </font><br>&nbsp;&nbsp; 解答这个问题前，先要说一下WINCE的地址映射机制。对于包含MMU（存储器管理单元）的处理器来说，如ARM和x86，WINCE要求OEM在定制内核的时候填写一个虚拟地址与物理地址映射关系的表，称为OEMAddressTable，在这个表中定义了所有物理设备的起始物理地址，对应的起始虚拟地址，地址空间大小，RAM就包括在其中（如果是x86平台还要求RAM起始虚拟地址从0x80000000开始）。如果有多片RAM，应该在OEMAddressTable中将它们定义在一起，使之地址连续。对于非OEM的开发者来说，他们拿到的是定制好的内核，不能做任何修改，如果在产品中外扩一片RAM，只能通过API函数通知操作系统增加一条虚拟地址与物理地址映射关系表项。相关API函数有两个，分别是CreateStaticMapping和VirtualCopy。它们的相同之处是都用于建立物理地址和虚拟地址的映射关系。它们的不同之处是CreateStaticMapping映射的虚拟地址范围在0xC400 0000 到 0xE000 0000之间，这个范围只能由内核访问，一般用于ISR访问，因为ISR只能访问静态映射的虚拟地址空间，不能用VirtualCopy。VirtualCopy通常和VirtualAlloc配合使用，映射的虚拟地址空间在0x8000 0000以下，一般用于驱动程序和应用程序访问。&nbsp;&nbsp; <br>1）、应用程序要访问这片RAM，和驱动程序访问方法一样，调用VirtualAlloc和VirtualCopy。&nbsp;&nbsp; <br>2）、可以做一个流驱动程序专门用于读写这片RAM，这样所有应用程序就可以通过调用流驱动接口函数来访问，非要加文件系统也是可行的，通过修改注册表就可以做到，但是麻烦一些。&nbsp;&nbsp; <br><br><font color=#ff0000>13、我怎么能在PB左边的定制平台加进我的驱动呢？</font>&nbsp;&nbsp; <br>两种办法：&nbsp;&nbsp; <br>1）、在platform.bib或者project.bib的MODULES部分添加一条语句，例如：&nbsp;&nbsp; <br>MyDriver.dll&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C:\Driver\MyDriver.dll&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NK SH&nbsp;&nbsp; <br>这样编译内核的时候就会把你的驱动DLL文件添加到内核中，如果有注册表需要设置，在platform.reg或者project.reg中添加注册表内容。&nbsp;&nbsp; <br>2）、通过制作.cec文件来添加驱动，制作.cec文件的优点是只需制作一次，以后就可以通过将.cec文件导入到PB的Catalog中，象PB自带的feature一样通过菜单&#8220;Add to OS Design&#8221;添加到左边的内核工程中。&nbsp;&nbsp; <br><br><font color=#ff0000>14、 WINCE有没有相对路径概念？如果没有如何得到当前模块的路径？&nbsp;&nbsp; <br></font>&nbsp;&nbsp;&nbsp;&nbsp; 1) 、WINCE没有相对路径概念，只有绝对路径，所以凡是涉及到路径均为绝对路径。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; 2)、调用API GetModuleFileName，传递一个模块的实例句柄就能够得到模块的绝对路径。&nbsp;&nbsp; <br><br><font color=#ff0000>15、&nbsp;&nbsp; 怎样让 POCKET WORD打开*.dat格式（里面都是数据）的文件? </font><br>&nbsp;&nbsp;&nbsp;&nbsp; 两种办法：&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; 1）、调用API ShellExecuteEx，在结构体SHELLEXECUTEINFO中添加.dat文件的路径。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; 2）、调用API CreateProcess，在第二个参数中设置.dat文件的路径。&nbsp;&nbsp; <br><br><font color=#ff0000>16、 x86 Rom Boot Loader真的可以实现吗？它确实能代替BIOS启动计算机？</font>&nbsp;&nbsp; <br>&nbsp;&nbsp; Rom Boot 被设计存放在Flash/EEPROM中，也就是原来BIOS的位置，这样当上电后CPU到固定地址执行代码，也就是执行了Rom Boot的代码，它对整个硬件系统进行初始化和检测，并且支持通过网卡从远程机器上下载nk.bin或者从本地IDE/ATA 硬盘的活动分区中寻找nk.bin文件加载。Rom Boot的优点就是引导并且加载速度快，而且它自身完成了所有的操作，这样就不用BIOS、MSDOS，更不用Loadcepc了。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><font color=#ff0000>17、 对于x86 Rom Boot Loader，如何Build得到Romboot.rom?</font>&nbsp;&nbsp; <br>&nbsp;&nbsp; 1）、在PB中打开一个内核工程（x86的） <br>&nbsp;&nbsp; 2）、单击PB菜单&#8220;Build&#8221;－&#8220;Open Build Release Directory&#8221; <br>&nbsp;&nbsp; 30 、用cd命令进入 %_WINCEROOT%\Platform\Geode\Romboot 4、build&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><font color=#ff0000>18、如何设置、更改显示分辨率&nbsp;&nbsp; <br></font>&nbsp;&nbsp;&nbsp;&nbsp; 能否设置、更改显示分辨率由显示驱动程序决定，而没有统一的标准。例如CEPC，在启动的时候可以通过设置loadcepc.exe的参数 /L来决定WINCE启动后的显示分辨率，这是由于显示驱动&#8220;VGA Linear Framebuffer&#8221;支持，而Geode可以通过在定制内核时修改注册表项来决定WINCE启动后的显示分辨率。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><font color=#ff0000>19、 几个硬件使用同一个IRQ，那么发生中断的时候系统怎么判断到底是哪一个硬件发生的中断呢？ISR里面又应该怎么控制呢?</font>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; Windows CE支持多个设备中断共享一个IRQ，当一个共享IRQ发生时，CE内核的异常处理程序检测设备特定的寄存器，因为大多数设备都有一个单独的寄存器用于表示设备的活动状态，所以通过遍历共享这个IRQ的所有设备的寄存器就可以判断哪个设备发生中断。nk.exe加载一个giisr.dll，这个.dll是微软提供的，它其实是第一个可安装ISR。默认CE内核就是调用这个dll来检测寄存器状态的，当然OEM可以编写自己的.dll。&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; CE内部有一个ISR链，也就是可安装ISR。因为CE允许OEM添加自己的ISR处理程序，所以ISR被设计成一个链表。排在前面的ISR比后面的ISR优先处理中断，如果当前ISR能够处理当前中断，那就返回中断ID由IST处理或者返回SYSINTR_NOP，如果当前ISR不能够处理当前中断，那就返回SYSINTR_CHAIN让下一个ISR处理。&nbsp;&nbsp; <br>&nbsp;&nbsp; <br><font color=#ff0000>20、请问在wince中如何在内核中增加一个与\windows同级的目录？</font>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; 在platform.dat或者project.dat中添加语句。例如要创建根目录下子目录Program Files，语句如下：&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; root:-Directory("Program Files")
<img src ="http://www.cppblog.com/SpringSnow/aggbug/90233.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-07-16 15:34 <a href="http://www.cppblog.com/SpringSnow/archive/2009/07/16/90233.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转: vs.net 2005, 没有找到MSVCR80D.dll的完美解决方案 </title><link>http://www.cppblog.com/SpringSnow/archive/2009/07/14/90015.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Tue, 14 Jul 2009 05:45:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/07/14/90015.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/90015.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/07/14/90015.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/90015.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/90015.html</trackback:ping><description><![CDATA[解决方案是：在编辑状态下，点项目菜单 -&gt; XXX属性页 -&gt; 配置属性 -&gt; 清单工具，将右面的&#8220;使用FAT32解决办法&#8221;选为&#8220;是&#8221;即可。<br><br>摘自：<a href="http://space.loudly.cn/index.php/2/action_viewspace_itemid_63.html">http://space.loudly.cn/index.php/2/action_viewspace_itemid_63.html</a><br><br>不过我的是英文的，路径是Property Pages 下， Configuration Properties-&gt;Manifest Tool-&gt;General中，将Use FAT32 Work-around 选为Yes即可。
<img src ="http://www.cppblog.com/SpringSnow/aggbug/90015.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-07-14 13:45 <a href="http://www.cppblog.com/SpringSnow/archive/2009/07/14/90015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows mobile 6.5的SDK, DTK, DRK的一点了解</title><link>http://www.cppblog.com/SpringSnow/archive/2009/07/08/89550.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Wed, 08 Jul 2009 07:34:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/07/08/89550.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/89550.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/07/08/89550.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/89550.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/89550.html</trackback:ping><description><![CDATA[<p>今天在看Windows Mobile Team Blog的时候，看到关于SDK, DTK, DRK的文章，通过阅读，简单的了解一些。所以也和大家分享一下。<br>摘自： SDK, DTK, DRK: WTF?! <br><a href="http://blogs.msdn.com/windowsmobile/archive/2009/06/04/sdk-dtk-drk-wtf.aspx">http://blogs.msdn.com/windowsmobile/archive/2009/06/04/sdk-dtk-drk-wtf.aspx</a><br><br><strong>SDK: Software Development Kit<br></strong>We have not released a new SDK for Windows Mobile 6.5. The <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=06111A3A-A651-4745-88EF-3D48091A390B&amp;displaylang=en">Windows Mobile 6 Professional SDK</a> or <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=06111A3A-A651-4745-88EF-3D48091A390B&amp;displaylang=en">Windows Mobile 6 Standard SDK</a> are required for Windows Mobile 6.5 application development. <br><br><strong>6.5 依然沿用了Windows Mobile 6 的SDK。<br><br>DTK: Developer Toolkit<br></strong>The <a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=20686a1d-97a8-4f80-bc6a-ae010e085a6e">Windows Mobile 6.5 Developer Toolkit</a> (DTK) is not an SDK! The DTK contains emulators, gesture APIs, and samples useful for developing Windows Mobile 6.5 applications. You will still need to install Visual Studio and the Windows Mobile 6 SDK prior to running the toolkit installer. <br><br>6.5发布了一个开发包，下载地址是<br><span lang=EN-US><a title=http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=20686a1d-97a8-4f80-bc6a-ae010e085a6e href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=20686a1d-97a8-4f80-bc6a-ae010e085a6e"><u><font color=#800080>http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=20686a1d-97a8-4f80-bc6a-ae010e085a6e</font></u></a><br>其中有了简体中文的模拟器。<br>在机子上安装了一下，界面效果比原来好看许多，但是改动让我有一些不熟悉。<br><br>里面增加了几个头文件：<br><span>&lt;gesture.h&gt;<br></span><span>&lt;GesturePhysicsEngine.h&gt;<br></span><span>&lt;WindowAutoGesture.h&gt;<br><br>还有几个附带的例子。<br><br></p>
<p><strong>DRK: Developer Resource Kit</strong></p>
<p>The Windows Mobile Developer Resource Kit (DRK) is an offline DVD copy of the most useful and relevant Windows Mobile application development tools and resources. Traditionally the DRK does not contain any exclusive content, in that nearly everything on the DRK is available for download online. This time we are pleased to publish the Windows Mobile 6.5 DRK with several sample chapters of Microsoft Mobile Development Handbook from <a href="http://www.microsoft.com/learning/en/us/books/10294.aspx"><u><font color=#0000ff>Microsoft Press</font></u></a> (Wigley, Moth, and Foot). </p>
</span>
<p><br>这个词是我第一次听说。没有下过。</span></p>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/89550.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-07-08 15:34 <a href="http://www.cppblog.com/SpringSnow/archive/2009/07/08/89550.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows Mobile中进程和模块信息的获取</title><link>http://www.cppblog.com/SpringSnow/archive/2009/07/03/89165.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Fri, 03 Jul 2009 07:57:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/07/03/89165.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/89165.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/07/03/89165.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/89165.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/89165.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">【进程】<span lang=EN-US><o:p></o:p></span></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; FONT-FAMILY: 楷体_GB2312; mso-hansi-font-family: 宋体"><span style="mso-spacerun: yes">&nbsp; </span><span style="mso-spacerun: yes">&nbsp;</span><span style="mso-spacerun: yes">&nbsp;</span></span></strong><span lang=EN-US style="FONT-FAMILY: 宋体">Mobile </span><span>中的进程信息大体包含在<span lang=EN-US>PROCESSENTRY32</span>结构中，我们可以获得进程的诸多信息，此处无法获得进程所占内存和<span lang=EN-US>CPU</span>利用率。<br><strong>数据结构<br><br></strong></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><span><strong>typedef struct tagPROCESSENTRY32 { <o:p></o:p></strong></span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-spacerun: yes">&nbsp; </span><strong>DWORD </strong><em><span style="mso-field-code: ' HYPERLINK '''"><u><span style="COLOR: blue">dwSize</span></u></span></em><strong>; <o:p></o:p></strong></span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-spacerun: yes">&nbsp; </span><strong>DWORD </strong><em><span style="mso-field-code: ' HYPERLINK '''"><u><span style="COLOR: blue">cntUsage</span></u></span></em><strong>; <o:p></o:p></strong></span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-spacerun: yes">&nbsp; </span><strong>DWORD </strong><em><span style="mso-field-code: ' HYPERLINK '''"><u><span style="COLOR: blue">th32ProcessID</span></u></span></em><strong>; <o:p></o:p></strong></span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-spacerun: yes">&nbsp; </span><strong>DWORD </strong><em><span style="mso-field-code: ' HYPERLINK '''"><u><span style="COLOR: blue">th32DefaultHeapID</span></u></span></em><strong>; <o:p></o:p></strong></span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-spacerun: yes">&nbsp; </span><strong>DWORD </strong><em><span style="mso-field-code: ' HYPERLINK '''"><u><span style="COLOR: blue">th32ModuleID</span></u></span></em><strong>; <o:p></o:p></strong></span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-spacerun: yes">&nbsp; </span><strong>DWORD </strong><em><span style="mso-field-code: ' HYPERLINK '''"><u><span style="COLOR: blue">cntThreads</span></u></span></em><strong>; <o:p></o:p></strong></span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-spacerun: yes">&nbsp; </span><strong>DWORD </strong><em><span style="mso-field-code: ' HYPERLINK '''"><u><span style="COLOR: blue">th32ParentProcessID</span></u></span></em><strong>; <o:p></o:p></strong></span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-spacerun: yes">&nbsp; </span><strong>LONG<span style="mso-spacerun: yes">&nbsp; </span></strong><em><span style="mso-field-code: ' HYPERLINK '''"><u><span style="COLOR: blue">pcPriClassBase</span></u></span></em><strong>; <o:p></o:p></strong></span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-spacerun: yes">&nbsp; </span><strong>DWORD </strong><em><span style="mso-field-code: ' HYPERLINK '''"><u><span style="COLOR: blue">dwFlags</span></u></span></em><strong>; <o:p></o:p></strong></span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-spacerun: yes">&nbsp; </span><strong>TCHAR </strong><em><span style="mso-field-code: ' HYPERLINK '''"><u><span style="COLOR: blue">szExeFile</span></u></span>[MAX_PATH]</em><strong>; <o:p></o:p></strong></span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-spacerun: yes">&nbsp; </span><strong>DWORD </strong><em><span style="mso-field-code: ' HYPERLINK '''"><u><span style="COLOR: blue">th32MemoryBase</span></u></span></em><strong>;<o:p></o:p></strong></span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-spacerun: yes">&nbsp; </span><strong>DWORD </strong><em><span style="mso-field-code: ' HYPERLINK '''"><u><span style="COLOR: blue">th32AccessKey</span></u></span></em><strong>;<o:p></o:p></strong></span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><span style="mso-spacerun: yes">&nbsp; </span><strong>} PROCESSENTRY32; <o:p></o:p></strong></span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align=left><span><span style="mso-spacerun: yes">&nbsp; </span><strong>typedef PROCESSENTRY32* PPROCESSENTRY32; </strong></span><span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体; mso-hansi-font-family: Arial; mso-font-kerning: 0pt; mso-no-proof: yes">&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;<br><span style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; FONT-FAMILY: 楷体_GB2312; mso-hansi-font-family: 宋体"><strong>代码示例</strong></span></span></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;创建快照句柄</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></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/None.gif" align=top>HANDLE&nbsp;hSnapshot&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></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;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img id=Codehighlighter1_121_646_Open_Image onclick="this.style.display='none'; Codehighlighter1_121_646_Open_Text.style.display='none'; Codehighlighter1_121_646_Closed_Image.style.display='inline'; Codehighlighter1_121_646_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_121_646_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_121_646_Closed_Text.style.display='none'; Codehighlighter1_121_646_Open_Image.style.display='inline'; Codehighlighter1_121_646_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_121_646_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_121_646_Open_Text><span style="COLOR: #000000">{<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><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;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;先搜索系统中第一个进程的信息</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">11</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><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;Process32First(hSnapshot,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">pe);<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img id=Codehighlighter1_193_555_Open_Image onclick="this.style.display='none'; Codehighlighter1_193_555_Open_Text.style.display='none'; Codehighlighter1_193_555_Closed_Image.style.display='inline'; Codehighlighter1_193_555_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_193_555_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_193_555_Closed_Text.style.display='none'; Codehighlighter1_193_555_Open_Image.style.display='inline'; Codehighlighter1_193_555_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">do</span><span id=Codehighlighter1_193_555_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_193_555_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">16</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;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;可通过pe获取指定的信息<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">18</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#8230;&#8230;<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">20</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;获取感兴趣的进程信息<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">22</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#8230;&#8230;<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">24</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&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">25</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>TCHAR&nbsp;processPath[MAX_PATH]<br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">28</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;HPROCESS&nbsp;hProcess&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;OpenProcess(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;FALSE,&nbsp;pe.th32ProcessID);<br></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">30</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;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;（NULL&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;hProcess）<br></span><span style="COLOR: #008080">31</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;GetModuleFileName((HMODULE)&nbsp;hProcess,&nbsp;processPath,&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(processPath));<br></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">33</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;CloseHandle(hProcess);<br></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">35</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(&nbsp;Process32Next(hSnapshot,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">pe));<br></span><span style="COLOR: #008080">36</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">37</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;关闭快照句柄</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">38</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>CloseToolhelp32Snapshot(hSnapshot);&nbsp;<br></span><span style="COLOR: #008080">40</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">41</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">42</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 9pt; LINE-HEIGHT: normal; TEXT-ALIGN: left; mso-char-indent-count: 1.0; mso-layout-grid-align: none" align=left>&nbsp;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 9pt; LINE-HEIGHT: normal; TEXT-ALIGN: left; mso-char-indent-count: 1.0; mso-layout-grid-align: none" align=left><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体; mso-hansi-font-family: Arial; mso-font-kerning: 0pt; mso-no-proof: yes"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 16pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">【模块】<span lang=EN-US><o:p></o:p></span></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体">已知进程<span lang=EN-US>ID</span>，便可获得对应各模块的信息。在此介绍了如何获得模块的信息。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; FONT-FAMILY: 楷体_GB2312; mso-hansi-font-family: 宋体">数据结构<span lang=EN-US><o:p></o:p></span></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 28.1pt; mso-para-margin-left: 2.34gd"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; FONT-FAMILY: 楷体_GB2312; mso-hansi-font-family: 宋体"><img height=287 src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image002.gif" width=558 v:shapes="_x0000_s1028 _x0000_s1029 _x0000_s1030"><br><br></span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%; FONT-FAMILY: 楷体_GB2312; mso-hansi-font-family: 宋体">代码示例<span lang=EN-US><o:p></o:p></span></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: 新宋体; mso-hansi-font-family: Arial; mso-font-kerning: 0pt; mso-no-proof: yes"></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">MODULEENTRY32&nbsp;me;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;定义模块对象</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">me.dwSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(me);<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;创建对应进程的模块快照</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">HANDLE&nbsp;handle&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,&nbsp;pe.th32ProcessID);<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></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;handle)<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img id=Codehighlighter1_182_470_Open_Image onclick="this.style.display='none'; Codehighlighter1_182_470_Open_Text.style.display='none'; Codehighlighter1_182_470_Closed_Image.style.display='inline'; Codehighlighter1_182_470_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_182_470_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_182_470_Closed_Text.style.display='none'; Codehighlighter1_182_470_Open_Image.style.display='inline'; Codehighlighter1_182_470_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_182_470_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_182_470_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></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;先搜索系统中第一个模块的信息</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">Module32First(handle,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">me);<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img id=Codehighlighter1_233_391_Open_Image onclick="this.style.display='none'; Codehighlighter1_233_391_Open_Text.style.display='none'; Codehighlighter1_233_391_Closed_Image.style.display='inline'; Codehighlighter1_233_391_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_233_391_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_233_391_Closed_Text.style.display='none'; Codehighlighter1_233_391_Open_Image.style.display='inline'; Codehighlighter1_233_391_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">do</span><span id=Codehighlighter1_233_391_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_233_391_Open_Text><span style="COLOR: #000000">{<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;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;获取模块信息<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#8230;&#8230;<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;获取感兴趣的模块信息<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#8230;&#8230;<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">15</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&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">16</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;&nbsp;&nbsp;GetModuleFileName(me.hModule,&nbsp;me.szExePath,&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(me.szExePath));&nbsp;<br></span><span style="COLOR: #008080">17</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: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(Module32Next(handle,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">me));<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;关闭快照</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">19</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">CloseToolhelp32Snapshot(handle);&nbsp;<br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
</span>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/89165.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-07-03 15:57 <a href="http://www.cppblog.com/SpringSnow/archive/2009/07/03/89165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows Mobile的蓝牙状态</title><link>http://www.cppblog.com/SpringSnow/archive/2009/07/03/89164.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Fri, 03 Jul 2009 07:45:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/07/03/89164.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/89164.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/07/03/89164.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/89164.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/89164.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>蓝牙的状态有三种状态，分别为：</span><span>BTH_POWER_OFF</span><span>、</span><span>BTH_CONNECTABLE</span><span>、</span><span>BTH_DISCOVERABLE</span><span>。</span></p>
<p><span>三种状态分别是关闭蓝牙；打开蓝牙，使蓝牙可连接；打开连接，使蓝牙可连接和可发现。</span></p>
<p><span>获取蓝牙的状态是利用</span><span>API</span><span>函数</span><span><a href="mk:@MSITStore:F:\保存资料\Magneto%20Documentation%20September%2027,%202005.chm::/html/wce51lrfBthGetMode.htm">BthGetMode</a></span><span>。设置蓝牙的状态是利用</span><span>API</span><span>函数</span><span><a href="mk:@MSITStore:F:\保存资料\Magneto%20Documentation%20September%2027,%202005.chm::/html/wce51lrfBthSetMode.htm">BthSetMode</a></span><span>。</span></p>
<p><br>首先我们看一下<span><a href="mk:@MSITStore:F:\保存资料\Magneto%20Documentation%20September%2027,%202005.chm::/html/wce51lrfBthGetMode.htm">BthGetMode</a><br></span><span>其原型为：<br>int BthGetMode(<br>&nbsp; DWORD* <em><a class=synParam onclick=showTip(this) href=""><u><font color=#0000ff>pdwMode</font></u></a></em><br>);<br>其作用为：获得蓝牙设备当前的状态模式.<br>返回值：如果返回ERROR_SUCCESS ，则成功，否则失败。<br><br><span><a href="http://www.cppblog.com/SpringSnow/admin/href_cetemp=" ?><u><font color=#0000ff>pdwMode</font></u></a></em><br>);<br>其作用为：获得蓝牙设备当前的状态模式.<br>返回值：如果返回ERROR_SUCCESS ，则成功，否则失败。<br><br><span><a href="mk:@MSITStore:F:\保存资料\Magneto%20Documentation%20September%2027,%202005.chm::/html/wce51lrfBthSetMode.htm">BthSetMode</a><br>其原型为：<br>int BthSetMode(<br>&nbsp; DWORD <em><a class=synParam onclick=showTip(this) href="">dwMode</a></em> <br>);<br>其作用为：设置蓝牙设备的状态模式，并将它表现在控制面板上。自启或硬件插入的时候都将维持此状态模式。<br>返回值：如果返回ERROR_SUCCESS ，则成功，否则失败。<br><br>比较简单吧。不举例了。<br></span></span></p>
</span>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/89164.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-07-03 15:45 <a href="http://www.cppblog.com/SpringSnow/archive/2009/07/03/89164.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转： 【实用技巧】Windows Mobile 手机连接电脑时，如何使用GPRS上网，同时跟电脑保持连接。(USB和GPRS共存问题) </title><link>http://www.cppblog.com/SpringSnow/archive/2009/07/01/88973.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Wed, 01 Jul 2009 03:08:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/07/01/88973.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/88973.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/07/01/88973.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/88973.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/88973.html</trackback:ping><description><![CDATA[<div class=postTitle>转自： <a href="http://www.blogjava.net/TiGERTiAN/archive/2009/03/19/260906.html">http://www.blogjava.net/TiGERTiAN/archive/2009/03/19/260906.html</a><a class=postTitle2 id=viewpost1_TitleUrl href="http://www.blogjava.net/TiGERTiAN/archive/2009/03/19/260906.html"><u><font color=#800080><br>【实用技巧】Windows Mobile 手机连接电脑时，如何使用GPRS上网，同时跟电脑保持连接。(USB和GPRS共存问题)</font></u></a> <br>最近移动项目接近尾声，以及很多相关的新项目又接踵而至，所以经常需要带着手机到处去演示。现在有个问题就是，我们连接的是移动专网，而且带了手机卡验证，没有办法通过互联网去连接，这就需要我们一边连着电脑一边去连接GPRS上网，之前公司的D600搭配ActiveSync 4.5是可以的，就是把高级网络功能关闭，这样既可以连接电脑，又可以上GPRS，后来不知怎么的，不能用了。只好另想他法，在国外论坛上面，我发现了一个方法就是使用Pocket Controller。<br>步骤是：<br>1、先安装PC上面的Pocket Controller，然后通过ActiveSync开启高级网络功能连接手机，然后Pocket Controller在连接时会自动提示给手机安装客户端。<br>2、安装完之后，在Pocket Controller中的设置里面，建立一个新的连接通过TCP/IP的。IP就是169.254.2.1<br>3、确认手机开启了TCP/IP连接允许，然后使用Pocket Controller去连接手机。连接成功之后，禁掉ActiveSync，也就是关闭连接设置里面的 允许USB连接和允许通过以下端口连接 两项。<br>4、这样操作之后Pocket Controller仍然与手机保持连接，而且手机也可以上GPRS或者Edge了。 </div>
<br>还未进行验证是否可行，先收入囊中，以防找不到了。
<img src ="http://www.cppblog.com/SpringSnow/aggbug/88973.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-07-01 11:08 <a href="http://www.cppblog.com/SpringSnow/archive/2009/07/01/88973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EDB数据库</title><link>http://www.cppblog.com/SpringSnow/archive/2009/06/26/88568.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Fri, 26 Jun 2009 05:48:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/06/26/88568.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/88568.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/06/26/88568.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/88568.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/88568.html</trackback:ping><description><![CDATA[<p>摘自：<br><a href="http://www.cnblogs.com/randylee/archive/2007/07/19/824555.html">http://www.cnblogs.com/randylee/archive/2007/07/19/824555.html</a><br>WM5以前的系统中一般都是使用的CEDB数据库，EDB是WM5中的新特性之一。为了改善应用程序的性能和长期可移植性，CEDB 已经被 EDB 所取代。EDB 利用了 SQL Mobile 使用的存储子系统，并且提供了明显优于 CEDB 的性能（尤其是在与持久存储区一起使用时）。因为 CEDB 提供了与 EDB 完全相同的函数集 ，所有函数都具有相同的名称和参数列表。但是EDB中也包含了CEDB中所没有函数，并且创建方法也不相同了，要比CEDB复杂。以下就是EDB的创建和使用法：<br><br>一。创建：<br>1。CeMountDBVol( )；//创建卷<br>2。CeCreateDatabaseWithProps()；//卷创建成功后创建EDB<br>3。CeCreateSession()；//EDB创建成功后创建session，用于打开EDB<br>4。CeOpenDatabaseInSession()；//打开EDB<br>创建EDB时前还要创建一个CEDBASEINFOEX对象，这个对象用于创建EDB中的info，用于设定EDB。<br>在打开时还要维护一个全局的HANDLE，在以后的操作中是要使用的<br><br>二。选择数据<br>1。CeSeekDatabaseEx（）；//定位所要找的数据<br>2。CeReadRecordPropsEx（）；//读出定位的数据<br>创建一个CEPROPVAL对象，将所要定位数据的条件传给这个结构。<br><br>三。插入数据<br>CeWriteRecordProps（）；//数据写入EDB<br>创建一个CEPROPVAL对象，或对象数组，将所要写入的数据传给这些对象。<br><br>四。删除数据<br>1。CeSeekDatabaseEx（）；//定位要删除的数据<br>2。CeDeleteRecord（）；//删除定位的数据<br><br>五。更新数据<br>所插入数据基本相同，就是将已有数据覆盖<br>1。CeSeekDatabaseEx（）；//定位所要找的数据<br>2。CeWriteRecordProps（）；//数据写入新数据到EDB覆盖原数据<br><br>六。关闭EDB<br>CloseHandle(打开时的句柄);<br><br>在这里关键是创建EDB时所选的参数，和对结构体的使用，这样才能正确定位数据，否则选择、更新、删除都无法实现。<br><br><br>另外， MSDN中也有相关的文章<br>EDB Database Support<br><a href="http://msdn.microsoft.com/en-us/library/ms885373.aspx">http://msdn.microsoft.com/en-us/library/ms885373.aspx</a><br><br>一定要理解的清楚一些。<br>呵呵，加油。<br></p>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/88568.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-06-26 13:48 <a href="http://www.cppblog.com/SpringSnow/archive/2009/06/26/88568.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mobile获得手机语言</title><link>http://www.cppblog.com/SpringSnow/archive/2009/06/18/87989.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Thu, 18 Jun 2009 08:38:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/06/18/87989.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/87989.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/06/18/87989.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/87989.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/87989.html</trackback:ping><description><![CDATA[今天一直很疑惑手机的语言,其实是对API函数GetSystemDefaultLCID的不解。<br><br>今天在实际中终于摸清楚了该值是怎么一回事，原来他取得是设置中区域设置中的语言标号，而非手机界面的语言标号。<br><br>怎么判断呢？<br><br>我是通过下面的方式进行的。<br><br>
<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"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #000000">LCID&nbsp;lcid&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;GetSystemDefaultLCID();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;PriLan&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;PRIMARYLANGID(lcid);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;SubLan&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;SUBLANGID(lcid);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&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 style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">&nbsp;(PriLan)<br><img id=Codehighlighter1_159_795_Open_Image onclick="this.style.display='none'; Codehighlighter1_159_795_Open_Text.style.display='none'; Codehighlighter1_159_795_Closed_Image.style.display='inline'; Codehighlighter1_159_795_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_159_795_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_159_795_Closed_Text.style.display='none'; Codehighlighter1_159_795_Open_Image.style.display='inline'; Codehighlighter1_159_795_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&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 id=Codehighlighter1_159_795_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_159_795_Open_Text><span style="COLOR: #000000">{<br><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;LANG_CHINESE:<br><img id=Codehighlighter1_193_515_Open_Image onclick="this.style.display='none'; Codehighlighter1_193_515_Open_Text.style.display='none'; Codehighlighter1_193_515_Closed_Image.style.display='inline'; Codehighlighter1_193_515_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_193_515_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_193_515_Closed_Text.style.display='none'; Codehighlighter1_193_515_Open_Image.style.display='inline'; Codehighlighter1_193_515_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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_193_515_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_193_515_Open_Text><span style="COLOR: #000000">{<br><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(SubLan&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;SUBLANG_CHINESE_SIMPLIFIED)<br><img id=Codehighlighter1_253_344_Open_Image onclick="this.style.display='none'; Codehighlighter1_253_344_Open_Text.style.display='none'; Codehighlighter1_253_344_Closed_Image.style.display='inline'; Codehighlighter1_253_344_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_253_344_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_253_344_Closed_Text.style.display='none'; Codehighlighter1_253_344_Open_Image.style.display='inline'; Codehighlighter1_253_344_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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_253_344_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_253_344_Open_Text><span style="COLOR: #000000">{<br><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(GetForegroundWindow(),&nbsp;_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">simple&nbsp;chs</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">note</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;MB_OK);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&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;&nbsp;}</span></span><span style="COLOR: #000000"><br><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(SubLan&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;SUBLANG_CHINESE_TRADITIONAL)<br><img id=Codehighlighter1_410_506_Open_Image onclick="this.style.display='none'; Codehighlighter1_410_506_Open_Text.style.display='none'; Codehighlighter1_410_506_Closed_Image.style.display='inline'; Codehighlighter1_410_506_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_410_506_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_410_506_Closed_Text.style.display='none'; Codehighlighter1_410_506_Open_Image.style.display='inline'; Codehighlighter1_410_506_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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_410_506_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_410_506_Open_Text><span style="COLOR: #000000">{<br><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(GetForegroundWindow(),&nbsp;_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">traditional&nbsp;chs</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">note</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;MB_OK);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&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;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&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><span style="COLOR: #000000"><br><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;LANG_ENGLISH:<br><img id=Codehighlighter1_564_650_Open_Image onclick="this.style.display='none'; Codehighlighter1_564_650_Open_Text.style.display='none'; Codehighlighter1_564_650_Closed_Image.style.display='inline'; Codehighlighter1_564_650_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_564_650_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_564_650_Closed_Text.style.display='none'; Codehighlighter1_564_650_Open_Image.style.display='inline'; Codehighlighter1_564_650_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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_564_650_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_564_650_Open_Text><span style="COLOR: #000000">{<br><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(GetForegroundWindow(),&nbsp;_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">English</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">note</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;MB_OK);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&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><span style="COLOR: #000000"><br><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">:<br><img id=Codehighlighter1_688_773_Open_Image onclick="this.style.display='none'; Codehighlighter1_688_773_Open_Text.style.display='none'; Codehighlighter1_688_773_Closed_Image.style.display='inline'; Codehighlighter1_688_773_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_688_773_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_688_773_Closed_Text.style.display='none'; Codehighlighter1_688_773_Open_Image.style.display='inline'; Codehighlighter1_688_773_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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_688_773_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_688_773_Open_Text><span style="COLOR: #000000">{<br><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(GetForegroundWindow(),&nbsp;_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">others</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">note</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;MB_OK);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&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><span style="COLOR: #000000"><br><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&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></div>
<br>这个有什么作用呢？Mobile手机更改语言设置后，其实对手机显示的语言没有多大影响，只是提示框框，菜单什么的可能会出现指定的文字，排版什么的按这种语言。<br><br>那么界面显示的语言怎么获得呢？利用GetUserDefaultUILanguage，判断方式可同上。<br><br>不错吧！
<img src ="http://www.cppblog.com/SpringSnow/aggbug/87989.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-06-18 16:38 <a href="http://www.cppblog.com/SpringSnow/archive/2009/06/18/87989.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VerQueryValue的学习</title><link>http://www.cppblog.com/SpringSnow/archive/2009/06/17/87893.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Wed, 17 Jun 2009 10:55:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/06/17/87893.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/87893.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/06/17/87893.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/87893.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/87893.html</trackback:ping><description><![CDATA[<p>今天在运用VerQueryValue的时候发现了一个很诡异的问题，出错了。不是这个函数出错了，而是后面对其中的值的运用出错了。<br><br>SDK中的代码是这样的<br><br></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"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Structure&nbsp;used&nbsp;to&nbsp;store&nbsp;enumerated&nbsp;languages&nbsp;and&nbsp;code&nbsp;pages.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_88_126_Open_Image onclick="this.style.display='none'; Codehighlighter1_88_126_Open_Text.style.display='none'; Codehighlighter1_88_126_Closed_Image.style.display='inline'; Codehighlighter1_88_126_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_88_126_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_88_126_Closed_Text.style.display='none'; Codehighlighter1_88_126_Open_Image.style.display='inline'; Codehighlighter1_88_126_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;LANGANDCODEPAGE&nbsp;</span><span id=Codehighlighter1_88_126_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_88_126_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;WORD&nbsp;wLanguage;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;WORD&nbsp;wCodePage;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">lpTranslate;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Read&nbsp;the&nbsp;list&nbsp;of&nbsp;languages&nbsp;and&nbsp;code&nbsp;pages.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">DWORD&nbsp;cbTranslate&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>VerQueryValue(pBlock,&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TEXT(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\\VarFileInfo\\Translation</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(LPVOID</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">lpTranslate,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">cbTranslate);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Read&nbsp;the&nbsp;file&nbsp;description&nbsp;for&nbsp;each&nbsp;language&nbsp;and&nbsp;code&nbsp;page.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;(cbTranslate</span><span style="COLOR: #000000">/</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;LANGANDCODEPAGE));&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;)<br><img id=Codehighlighter1_486_832_Open_Image onclick="this.style.display='none'; Codehighlighter1_486_832_Open_Text.style.display='none'; Codehighlighter1_486_832_Closed_Image.style.display='inline'; Codehighlighter1_486_832_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_486_832_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_486_832_Closed_Text.style.display='none'; Codehighlighter1_486_832_Open_Image.style.display='inline'; Codehighlighter1_486_832_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_486_832_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_486_832_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;wsprintf(&nbsp;SubBlock,&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TEXT(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\\StringFileInfo\\%04x%04x\\FileDescription</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpTranslate[i].wLanguage,<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpTranslate[i].wCodePage);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Retrieve&nbsp;file&nbsp;description&nbsp;for&nbsp;language&nbsp;and&nbsp;code&nbsp;page&nbsp;"i".&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;VerQueryValue(pBlock,&nbsp;<br><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;SubBlock,&nbsp;<br><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;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">lpBuffer,&nbsp;<br><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;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">dwBytes);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>我在使用的时候，直接调用的是lpTranslate[0].wLanguage，然而此时调用出错了！ 为何？可能是这个值不存在。<br><br>简单的判断 if (lpTranslate != NULL) 是不妥的。<br><br>我查看了一下SDK文档<br><br>
<h4 class=dtH4>Return Values</h4>
<p>If the specified version-information structure exists, and version information is available, the return value is nonzero.<span style="COLOR: red"> If the address of the length buffer is zero, no value is available for the specified version-information name.</span></p>
<p>If the specified name does not exist or the specified resource is not valid, the return value is zero. <br><br>如果cbTranslate为零的话，则没有任何版本信息获得，所以我的判断if (lpTranslate != NULL)是不充分的。<br><br>所以需要改为if (lpTranslate != NULL &amp;&amp; cbTranslate != 0)， 这样就OK了。<br><br>总结： 要认真看文档， 有些条件要注意到！<br><br><br></p>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/87893.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-06-17 18:55 <a href="http://www.cppblog.com/SpringSnow/archive/2009/06/17/87893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WM_CANCELMODE 的学习</title><link>http://www.cppblog.com/SpringSnow/archive/2009/06/16/87804.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Tue, 16 Jun 2009 08:23:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/06/16/87804.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/87804.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/06/16/87804.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/87804.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/87804.html</trackback:ping><description><![CDATA[昨天在研究mobile上挂机的时侯，发现了这么一个消息。不过这个消息与挂机没有什么关联。只是在其他界面遮盖对话框的时候会产生这个消息。<br>下面我们来看一下这个消息的介绍，摘自SDK。<br><br>WM_CANCELMODE <br><br>功能描述：<br>This message is sent to the focus window when a dialog box or message box is displayed; this enables the focus window to cancel modes, such as stylus capture. <br><br>返回值：<br>An application should return zero if it processes this message. <br><br>这里还有一些相关的信息：<br><br>摘自：<a href="http://support.microsoft.com/kb/74548/en-us/">http://support.microsoft.com/kb/74548/en-us/</a><br><br>In the Microsoft Windows graphical environment, the WM_CANCELMODE message informs a window that it should cancel any internal state. This message is sent to the window with the focus when a dialog box or a message box is displayed, giving the window the opportunity to cancel states such as mouse capture. <br><br>When a control has the focus, it receives a WM_CANCELMODE message when the EnableWindow function disables the control or when a dialog box or a message box is displayed. When a control receives this message, it should cancel modes, such as mouse capture, and delete any timers it has created. A control must cancel these modes because an application may use a notification from the control to display a dialog box or a message box. <br><br>The DefWindowProc function processes WM_CANCELMODE by calling the ReleaseCapture function, which cancels the mouse capture for whatever window has the capture. The DefWindowProc function does not cancel any other modes. <br><br>原来想尝试一下别的窗口遮盖住对话框后做一些操作，这个消息似乎是一遮盖就发出了，不起作用。原来我把这个消息想得太好了。<br><br>呼呼，不用了
<img src ="http://www.cppblog.com/SpringSnow/aggbug/87804.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-06-16 16:23 <a href="http://www.cppblog.com/SpringSnow/archive/2009/06/16/87804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转载:Windows Mobile中如何建立GPRS连接以便Socket能正常通信</title><link>http://www.cppblog.com/SpringSnow/archive/2009/06/12/87503.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Fri, 12 Jun 2009 08:53:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/06/12/87503.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/87503.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/06/12/87503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/87503.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/87503.html</trackback:ping><description><![CDATA[<p align=center>转载: <a href="http://www.vckbase.com/document/viewdoc/?id=1803">http://www.vckbase.com/document/viewdoc/?id=1803</a><br><br>Windows Mobile中如何建立GPRS连接以便Socket能正常通信<br><br>作者：<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#99;&#104;&#114;&#121;&#115;&#64;&#49;&#54;&#51;&#46;&#99;&#111;&#109;"><font color=#0000ff><u>谢红伟</u></font></a></p>
<p align=left>　　最近编写一个医疗项目的程序，需要用 Windows Mobile 来做通信处理，需要将手机端的数据通过GPRS传送至公网上的一个服务器上。数据传输我采用的是socket，用数据线+ActiveSync调试通过，数据传输正常，在准备将软件提交给质检部门的时候，用真正的GPRS来做通信测试时，问题出来了，连接始终建立不了，但用手机的IE浏览器却能正常打开网页，而且奇怪的是只要用IE浏览器成功访问过一次网页，我的 socket 就能正常进行数据通信，看来传说中的GPRS常连接被我误解了。<br>　　手机开通GPRS以后，我们的socket 程序还不能直接建立网络连接，需要用连接管理器来获取当前可用连接，并自动选择一个最佳的连接途径，然后启用这个连接，在连接启动成功以后再用socket 进行网络连接方可正常进行。大概GPRS拨号和连接过程就是在这里自动进行的吧。源代码中封装了一个连接管理的类和测试代码，可以清楚地看到Windows Mobile 在socket 编程之前到底需要做什么样的操作。<br><br>首先需要枚举当前可用的连接 </p>
<pre>void CConnectManager::EnumNetIdentifier ( OUT CStringArray &amp;StrAry )
{
CONNMGR_DESTINATION_INFO networkDestInfo = {0};
// 得到网络列表
for ( DWORD dwEnumIndex=0; ; dwEnumIndex++ )
{
memset ( &amp;networkDestInfo, 0, sizeof(CONNMGR_DESTINATION_INFO) );
if ( ConnMgrEnumDestinations ( dwEnumIndex, &amp;networkDestInfo ) == E_FAIL )
{
break;
}
StrAry.Add ( networkDestInfo.szDescription );
}
}
</pre>
接下来找到&#8220;Internet&#8221;这个连接，可用远程URL映射的方式来完成，这样可以让系统自动选取一个最好的连接。
<pre>int CConnectManager::MapURLAndGUID ( LPCTSTR lpszURL, OUT GUID &amp;guidNetworkObject, OUT CString *pcsDesc/*=NULL*/ )
{
if ( !lpszURL || lstrlen(lpszURL) &lt; 1 )
return FALSE;
memset ( &amp;guidNetworkObject, 0, sizeof(GUID) );
int nIndex = 0;
HRESULT hResult = ConnMgrMapURL ( lpszURL, &amp;guidNetworkObject, (DWORD*)&amp;nIndex );
if ( FAILED(hResult) )
{
nIndex = -1;
DWORD dwLastError = GetLastError ();
AfxMessageBox ( _T("Could not map a request to a network identifier") );
}
else
{
if ( pcsDesc )
{
CONNMGR_DESTINATION_INFO DestInfo = {0};
if ( SUCCEEDED(ConnMgrEnumDestinations(nIndex, &amp;DestInfo)) )
{
*pcsDesc = DestInfo.szDescription;
}
}
}
return nIndex;
}
</pre>
以下代码是用来启用指定编号的连接
<pre>BOOL CConnectManager::EstablishConnection ( DWORD dwIndex )
{
ReleaseConnection ();
// 得到正确的连接信息
CONNMGR_DESTINATION_INFO DestInfo = {0};
HRESULT hResult = ConnMgrEnumDestinations(dwIndex, &amp;DestInfo);
BOOL bRet = FALSE;
if(SUCCEEDED(hResult))
{
// 初始化连接结构
CONNMGR_CONNECTIONINFO ConnInfo;
ZeroMemory(&amp;ConnInfo, sizeof(ConnInfo));
ConnInfo.cbSize = sizeof(ConnInfo);
ConnInfo.dwParams = CONNMGR_PARAM_GUIDDESTNET;
ConnInfo.dwFlags = CONNMGR_FLAG_PROXY_HTTP |
CONNMGR_FLAG_PROXY_WAP |
CONNMGR_FLAG_PROXY_SOCKS4 |
CONNMGR_FLAG_PROXY_SOCKS5;
ConnInfo.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE;
ConnInfo.guidDestNet = DestInfo.guid;
ConnInfo.bExclusive	= FALSE;
ConnInfo.bDisabled = FALSE;
DWORD dwStatus = 0;
hResult = ConnMgrEstablishConnectionSync(&amp;ConnInfo, &amp;m_hConnection, 10*1000, &amp;dwStatus );
if(FAILED(hResult))
{
m_hConnection = NULL;
}
else bRet = TRUE;
}
return bRet;
}
</pre>
　　为了确保连接是否真正可用，需要检测连接状态，在规定的时间内如果未取得&#8220;连接成功&#8221;的状态，则认为连接未能正常启用，可能需要配置手机的连接管理器界面
<pre>BOOL CConnectManager::WaitForConnected ( int nTimeoutSec, DWORD *pdwStatus/*=NULL*/ )
{
DWORD dwStartTime = GetTickCount ();
BOOL bRet = FALSE;
while ( GetTickCount ()-dwStartTime &lt; (DWORD)nTimeoutSec * 1000 )
{
if ( m_hConnection )
{
DWORD dwStatus = 0;
HRESULT hr = ConnMgrConnectionStatus ( m_hConnection, &amp;dwStatus );
if ( pdwStatus ) *pdwStatus = dwStatus;
if ( SUCCEEDED(hr) )
{
if ( dwStatus == CONNMGR_STATUS_CONNECTED )
{
bRet = TRUE;
break;
}
}
}
Sleep ( 100 );
}
return bRet;
}
</pre>
　　至此，我们的连接启用工作已经做完了，我们可以用我们熟悉的 socket 来编写网络通信程序了。下面是一个测试 socket 测试网络连接是否能正常建立的例子：
<pre>SetWaitCursor ();
CSocket sock;
sock.Create ();
if ( sock.Connect ( _T("www.baidu.com"), 80 ) )
{
RestoreCursor ();
AfxMessageBox ( _T("Connect to www.baidu.com successfully"), MB_ICONINFORMATION );
}
else
{
RestoreCursor ();
AfxMessageBox ( _T("Connect to www.baidu.com failed") );
}
</pre>
<br>GPRSDemo.exe 的使用<br>程序启动以后出现如下界面：
<p><img src="http://www.vckbase.com/document/journal/vckbase52/images/winmobileimg.gif" border=0></p>
<p>连接可用性 &#8211; 检测连接管理器是否可用<br>映射URL &#8211; 是让系统自动寻找一个最好的连接<br>枚举网络标识符 &#8211; 将当前系统中所有可用的连接都会被枚举出来<br>连接网络 &#8211; 将枚举出来的连接选中的那个连接进行连接启用操作。<br>连接状态 &#8211; 表示可以获取到当前连接的状态；<br>连接到公网测试 &#8211; 利用 www.baidu.com 来测试连接是否已经正常启动。</p>
<p>操作步骤：</p>
<p>可以直接按&#8220;枚举网络标识符&#8221;，程序将所有当前在用的网络枚举出来并添加到 ListBox 控件中；<br>连接网络。选择一个连接（例如：Internet），按&#8220;连接网络&#8221;按钮，当提示 Connection net successfully 表示连接已经正常启用了。<br>按&#8220;连接到公网测试&#8221;按钮，软件自动和 www.baidu.com 进行连接测试。<br><br>总结：<br>从网上看到GPRS的连接方法大都采用这种方法。但是这种方法在我实际的运用中有时也连不上网络，这让我很郁闷！<br>方法就是继续寻找更可行的方案。</p>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/87503.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-06-12 16:53 <a href="http://www.cppblog.com/SpringSnow/archive/2009/06/12/87503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ConnMgr.exe —— Connection Manager application</title><link>http://www.cppblog.com/SpringSnow/archive/2009/05/27/85864.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Wed, 27 May 2009 01:32:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/05/27/85864.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/85864.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/05/27/85864.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/85864.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/85864.html</trackback:ping><description><![CDATA[<p>昨天在解决如何从与Active Sync的连接中断开，连接wap网络时遇到。这个问题还是没有解决。有人建议将ConnMgr.exe关闭。这个方法我尝试了，但是引来的问题是我的其他网络也无法连接。尝试了一下IE，它重新启动了ConnMgr.exe，并且继续走Active Sync网络。这个机制怎么做到的，不是很清楚。<br><br>所以从SDK上查了一下ConnMgr.exe的介绍。<br><font color=#000000><span style="BACKGROUND: #335ea8; COLOR: white"><font face=宋体><br></font></span><span lang=EN-US style="FONT-SIZE: 15pt"><font face=宋体>The Connection Manager application is <span style="BACKGROUND: #335ea8; COLOR: white">ConnMgr.exe</span>. It interacts with multiple device applications, such as Internet Explorer Mobile, to schedule and manage network connections. It maintains a list of all connection requests, their priorities, and the available Connection Manager configuration service providers per device. <o:p></o:p></font></span></font></p>
<p><span lang=EN-US style="FONT-SIZE: 15pt"><font face=宋体>When called by an application, the Connection Manager application must first determine the end-to-end paths from the device to the target network, for example, the Internet or a corporate network. Connection Manager does this by retrieving all possible connections from the Connection Manager configuration service providers, and finds all the paths from the device to the target network. For more about the service providers, see </font><a href="mk:@MSITStore:F:\保存资料\Magneto%20Documentation%20September%2027,%202005.chm::/html/wce51conconnectionserviceprovider.htm"><u><font face=宋体 color=#0000ff>Connection Manager Configuration Service Provider</font></u></a><font face=宋体>.<o:p></o:p></font></span></p>
<p><span lang=EN-US style="FONT-SIZE: 15pt"><font face=宋体>When the Connection Manager application has found all the possible paths from the device to the target network, it uses Connection Planner to determine the best connection to the target network. Connection Planner determines which connection requests should be connected at a specific time and which paths those requests should use to connect to their destination. For more information about the role of this component, see </font><a href="mk:@MSITStore:F:\保存资料\Magneto%20Documentation%20September%2027,%202005.chm::/html/wce51conconnectionplanner.htm"><u><font face=宋体 color=#800080>Connection Planner</font></u></a><font face=宋体>.<o:p></o:p></font></span></p>
<p><span lang=EN-US style="FONT-SIZE: 15pt"><font face=宋体>Once a proper connection has been determined and established by Connection Planner, the Connection Manager application schedules this connection, taking into account other scheduled connections and their priorities and security levels. It enables multiple applications to use the same connection on an interval basis instead of establishing a separate connection, in an attempt to reduce the number of redundant connections. A device application might need to make a short connection at an interval of every few minutes, and Connection Manager must schedule these short connections. If there are several applications that need to use the same connection on an interval basis, Connection Manager can notify each application when another application has already established that connection. <o:p></o:p></font></span></p>
<p><span lang=EN-US style="FONT-SIZE: 15pt"><font face=宋体>For example, if five device applications request a connection to the same network at an interval of every half hour, this could result in up to 10 connections to the same location every hour. Connection Manager tries to schedule the connections so that only two actual connections are needed per hour.<o:p></o:p></font></span></p>
<p><span lang=EN-US style="FONT-SIZE: 15pt"><font face=宋体>When a network connection enters an idle state for a specified period, Connection Manager automatically disconnects the connection. This mechanism frees device applications from having to handle low-level connection tasks. When an application requests a scheduled connection to a certain destination network with a specified time period interval, the Connection Manager application wakes up the device application when a connection to the specified destination network is available, or at the end of each time period interval. In the former case, the application can make use of the available connection. In the latter case, Connection Manager does not establish a connection but just wakes up the application. It is up to the application to request Connection Manager to establish the connection to the destination network.<o:p></o:p></font></span></p>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/85864.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-05-27 09:32 <a href="http://www.cppblog.com/SpringSnow/archive/2009/05/27/85864.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转: Start &amp; Stop ActiveSync</title><link>http://www.cppblog.com/SpringSnow/archive/2009/05/26/85801.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Tue, 26 May 2009 08:05:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/05/26/85801.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/85801.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/05/26/85801.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/85801.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/85801.html</trackback:ping><description><![CDATA[链接地址:<br><a href="http://blogs.msdn.com/windowsmobile/archive/2005/11/28/497621.aspx">http://blogs.msdn.com/windowsmobile/archive/2005/11/28/497621.aspx</a><br><br>今天在寻找如何中断active connect时发现的一篇文章. 关于开始和停止同步的函数<br><br><span>Start &amp; Stop ActiveSync</span> <br><br>
<p>Windows Mobile 5 is so jam packed with cool new APIs that some of the smaller (but still very useful!) ones fall through the PR cracks.&nbsp; Here are two that I just got remineded of by a post in the smartphone.developer newsgroup:</p>
<p><a href="http://msdn.microsoft.com/library/en-us/mobilesdk5/html/wce51grfActiveSyncStart.asp"><font color=#0000ff><u>ActiveSyncStart</u></font></a>&nbsp;&amp; <a href="http://msdn.microsoft.com/library/en-us/mobilesdk5/html/wce51grfActiveSyncStop.asp"><u><font color=#0000ff>ActiveSyncStop</font></u></a></p>
<p>These device-side APIs&nbsp;do exactly what the names imply.&nbsp; To kick off or stop&nbsp;a synchornization from a desktop app,&nbsp;just use CeRapiInvoke to call them.<br><br></p>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/85801.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-05-26 16:05 <a href="http://www.cppblog.com/SpringSnow/archive/2009/05/26/85801.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CreateToolhelp32Snapshot 失败的解决方法</title><link>http://www.cppblog.com/SpringSnow/archive/2009/05/26/85783.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Tue, 26 May 2009 04:56:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/05/26/85783.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/85783.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/05/26/85783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/85783.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/85783.html</trackback:ping><description><![CDATA[<p><br>&nbsp;&nbsp;&nbsp;&nbsp; 在工作中遇到这样一个问题：CreateToolhelp32Snapshot&nbsp;失败，利用GetLastError获得错误值是8，存储空间不足，无法处理此命令。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; 查看我们的存储空间，还有很多。这是为什么呢？<br><br>&nbsp;&nbsp;&nbsp;&nbsp; 昨天跑到MSDN上去问了一下这个问题，没想到今天就有人给了我回答：使用TH32CS_SNAPNOHEAPS参数，既可解决这个问题。原因在于如果不采用改参数的话，有可能快照会占用整个堆的空间。<br><br>&nbsp;&nbsp;&nbsp;&nbsp; 于是我们的使用方式将变为：<br>&nbsp;&nbsp;&nbsp;&nbsp; HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS| TH32CS_SNAPNOHEAPS, 0);<br><br>&nbsp;&nbsp;&nbsp;&nbsp; 目前我也只是简单验证了一下，OK。如果大家也遇到这种情况的话，不妨试一下。</p>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/85783.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-05-26 12:56 <a href="http://www.cppblog.com/SpringSnow/archive/2009/05/26/85783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转:Windows Mobile系统功能表</title><link>http://www.cppblog.com/SpringSnow/archive/2009/05/20/83482.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Wed, 20 May 2009 08:00:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/05/20/83482.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/83482.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/05/20/83482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/83482.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/83482.html</trackback:ping><description><![CDATA[<div class=tit>Windows Mobile系统功能表<br>摘自:http://hi.baidu.com/rambochow/blog/item/e585bd251fba846735a80f6a.html</div>
<div class=date>2009-02-10 下午 01:30</div>
<table style="TABLE-LAYOUT: fixed">
    <tbody>
        <tr>
            <td>
            <div class=cnt id=blog_text>backlight.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 电源设置<br>btftpclient.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 蓝牙资源管理器<br>bubblebreaker.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 连球游戏<br>calc.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 计算器<br>calender.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 日历<br>camera.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 相机<br>clearstorage.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 恢复出厂设置<br>clock.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 时钟<br>commManager.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通讯管理<br>commuRec.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通讯录<br>cprog.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 电话<br>CSDtype.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CSD线路设置<br>cusTSK.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主题设置<br>cvdsetting.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 语音拨号设置<br>Deviceinfo.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设备信息<br>dlagent.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载代理<br>fexplore.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 资源管理器<br>GCHistory.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通话记录<br>GIFplayer.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GIF播放器<br>Gimageview.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图片浏览器<br>GMMSview.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 彩信管理器<br>GOTOne_home.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 移动之家工具包<br>GOTOneServ.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 移动服务<br>GPRSAuthentication.exe&nbsp;&nbsp;&nbsp; GPRS设置<br>GRingView.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 铃声管理<br>Helpdesk.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 移动客户服务<br>IA_Zip.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Zip压缩工具<br>iexplore.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 浏览器<br>intSHrui.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 英特网共享设置<br>JBLend_AMS.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JAVA百宝箱<br>keyLock.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 按键锁<br>Message.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 信息<br>MicrophoneAGC.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 麦克风自动增益<br>Mute.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 振动开<br>MyFavvorite.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我的收藏<br>notes.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 便笺<br>pimg.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图片和视频<br>Powerexe.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 电池电量显示<br>poweroffwarning.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 电源关闭提示<br>poutlook&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 任务<br>ppc_adobereaderle.exe&nbsp;&nbsp;&nbsp;&nbsp; Adobe reader<br>ppt.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; powerpoint<br>pword.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; word<br>pxl.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excl<br>Readial.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 电话拨号程序<br>remnet.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 连接设置<br>repllog.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同步软件<br>safemode.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 安全模式<br>sddialer.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 语音标记录音程序<br>shfind.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 搜索程序<br>SIMlock.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SIM锁<br>SMSService.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 短信服务<br>sndplay.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 播放器？<br>solitare.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 空当接龙<br>STK_UIPPC.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SIM卡应用<br>storagelow.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 电话运行空间不足提示<br>syncml.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 号簿更新<br>tasks.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 任务<br>tmail.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 信息<br>welcome.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 硬启后第一次设置<br>wlansettings.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WLAN设置<br>wmplayer.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wm播放器<br>wrlsmgr.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 无线管理器</div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/83482.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-05-20 16:00 <a href="http://www.cppblog.com/SpringSnow/archive/2009/05/20/83482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转:Windows Mobile 常见进程解析</title><link>http://www.cppblog.com/SpringSnow/archive/2009/05/09/82350.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Sat, 09 May 2009 02:32:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/05/09/82350.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/82350.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/05/09/82350.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/82350.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/82350.html</trackback:ping><description><![CDATA[<h4 class=beTitle id=subjcns!E8BFE1C9BC820B44!1665>Windows Mobile 常见进程解析</h4>
<div class=bvMsg id=msgcns!E8BFE1C9BC820B44!1665>
<p>首发 @Windows Mobile开发者社区(2008-1-5) <a title=http://www.winbile.net/BBS/1034312/ShowPost.aspx href="http://www.winbile.net/BBS/1034312/ShowPost.aspx"><u><font color=#0000ff>http://www.winbile.net/BBS/1034312/ShowPost.aspx</font></u></a></p>
<p>WM5/6常见进程：
<p>connmgr.exe (\Windows\connmgr.exe) !不得停止! <br>连接管理器，管理红外/蓝牙/无线/之类的
<p>cprog.exe (\Windows\cprog.exe) <br>电话程序
<p>device.exe (\Windows\device.exe) !不得停止! <br>设备管理器，也是所有驱动程序所运行的进程。device.exe为每个驱动程序创建一个线程。 <br>配合device.dll 管理内核模式设备驱动程序 <br>配合udevice.exe 管理用户模式设备驱动程序的独立进程
<p>filesys.exe (\Windows\filesys.exe) !不得停止! <br>配合filesys.dll，注册表、文件系统和属性数据库。
<p>gwes.exe (\Windows\gwes.exe) !不得停止! <br>GWES是图形、窗口和事件子系统，就是GUI支持，负责所有图形输出、窗口以及窗口消息（与用户的所有交互）。驻留在GWES地址空间中的驱动程序一般包括显示驱动、打印机驱动、键盘鼠标驱动和触摸屏驱动程序。
<p>NK.exe (\Windows\NK.exe) !不得停止! <br>系统内核
<p>poutlook.exe (\Windows\poutlook.exe) <br>Pocket Outlook，PIM管理（日程、联系人）
<p>services.exe (\Windows\services.exe) !不得停止! <br>系统服务的宿主进程
<p>shell32.exe (\Windows\shell32.exe) !不得停止! <br>动态链接库函数启动器，相当于PC中的Rundll32.dll，不过另一说是相当于explorer.exe
<p>tmail.exe (\Windows\tmail.exe) <br>Messaging(消息服务)，管理短信、Email等消息。
<p>repllog.exe (\Windows\repllog.exe) <br>使用串口进行同步，ActiveSync时用到。
<p>其它常见的进程： <br>udp2tcp.exe <br>系统进程，用户数据服务协议，ActiveSync后自动开启
<p>rapiclnt.exe <br>系统进程，同步管理类，ActiveSync后自动开启
<p>Handsfree.exe <br>电话免提功能
<p>vcdaemon.exe <br>VoiceCommander，语音控制
<p>STK.exe <br>SIM Toolkit，SIM卡应用相关的 </p>
</div>
<br>突然想了解一下Windows Mobile哪些进程不可以停止,找到了这篇文章.很不错.
<img src ="http://www.cppblog.com/SpringSnow/aggbug/82350.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-05-09 10:32 <a href="http://www.cppblog.com/SpringSnow/archive/2009/05/09/82350.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows 消息机制</title><link>http://www.cppblog.com/SpringSnow/archive/2009/04/29/81388.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Wed, 29 Apr 2009 00:02:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/04/29/81388.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/81388.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/04/29/81388.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/81388.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/81388.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Windows 消息机制编写Windows程序有两年了，但当别人问起Windows消息机制总觉得很难形容清楚。在这篇中，集合了很多我从网络中搜集来的一些知识，这里只是汇总一下。我们编写的Windows程序是以事件为驱动，消息机制为基础的。对于每一个正在执行的Windows应用程序,Windows为其建立一个&#8220;消息队列&#8221;，即应用程序队列，用来存放该程序可能创建的各种窗...&nbsp;&nbsp;<a href='http://www.cppblog.com/SpringSnow/archive/2009/04/29/81388.html'>阅读全文</a><img src ="http://www.cppblog.com/SpringSnow/aggbug/81388.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-29 08:02 <a href="http://www.cppblog.com/SpringSnow/archive/2009/04/29/81388.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>