﻿<?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++博客-编程自动化-随笔分类-c++经典文章转载</title><link>http://www.cppblog.com/AutomateProgram/category/8847.html</link><description>当音乐和传说在深夜中沉寂后，程序的每个字符还在跳动！</description><language>zh-cn</language><lastBuildDate>Fri, 13 Jan 2012 09:06:39 GMT</lastBuildDate><pubDate>Fri, 13 Jan 2012 09:06:39 GMT</pubDate><ttl>60</ttl><item><title>Nginx模块开发入门</title><link>http://www.cppblog.com/AutomateProgram/archive/2012/01/05/163629.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Thu, 05 Jan 2012 07:12:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2012/01/05/163629.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/163629.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2012/01/05/163629.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/163629.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/163629.html</trackback:ping><description><![CDATA[<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">到<font face="Times New Roman">nginx.org</font><font face="宋体">上，下载对应的</font><font face="Times New Roman">nginx</font></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">测试<font face="Times New Roman">nginx</font><font face="宋体">是否可以安装<br /><br /></font></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">./configure<br /><br /></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">如果出现<br /><br /></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">./configure:&nbsp;error:&nbsp;the&nbsp;HTTP&nbsp;rewrite&nbsp;module&nbsp;requires&nbsp;the&nbsp;PCRE&nbsp;library.</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">You&nbsp;can&nbsp;either&nbsp;disable&nbsp;the&nbsp;module&nbsp;by&nbsp;using&nbsp;--without-http_rewrite_module</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">option,&nbsp;or&nbsp;install&nbsp;the&nbsp;PCRE&nbsp;library&nbsp;into&nbsp;the&nbsp;system,&nbsp;or&nbsp;build&nbsp;the&nbsp;PCRE&nbsp;library</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">statically&nbsp;from&nbsp;the&nbsp;source&nbsp;with&nbsp;nginx&nbsp;by&nbsp;using&nbsp;--with-pcre=&lt;path&gt;&nbsp;option.<br /></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><br />执行<font face="Times New Roman">:<br /><br /></font></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">sudo&nbsp;aptitude&nbsp;install&nbsp;libpcre3-dev<br /><br /></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">如果还缺少其他包，继续安装。</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">直到</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">./configure<font face="宋体">没有错误<br /><br /></font></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">sudo&nbsp;make</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">sudo&nbsp;make&nbsp;install<br /><br /></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">启动<font face="Times New Roman">nginx</font><font face="宋体">，</font><font face="Times New Roman">sudo&nbsp;/usr/local/nginx/sbin/nginx</font></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">另外启动一个命名窗口：<br /></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><br />安装<font face="Times New Roman">curl<br /><br /></font></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">sudo&nbsp;apt-get&nbsp;install&nbsp;curl</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">执行<font face="Times New Roman">curl&nbsp;-i&nbsp;http://localhost<br /><br /></font></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">或者用浏览器</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">访问</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">http://localhost/</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">就可以看到<font face="Times New Roman">welcome&nbsp;to&nbsp;nginx</font><font face="宋体">的欢迎字幕&nbsp;表示安装成功</font></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p><!--EndFragment--><br /><br />
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">加载<font face="Times New Roman">Empty&nbsp;Gif</font><font face="宋体">插件</font></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p><!--EndFragment--><br />
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">在</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">http://www.evanmiller.org/</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">网站中</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">有篇文章</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">http://www.evanmiller.org/nginx-modules-guide.html</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">介绍了</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">nginx<font face="宋体">的开发，比较全面，但较老，如果要详细了解</font><font face="Times New Roman">nginx</font><font face="宋体">的模块开发，还得熟悉</font><font face="Times New Roman">nginx</font><font face="宋体">的源代码。</font></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-style: normal; font-family: 'Arial'; color: rgb(51,51,51); font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">Empty&nbsp;Gif</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">较为简单，主要的功能就是浏览器访问某个地址，返回一个</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">gif<font face="宋体">图片。</font></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p><!--EndFragment--><br />
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">如何编译：</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Empty&nbsp;Gif</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">使用到了图片库，先安装<br /><br /></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-style: normal; font-family: '宋体'; font-size: 9.5pt; font-weight: normal; mso-spacerun: 'yes'">sudo&nbsp;apt-get&nbsp;install&nbsp;libmagickwand-dev</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;<br /><br /></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p><a href="/Files/AutomateProgram/evanmiller-nginx_circle_gif-f7b6b5c.zip"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">下载</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">Empty&nbsp;Gif</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">代码</span></a><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><br /><br /></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">安装</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">nginx模块的一般步骤如下：</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-style: normal; font-family: '微软雅黑'; color: rgb(0,0,0); font-size: 9.5pt; font-weight: normal; mso-spacerun: 'yes'">1、</span><span style="font-style: normal; font-family: '微软雅黑'; color: rgb(0,0,0); font-size: 9.5pt; font-weight: normal; mso-spacerun: 'yes'">编写模块config文件，这个文件需要放在和模块源代码文件放在同一目录下。文件内容如下：</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">ngx_addon_name=<font face="宋体">模块完整名称</font></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">HTTP_MODULES="$HTTP_MODULES&nbsp;<font face="宋体">模块完整名称</font><font face="Times New Roman">"</font></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">NGX_ADDON_SRCS="$NGX_ADDON_SRCS&nbsp;$ngx_addon_dir/<font face="宋体">源代码文件名</font><font face="Times New Roman">"</font></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">编写</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">源代码</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">文件，放在同一个目录下<br /></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><br />2、</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">进入<font face="Times New Roman">Nginx</font><font face="宋体">源代码，使用命令编译安装<br /></font></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><br />&nbsp;&nbsp;&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">./configure&nbsp;--prefix=<font face="宋体">安装目录&nbsp;</font><font face="Times New Roman">--add-module=</font><font face="宋体">模块源代码文件目录</font></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">--with-debug</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">make</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">sudo&nbsp;make&nbsp;install</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;<br /></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><br />3、</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">修改<font face="Times New Roman">nginx</font><font face="宋体">的配置文件<br /></font></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt; margin-left: 42pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><br />location&nbsp;/circles&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt; margin-left: 42pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;circle_gif;</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt; margin-left: 42pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><br /><br /></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">4<font face="宋体">、启动</font><font face="Times New Roman">nginx<br /><br /></font></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">sudo&nbsp;&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">/usr/local/nginx/sbin/nginx&nbsp;-c&nbsp;/usr/local/nginx/conf/nginx.conf</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;<br /></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><br />在浏览器中输入</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span><a href="http://192.168.239.132/circles/ffffff/000000/20.gif"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 10.5pt; text-decoration: underline; mso-spacerun: 'yes'">http://</span><span style="font-family: '宋体'; color: rgb(0,0,255); font-size: 10.5pt; text-decoration: underline; mso-spacerun: 'yes'">localhost</span><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 10.5pt; text-decoration: underline; mso-spacerun: 'yes'">/circles/ffffff/000000/20.gif</span></a></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;<br /><br /></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">就可以看到</span></p><!--EndFragment--><br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/automateprogram/123.JPG" /><br /><br /><br />
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">其中</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">url<font face="宋体">的格式如下：<br /><br /></font></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">/circles/ffffff/000000/20.gif</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">/circles/&lt;background&nbsp;color&gt;/&lt;foreground&nbsp;color&gt;/&lt;size&gt;.gif<br /></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><br />模块是如何注册</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-style: normal; font-family: 'Arial'; color: rgb(51,51,51); font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">在</span><span><a href="http://nginx.net/"><span style="font-style: normal; font-family: 'Arial'; color: rgb(0,0,255); font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">nginx</span></a></span><span style="font-style: normal; font-family: 'Arial'; color: rgb(51,51,51); font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">代码的<font face="Arial">auto</font><font face="宋体">目录中，有一个名为</font><font face="Arial">sources</font><font face="宋体">的文件，根据编译选项（</font><font face="Arial">configure</font><font face="宋体">的参数）的不同，</font><font face="Arial">m4</font><font face="宋体">宏变量</font><font face="Arial">HTTP_MODULES</font><font face="宋体">的值会发生变化：</font></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><br /></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><br /></span><span style="font-style: normal; font-family: 'Arial'; color: rgb(51,51,51); font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">如果指定了使用<font face="Arial">empty&nbsp;gif</font><font face="宋体">模块（默认就是使用了），则最终</font><font face="Arial">m4</font><font face="宋体">宏变量</font><font face="Arial">HTTP_MODULES</font><font face="宋体">的值可能如下：</font></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><br /></span><span style="font-style: normal; font-family: 'Arial'; color: rgb(51,51,51); font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'"><br />HTTP_MODULES="ngx_http_module&nbsp;/</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><br /></span><span style="font-style: normal; font-family: 'Arial'; color: rgb(51,51,51); font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ngx_http_core_module&nbsp;/</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><br /></span><span style="font-style: normal; font-family: 'Arial'; color: rgb(51,51,51); font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ngx_http_log_module&nbsp;/</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><br /></span><span style="font-style: normal; font-family: 'Arial'; color: rgb(51,51,51); font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ngx_http_upstream_module&nbsp;/</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><br /></span><span style="font-style: normal; font-family: 'Arial'; color: rgb(51,51,51); font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ngx_http_empty_gif_module&nbsp;"</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><br /></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><br /></span><span style="font-style: normal; font-family: 'Arial'; color: rgb(51,51,51); font-size: 10.5pt; font-weight: normal; mso-spacerun: 'yes'">注意：这里的<font face="Arial">ngx_http_empty_gif_module</font><font face="宋体">字符串对应了</font><font face="Arial">ngx_http_empty_gif_module.c</font><font face="宋体">文件中的</font><font face="Arial">Module</font><font face="宋体">主结构变量名。</font></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;<br /><br /><br /></span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">参考文章：</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span><a href="http://www.evanmiller.org/"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 10.5pt; text-decoration: underline; mso-spacerun: 'yes'">http://www.evanmiller.org/</span></a></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span><a href="http://www.evanmiller.org/nginx-modules-guide.html"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 10.5pt; text-decoration: underline; mso-spacerun: 'yes'">http://www.evanmiller.org/nginx-modules-guide.html</span></a></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span><a href="http://www.162cm.com/p/ngx_ext.html"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 10.5pt; text-decoration: underline; mso-spacerun: 'yes'">http://www.162cm.com/p/ngx_ext.html</span></a></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span><a href="http://www.codinglabs.org/html/intro-of-nginx-module-development.html"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 10.5pt; text-decoration: underline; mso-spacerun: 'yes'">http://www.codinglabs.org/html/intro-of-nginx-module-development.html</span></a></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span><a href="http://blog.csdn.net/conezxy/article/details/1869130"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 10.5pt; text-decoration: underline; mso-spacerun: 'yes'">http://blog.csdn.net/conezxy/article/details/1869130</span></a></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;<br /><a href="http://ri0day.blogbus.com/logs/61820056.html">http://ri0day.blogbus.com/logs/61820056.html</a><br /><br /></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">在</span><span><a href="http://wiki.nginx.org/3rdPartyModules"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">http://wiki.nginx.org/3rdPartyModules</span></a></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">中有很多关于第三方模块的开发，国人</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">agentzh</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">在这方面做了大量的工作。</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p><!--EndFragment--><br /><br /><br /><img src ="http://www.cppblog.com/AutomateProgram/aggbug/163629.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2012-01-05 15:12 <a href="http://www.cppblog.com/AutomateProgram/archive/2012/01/05/163629.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>centso5下使用coreseek(sphinx)建立搜索引擎</title><link>http://www.cppblog.com/AutomateProgram/archive/2011/08/25/154335.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Thu, 25 Aug 2011 06:15:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2011/08/25/154335.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/154335.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2011/08/25/154335.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/154335.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/154335.html</trackback:ping><description><![CDATA[<p>1.安装coreseek</p>
<p>CentOS的测试环境安装<br />参考地址：<a href="http://www.coreseek.cn/products/products-install/install_on_bsd_linux/CentOS-5-5/">http://www.coreseek.cn/products/products-install/install_on_bsd_linux/CentOS-5-5/</a></p>
<p>32位版本：<br />coreseek安装需要预装的软件：yum install make gcc g++ gcc-c++ libtool autoconf automake imake mysql-devel libxml2-devel expat-devel</p>
<p>64位版本：<br />coreseek安装需要预装的软件：yum install make gcc g++ gcc-c++ libtool autoconf automake imake mysql-devel libxml2-devel expat-devel</p>
<p>CoreSeek安装：<br />参考地址：<br /><a href="http://www.coreseek.cn/products-install/install_on_bsd_linux/">http://www.coreseek.cn/products-install/install_on_bsd_linux/</a></p>
<p>##下载coreseek：coreseek 3.2.14：点击下载、coreseek 4.0.1：点击下载<br />$ wget <a href="http://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.14.tar.gz">http://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.14.tar.gz</a><br />$ 或者 <a href="http://www.coreseek.cn/uploads/csft/4.0/coreseek-4.0.1-beta.tar.gz">http://www.coreseek.cn/uploads/csft/4.0/coreseek-4.0.1-beta.tar.gz</a><br />$ tar xzvf coreseek-3.2.14.tar.gz 或者 coreseek-4.0.1-beta.tar.gz<br />$ cd coreseek-3.2.14 或者 coreseek-4.0.1-beta</p>
<p>##前提：需提前安装操作系统基础开发库及mysql依赖库以支持mysql数据源和xml数据源<br />##安装mmseg<br />$ cd mmseg-3.2.14<br />$ ./bootstrap&nbsp;&nbsp;&nbsp; #输出的warning信息可以忽略，如果出现error则需要解决<br />$ ./configure --prefix=/usr/local/mmseg3<br />$ make &amp;&amp; make install<br />$ cd ..</p>
<p>一般情况这都不会出现什么问题。</p>
<p>##安装coreseek<br />$ cd csft-3.2.14 或者 cd csft-4.0.1<br />$ sh buildconf.sh&nbsp;&nbsp;&nbsp; #输出的warning信息可以忽略，如果出现error则需要解决<br />$ ./configure --prefix=/usr/local/coreseek&nbsp; --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql&nbsp;&nbsp;&nbsp; ##如果提示mysql问题，可以查看MySQL数据源安装说明<br />$ make &amp;&amp; make install<br />$ cd ..</p>
<p>---------------------------------------------------------------------------------------------------------------------------------------------------<br />注：<br />问题1:在sh buildconf.sh是可能会出现：Autoconf version 2.62 or higher is required的错误，这是centos的Autoconf版本太低导致的，手动安装一下Autoconf即可<br />centos下升级autoconf<br />#whereis autoconf #查看autoconf的路径 <br />#rpm -qf /usr/bin/autoconf #查看autoconf的版本<br />#rpm -e --nodeps autoconf-2.59-12 #卸载原来版本<br />#tar -zxf autoconf-2.65.tar.gz<br />#cd autoconf-2.65<br />#./configure --prefix=/usr<br />#make &amp;&amp; make install<br />#/usr/bin/autoconf -V #查看是否安装成功</p>
<p>问题2:出现 undefined reference to libiconv_open的错误，<br />sphinx依赖于libiconv实现编码转换。所以在机器上提前要安装libiconv库。然后有configure完成后，使用命令 vim src/Makefile(在csft目录里)，<br />找到 LIBS = -lm -lexpat -L/usr/local/lib 改为LIBS = -lm -lexpat -liconv -L/usr/local/lib重新make就可以了。网上有其它人将宏#define USE_LIBICONV改为0，<br />表示不使用libiconv。虽然可以解决问题，但不推荐此方法。<br />安装liconv：<br />#wget <a href="http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz">http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz</a><br />#tar -zxvf libiconv-1.13.1.tar.gz<br />#cd libiconv-1.13.1<br /># ./configure --prefix=/usr/local/libiconv<br /># make<br /># make install<br /><br /><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; ">编辑：<br />./src/MakeFile文件<br />将<br />LIBS = -lm -lexpat -L/usr/local/lib<br />改成<br />LIBS = -lm -lexpat -liconv -L/usr/local/lib&nbsp;</span><br /><br /></p>
<p>使用命令&#8221;bin/indexer&#8221;创建索引时，出现&#8221;error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or directory&#8221;的问题</p>
<p>在出现这个问题时，先看是否在 /usr/lib下有libiconv.so.2文件或此文件的软(硬)连接。没有的话就做一下连接(前提是安装了libiconv)。然后执行如下的命令：<br />echo&nbsp;&nbsp; /usr/lib &gt;&gt; /etc/ld.so.conf　接着执行ldconfig。这时就没有问题了。<br />----------------------------------------------------------------------------------------------------------------------------------------------------</p>
<p><br />##测试mmseg分词，coreseek搜索（需要预先设置好字符集为zh_CN.UTF-8，确保正确显示中文）<br />$ cd testpack<br />$ cat var/test/test.xml&nbsp;&nbsp;&nbsp; #此时应该正确显示中文<br />$ /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc var/test/test.xml<br />$ /usr/local/coreseek/bin/indexer -c etc/csft.conf --all<br />$ /usr/local/coreseek/bin/search -c etc/csft.conf 网络搜索</p><img src ="http://www.cppblog.com/AutomateProgram/aggbug/154335.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2011-08-25 14:15 <a href="http://www.cppblog.com/AutomateProgram/archive/2011/08/25/154335.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SetWindowsHookEx原理(如何使用钩子，使用钩子hook其他进程的函数)</title><link>http://www.cppblog.com/AutomateProgram/archive/2011/01/24/139227.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Mon, 24 Jan 2011 07:30:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2011/01/24/139227.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/139227.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2011/01/24/139227.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/139227.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/139227.html</trackback:ping><description><![CDATA[原文地址：<a href="http://blog.sina.com.cn/s/blog_5a0662bf0100g8jd.html">http://blog.sina.com.cn/s/blog_5a0662bf0100g8jd.html</a><div><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; word-wrap: normal; word-break: normal; line-height: 21px; color: rgb(72, 72, 72); font-family: simsun; font-size: 14px; ">基本概念<br>　　钩子(Hook)，是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息，而且所监视的窗口可以是其他进程所创建的。当消息到达后，在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。 钩子实际上是一个处理消息的程序段，通过系统调用，把它挂入系统。每当特定的消息发出，在没有到达目的窗口前，钩子程序就先捕获该消息，亦即钩子函数先得到控制权。这时钩子函数即可以加工处理（改变）该消息，也可以不作处理而继续传递该消息，还可以强制结束消息的传递。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; word-wrap: normal; word-break: normal; line-height: 21px; color: rgb(72, 72, 72); font-family: simsun; font-size: 14px; ">运行机制<br>　　1、钩子链表和钩子子程：<br>　　每一个Hook都有一个与之相关联的指针列表，称之为钩子链表，由系统来维护。这个列表的指针指向指定的，应用程 序定义的，被Hook子程调用的回调函数，也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时，系统就把这个消息传递到Hook子程。 一些Hook子程可以只监视消息，或者修改消息，或者停止消息的前进，避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始， 而最早安装的钩子放在最后，也就是后加入的先获得控制权。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; word-wrap: normal; word-break: normal; line-height: 21px; color: rgb(72, 72, 72); font-family: simsun; font-size: 14px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载，Windows 便释放其占用的内存，并更新整个Hook链表。如果程序安装了钩子，但是在尚未卸载钩子之前就结束了，那么系统会自动为它做卸载钩子的操作。<br>　　钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数，只能定义为普通的C函数。用以监视系统或某一特定类型的事件，这些事件可以是与某一特定线程关联的，也可以是系统中所有线程的事件。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; word-wrap: normal; word-break: normal; line-height: 21px; color: rgb(72, 72, 72); font-family: simsun; font-size: 14px; ">钩子子程必须按照以下的语法：<br>　　LRESULT CALLBACK HookProc<br>　　(<br>　　int nCode,<br>　　WPARAM wParam,<br>　　LPARAM lParam<br>　　);<br>　　HookProc是应用程序定义的名字。<br>　　nCode参数是Hook代码，Hook子程使用这个参数来确定任务。这个参数的值依赖于Hook类型，每一种Hook都有自己的Hook代码特征字符集。<br>　　wParam和lParam参数的值依赖于Hook代码，但是它们的典型值是包含了关于发送或者接收消息的信息。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; word-wrap: normal; word-break: normal; line-height: 21px; color: rgb(72, 72, 72); font-family: simsun; font-size: 14px; ">2、钩子的安装与释放：<br>　　使用API函数SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子链表中。 SetWindowsHookEx函数总是在Hook链的开头安装Hook子程。当指定类型的Hook监视的事件发生时，系统就调用与这个Hook关联的 Hook链的开头的Hook子程。每一个Hook链中的Hook子程都决定是否把这个事件传递到下一个Hook子程。Hook子程传递事件到下一个 Hook子程需要调用CallNextHookEx函数。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; word-wrap: normal; word-break: normal; line-height: 21px; color: rgb(72, 72, 72); font-family: simsun; font-size: 14px; ">HHOOK SetWindowsHookEx(<br>　　int idHook, // 钩子的类型，即它处理的消息类型<br>　　HOOKPROC lpfn, // 钩子子程的地址指针。如果dwThreadId参数为0<br>　　// 或是一个由别的进程创建的线程的标识，<br>　　// lpfn必须指向DLL中的钩子子程。<br>　　// 除此以外，lpfn可以指向当前进程的一段钩子子程代码。<br>　　// 钩子函数的入口地址，当钩子钩到任何消息后便调用这个函数。<br>　　HINSTANCE hMod, // 应用程序实例的句柄。标识包含lpfn所指的子程的<br>　　DLL。<br>　　// 如果dwThreadId 标识当前进程创建的一个线程，<br>　　// 而且子程代码位于当前进程，hMod必须为NULL。<br>　　// 可以很简单的设定其为本应用程序的实例句柄。<br>　　DWORD dwThreadId // 与安装的钩子子程相关联的线程的标识符。<br>　　// 如果为0，钩子子程与所有的线程关联，即为全局钩子。<br>　　);</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; word-wrap: normal; word-break: normal; line-height: 21px; color: rgb(72, 72, 72); font-family: simsun; font-size: 14px; ">函数成功则返回钩子子程的句柄，失败返回NULL。<br>　　以上所说的钩子子程与线程相关联是指在一钩子链表中发给该线程的消息同时发送给钩子子程，且被钩子子程先处理。　在钩子子程中调用得到控制权的钩子函数在完成对消息的处理后，如果想要该消息继续传递，那么它必须调用另外一个 SDK中的API函数CallNextHookEx来传递它，以执行钩子链表所指的下一个钩子子程。这个函数成功时返回钩子链中下一个钩子过程的返回值， 返回值的类型依赖于钩子的类型。这个函数的原型如下：<br>　　LRESULT CallNextHookEx<br>　　(<br>　　HHOOK hhk;<br>　　int nCode;<br>　　WPARAM wParam;<br>　　LPARAM lParam;<br>　　);<br>　　hhk为当前钩子的句柄，由SetWindowsHookEx()函数返回。<br>　　NCode为传给钩子过程的事件代码。<br>　　wParam和lParam 分别是传给钩子子程的wParam值，其具体含义与钩子类型有关。<br>　　钩子函数也可以通过直接返回TRUE来丢弃该消息，并阻止该消息的传递。否则的话，其他安装了钩子的应用程序将不会接收到钩子的通知而且还有可能产生不正确的结果。<br>　　钩子在使用完之后需要用UnHookWindowsHookEx()卸载，否则会造成麻烦。释放钩子比较简单，UnHookWindowsHookEx()只有一个参数。函数原型如下：<br>　　UnHookWindowsHookEx<br>　　(<br>　　HHOOK hhk;<br>　　);<br>　　函数成功返回TRUE，否则返回FALSE.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; word-wrap: normal; word-break: normal; line-height: 21px; color: rgb(72, 72, 72); font-family: simsun; font-size: 14px; ">3、一些运行机制：<br>　　在Win16环境中，DLL的全局数据对每个载入它的进程来说都是相同的；而在Win32环境中，情况却发生了变化，DLL函数中的代码所创建的任何对象（包括变量）都归调用它的线程或进程所有。当进程在载入DLL时，操作系统自动把DLL地址映射到该进程的私有空间，也就是进程的虚拟地址空间，而且也复制该DLL的全局数据的一份拷贝到该进程空间。也就是说每个进程所拥有的相同的DLL的全局数据，它们的名称相同，但其值却并不一定是相同的，而且是互不干涉的。<br>　　因此，在Win32环境下要想在多个进程中共享数据，就必须进行必要的设置。在访问同一个Dll的各进程 之间共享存储器是通过存储器映射文件技术实现的。也可以把这些需要共享的数据分离出来，放置在一个独立的数据段里，并把该段的属性设置为共享。必须给这些 变量赋初值，否则编译器会把没有赋初始值的变量放在一个叫未被初始化的数据段中。<br>　　#pragma data_seg预处理指令用于设置共享数据段。例如：<br>　　#pragma data_seg("SharedDataName")<br>　　HHOOK hHook=NULL;<br>　　#pragma data_seg()<br>　　在#pragma data_seg("SharedDataName")和#pragma data_seg()之间的所有变量将被访问该Dll的所有进程看到和共享。再加上一条指令#pragma comment(linker,"/section:.SharedDataName,rws"),那么这个数据节中的数据可以在所有DLL的实例之间共 享。所有对这些数据的操作都针对同一个实例的，而不是在每个进程的地址空间中都有一份。<br>　　当进程隐式或显式调用一个动态库里的函数时，系统都要把这个动态库映射到这个进程的虚拟地址空间里(以下简称"地址空间")。这使得DLL成为进程的一部分，以这个进程的身份执行，使用这个进程的堆栈。<br>　　4、系统钩子与线程钩子：<br>　　SetWindowsHookEx()函数的最后一个参数决定了此钩子是系统钩子还是线程钩子。<br>　　线程勾子用于监视指定线程的事件消息。线程勾子一般在当前线程或者当前线程派生的线程内。<br>　　系统勾子监视系统中的所有线程的事件消息。因为系统勾子会影响系统中所有的应用程序，所以勾子函数必须放在独立的动态链接库(DLL) 中。系统自动将包含"钩子回调函数"的DLL映射到受钩子函数影响的所有进程的地址空间中，即将这个DLL注入了那些进程。<br>　　几点说明：<br>　　（1）如果对于同一事件（如鼠标消息）既安装了线程勾子又安装了系统勾子，那么系统会自动先调用线程勾子，然后调用系统勾子。<br>　　（2）对同一事件消息可安装多个勾子处理过程，这些勾子处理过程形成了勾子链。当前勾子处理结束后应把勾子信息传递给下一个勾子函数。<br>　　（3）勾子特别是系统勾子会消耗消息处理时间，降低系统性能。只有在必要的时候才安装勾子，在使用完毕后要及时卸载。</p></div><img src ="http://www.cppblog.com/AutomateProgram/aggbug/139227.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2011-01-24 15:30 <a href="http://www.cppblog.com/AutomateProgram/archive/2011/01/24/139227.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>经典编程书籍（C++, 网络, Windows, Linux） - [技术]</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/09/05/125934.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Sun, 05 Sep 2010 05:28:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/09/05/125934.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/125934.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/09/05/125934.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/125934.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/125934.html</trackback:ping><description><![CDATA[<p>原文地址：<a href="http://bobbycalf.blogbus.com/logs/2463095.html">http://bobbycalf.blogbus.com/logs/2463095.html</a><br><font face=#ce_temp_font#></font></p>
两年前就给自己列出了一个读书清单，但进展缓慢，看的经典书籍仍然寥寥可数，惭愧中...... <br>现在将这个书单重新修改，一方面鞭策自己学习，另一方面也表达对大牛们有如滔滔江水般的敬仰之意。 <br>书单中列举的都是相关领域的经典书籍，必读之作。此书单的编辑参考了很多网站，包括一些名家的推荐，例如侯捷，孟岩，荣耀，潘爱民等等，在此也向这些前辈表示感谢。^_^ <br><br>1、C++ Language <br>------------------------------ <br><br>Bjarne Stroustrup. The C++ Programming Language (Special 3rd Edition) <br>《C++程序设计语言（特别版）》 <br><br>Bjarne Stroustrup. The Design and Evolution of C++ <br>《C++语言的设计和演化》 <br><br>Stanley B.Lippman, Jos&#233;e LaJoie, Barbara E.Moo. C++ Primer (4th Edition) <br>《C++ Primer中文版（第4版）》 <br><br>Scott Meyers, Effective C++ (3rd Edition) <br>《Effective C++中文版（第三版）》 <br><br>Scott Meyers, More Effective C++ <br>《More Effective C++中文版》 <br><br>Herb Sutter, Exceptional C++ <br>《Exceptional C++中文版》 <br><br>Herb Sutter, More Exceptional C++ <br>《More Exceptional C++中文版》 <br><br>Nicolai M. Josuttis, The C++ Standard Library: A Tutorial and Reference <br>《C++标准程序库：自修教程与参考手册》 <br><br>Scott Meyers, Effective STL <br><br>Brian W.Kernighan, The Prictice of Programming <br>《程序设计实践》 <br><br>Steve McConnell, Code Complete , 2nd Edition <br>《代码大全（第二版）》 <br><br>Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Design Patterns: Elements of Reusable Object-Oriented software <br>《设计模式：可复用面向对象软件的基础》 <br><br>John Lakos, Large-Scale C++ Software Design <br>《大规模C++程序设计》 <br><br><br>2、网络编程 <br>------------------------------ <br><br>Richard Stevens, TCP/IP Illustrated, Vol.1 / Vol.2 / Vol.3 <br>《TCP/IP详解》（三卷） <br><br>Richard Stevens, Bill Fenner, Andrew M. Rudoff. <br>Unix Network Programming, Vol. 1: The Sockets Networking API, Third Edition <br>《UNIX网络编程》 <br><br>Jon C. Snader, Effective TCP/IP Programming <br>《高级TCP/IP编程》 <br><br>Douglas Schmidt, Steven Huston，C++ Network Programming, Vol.1 / Vol.2 <br>《C++网络编程 卷1：运用ACE和模式消除复杂性》 <br>《C++网络编程,卷2：基于ACE和框架的系统化复用》 <br><br>Anthony Jones, Jim Ohlund. Network Programming for Microsoft Windows <br>《Windows网络编程（第2版）》 <br><br>非常详尽的TCP/IP资源介绍： <br>Uri's TCP/IP Resources List: http://www.private.org.il/tcpip_rl.html <br><br><br>3、Windows <br>------------------------------ <br><br>Mark E. Russinovich, David A. Solomon. <br>Microsoft Windows Internals, Fourth Edition <br><br>Charles Petzold, Programming Windows (Fifth Edition) <br>《WINDOWS程序设计（第5版）》 <br><br>Jeffrey Richter, Programming Applications for Microsoft Windows Fourth Edition <br>《WINDOWS核心编程》 <br><br>Jim Beveridge, Robert Wiener. Multithreading Applications in Win32 <br>《WIN32多线程程序设计》 <br><br>侯捷, 《深入浅出MFC》 <br><br>George Shepherd, David Kruglinski. Programming with Microsoft Visual C++ .NET, Sixth Edition <br>《Visual C++ .NET技术内幕（第6版）》 <br><br>Jeff Prosise, Programming Windows with MFC Second Edition <br>《MFC Windows程序设计（第2版）》 <br><br>Jeffrey Richter, Applied Microsoft .NET Framework Programming <br>《Microsoft .NET框架程序设计（修订版）》 <br><br>John Robbins, Debugging Applications for Microsoft .NET and Microsoft Windows <br>《Microsoft .NET和Windows应用程序调试》 <br><br>Chris Cant, Writing Windows WDM Device Drivers <br>《Windows WDM设备驱动程序开发指南》 <br><br><br>4、Linux <br>------------------------------ <br><br>Richard Stevens, Advanced Programming in the UNIX Environment <br>《UNIX环境高级编程》 <br><br>Richard Stevens, Bill Fenner, Andrew M. Rudoff. <br>Unix Network Programming, Vol. 1: The Sockets Networking API, Third Edition <br>《UNIX网络编程》 <br><br>John Lions, Lion'Cornmentary on UNIX 6th Edition With Source Code <br>《莱昂氏UNIX源代码分析》 <br><br>Robert Love, Linux Kernel Development, 2nd Edition <br>《Linux内核设计与实现（第2版）》 <br><br>Daniel Pierre Bovet, Marco Cesati. Understanding the Linux Kernel, 3rd Edition <br>《深入理解Linux内核（第三版）》 <br><br>Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman. Linux Device Drivers, 3rd Edition <br>《LINUX设备驱动程序（第三版）》 <br><br>Marshall Kirk McKusick, Keith Bostic, Michael J. Karels and John S. Quarterman. <br>The Design and Implementation of the 4.4 BSD Operating System <br>《4.4BSD操作系统设计与实现》 <br><br>毛德操, 胡希明. 《Linux内核源代码情景分析》 <br><br><br>5、Others <br>------------------------------ <br><br>Donald E.Knuth, Art of Computer Programming, Volume 1-3 <br>《计算机程序设计艺术》（三卷） <br><br>Thomas H.Cormen Charles E.Leiserson Ronald L.Rivest Clifford Stein. <br>Introduction to Algorithms, Second Edition <br>《算法导论（第二版）》 <br><br>Bruce Schneier, Applied Cryptography <br>《应用密码学》
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/125934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-09-05 13:28 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/09/05/125934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>unicode、utf-8、ansi的故事</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/03/26/110567.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Fri, 26 Mar 2010 01:13:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/03/26/110567.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/110567.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/03/26/110567.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/110567.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/110567.html</trackback:ping><description><![CDATA[<p>原文地址：<a href="http://blog.csdn.net/iscandy/archive/2009/02/02/3859219.aspx">http://blog.csdn.net/iscandy/archive/2009/02/02/3859219.aspx</a><br>很久很久以前，有一群人，他们决定用8个可以开合的晶体管来组合成不同的状态，以表示世界上的万物。他们看到8个开关状态是好的，于是他们把这称为"字节"。<br>再后来，他们又做了一些可以处理这些字节的机器，机器开动了，可以用字节来组合出很多状态，状态开始变来变去。他们看到这样是好的，于是它们就这机器称为"计算机"。<br>开始计算机只在美国用。八位的字节一共可以组合出256(2的8次方)种不同的状态。<br>他们把其中的编号从0开始的32种状态分别规定了特殊的用途，一但终端、打印机遇上约定好的这些字节被传过来时，就要做一些约定的动作。遇上00x10, 终端就换行，遇上0x07, 终端就向人们嘟嘟叫，例好遇上0x1b, 打印机就打印反白的字，或者终端就用彩色显示字母。他们看到这样很好，于是就把这些0x20以下的字节状态称为"控制码"。<br>他们又把所有的空格、标点符号、数字、大小写字母分别用连续的字节状态表示，一直编到了第127号，这样计算机就可以用不同字节来存储英语的文字了。大家看到这样，都感觉很好，于是大家都把这个方案叫做 ANSI 的"Ascii"编码（American Standard Code for Information Interchange，美国信息互换标准代码）。当时世界上所有的计算机都用同样的ASCII方案来保存英文文字。<br>后来，就像建造巴比伦塔一样，世界各地的都开始使用计算机，但是很多国家用的不是英文，他们的字母里有许多是ASCII里没有的，为了可以在计算机保存他们的文字，他们决定采用 127号之后的空位来表示这些新的字母、符号，还加入了很多画表格时需要用下到的横线、竖线、交叉等形状，一直把序号编到了最后一个状态255。从128 到255这一页的字符集被称"扩展字符集"。从此之后，贪婪的人类再没有新的状态可以用了，美帝国主义可能没有想到还有第三世界国家的人们也希望可以用到计算机吧！<br>等中国人们得到计算机时，已经没有可以利用的字节状态来表示汉字，况且有6000多个常用汉字需要保存呢。但是这难不倒智慧的中国人民，我们不客气地把那些127号之后的奇异符号们直接取消掉, 规定：一个小于127的字符的意义与原来相同，但两个大于127的字符连在一起时，就表示一个汉字，前面的一个字节（他称之为高字节）从0xA1用到 0xF7，后面一个字节（低字节）从0xA1到0xFE，这样我们就可以组合出大约7000多个简体汉字了。在这些编码里，我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了，连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码，这就是常说的"全角"字符，而原来在127号以下的那些就叫"半角"字符了。<br>中国人民看到这样很不错，于是就把这种汉字方案叫做 "GB2312"。GB2312 是对 ASCII 的中文扩展。<br>但是中国的汉字太多了，我们很快就就发现有许多人的人名没有办法在这里打出来，特别是某些很会麻烦别人的国家领导人。于是我们不得不继续把 GB2312 没有用到的码位找出来老实不客气地用上。<br>后来还是不够用，于是干脆不再要求低字节一定是127号之后的内码，只要第一个字节是大于127就固定表示这是一个汉字的开始，不管后面跟的是不是扩展字符集里的内容。结果扩展之后的编码方案被称为 GBK 标准，GBK 包括了 GB2312 的所有内容，同时又增加了近20000个新的汉字（包括繁体字）和符号。<br>后来少数民族也要用电脑了，于是我们再扩展，又加了几千个新的少数民族的字，GBK 扩成了 GB18030。从此之后，中华民族的文化就可以在计算机时代中传承了。<br>中国的程序员们看到这一系列汉字编码的标准是好的，于是通称他们叫做 "DBCS"（Double Byte Charecter Set 双字节字符集）。在DBCS系列标准里，最大的特点是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里，因此他们写的程序为了支持中文处理，必须要注意字串里的每一个字节的值，如果这个值是大于127的，那么就认为一个双字节字符集里的字符出现了。那时候凡是受过加持，会编程的计算机僧侣们都要每天念下面这个咒语数百遍：<br>"一个汉字算两个英文字符！一个汉字算两个英文字符&#8230;&#8230;"<br>因为当时各个国家都像中国这样搞出一套自己的编码标准，结果互相之间谁也不懂谁的编码，谁也不支持别人的编码，连大陆和台湾这样只相隔了150海里，使用着同一种语言的兄弟地区，也分别采用了不同的 DBCS 编码方案——当时的中国人想让电脑显示汉字，就必须装上一个"汉字系统"，专门用来处理汉字的显示、输入的问题，但是那个台湾的愚昧封建人士写的算命程序就必须加装另一套支持 BIG5 编码的什么"倚天汉字系统"才可以用，装错了字符系统，显示就会乱了套！这怎么办？而且世界民族之林中还有那些一时用不上电脑的穷苦人民，他们的文字又怎么办？<br>真是计算机的巴比伦塔命题啊！<br>正在这时，大天使加百列及时出现了——一个叫 ISO （国际标谁化组织）的国际组织决定着手解决这个问题。他们采用的方法很简单：废了所有的地区性编码方案，重新搞一个包括了地球上所有文化、所有字母和符号的编码！他们打算叫它"Universal Multiple-Octet Coded Character Set"，简称 UCS, 俗称 "UNICODE"。<br>UNICODE 开始制订时，计算机的存储器容量极大地发展了，空间再也不成为问题了。于是 ISO 就直接规定必须用两个字节，也就是16位来统一表示所有的字符，对于ascii里的那些&#8220;半角&#8221;字符，UNICODE 包持其原编码不变，只是将其长度由原来的8位扩展为16位，而其他文化和语言的字符则全部重新统一编码。由于"半角"英文符号只需要用到低8位，所以其高 8位永远是0，因此这种大气的方案在保存英文文本时会多浪费一倍的空间。<br>这时候，从旧社会里走过来的程序员开始发现一个奇怪的现象：他们的 strlen函数靠不住了，一个汉字不再是相当于两个字符了，而是一个！是的，从 UNICODE 开始，无论是半角的英文字母，还是全角的汉字，它们都是统一的"一个字符"！同时，也都是统一的"两个字节"，请注意"字符"和"字节"两个术语的不同， &#8220;字节&#8221;是一个8位的物理存贮单元，而&#8220;字符&#8221;则是一个文化相关的符号。在UNICODE 中，一个字符就是两个字节。一个汉字算两个英文字符的时代已经快过去了。<br>从前多种字符集存在时，那些做多语言软件的公司遇上过很大麻烦，他们为了在不同的国家销售同一套软件，就不得不在区域化软件时也加持那个双字节字符集咒语，不仅要处处小心不要搞错，还要把软件中的文字在不同的字符集中转来转去。UNICODE 对于他们来说是一个很好的一揽子解决方案，于是从 Windows NT 开始，MS 趁机把它们的操作系统改了一遍，把所有的核心代码都改成了用 UNICODE 方式工作的版本，从这时开始，WINDOWS 系统终于无需要加装各种本土语言系统，就可以显示全世界上所有文化的字符了。<br>但是，UNICODE 在制订时没有考虑与任何一种现有的编码方案保持兼容，这使得 GBK 与UNICODE 在汉字的内码编排上完全是不一样的，没有一种简单的算术方法可以把文本内容从UNICODE编码和另一种编码进行转换，这种转换必须通过查表来进行。<br>如前所述，UNICODE 是用两个字节来表示为一个字符，他总共可以组合出65535不同的字符，这大概已经可以覆盖世界上所有文化的符号。如果还不够也没有关系，ISO已经准备了UCS-4方案，说简单了就是四个字节来表示一个字符，这样我们就可以组合出21亿个不同的字符出来（最高位有其他用途），这大概可以用到银河联邦成立那一天吧！<br>UNICODE 来到时，一起到来的还有计算机网络的兴起，UNICODE 如何在网络上传输也是一个必须考虑的问题，于是面向传输的众多 UTF（UCS Transfer format）标准出现了，顾名思义，UTF8就是每次8个位传输数据，而UTF16就是每次16个位，只不过为了传输时的可靠性，从UNICODE到 UTF时并不是直接的对应，而是要过一些算法和规则来转换。<br>受到过网络编程加持的计算机僧侣们都知道，在网络里传递信息时有一个很重要的问题，就是对于数据高低位的解读方式，一些计算机是采用低位先发送的方法，例如我们PC机采用的 INTEL 架构，而另一些是采用高位先发送的方式，在网络中交换数据时，为了核对双方对于高低位的认识是否是一致的，采用了一种很简便的方法，就是在文本流的开始时向对方发送一个标志符——如果之后的文本是高位在位，那就发送"FEFF"，反之，则发送"FFFE"。不信你可以用二进制方式打开一个UTF-X格式的文件，看看开头两个字节是不是这两个字节？<br>讲到这里，我们再顺便说说一个很著名的奇怪现象：当你在 windows 的记事本里新建一个文件，输入"联通"两个字之后，保存，关闭，然后再次打开，你会发现这两个字已经消失了，代之的是几个乱码！呵呵，有人说这就是联通之所以拼不过移动的原因。<br>其实这是因为GB2312编码与UTF8编码产生了编码冲撞的原因。<br>从网上引来一段从UNICODE到UTF8的转换规则：<br>Unicode<br>UTF-8<br>0000 - 007F<br>0xxxxxxx<br>0080 - 07FF<br>110xxxxx 10xxxxxx<br>0800 - FFFF<br>1110xxxx 10xxxxxx 10xxxxxx</p>
<p>例如"汉"字的Unicode编码是6C49。6C49在0800-FFFF之间，所以要用3字节模板：1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是：0110 1100 0100 1001，将这个比特流按三字节模板的分段方法分为0110 110001 001001，依次代替模板中的x，得到：1110-0110 10-110001 10-001001，即E6 B1 89，这就是其UTF8的编码。<br>而当你新建一个文本文件时，记事本的编码默认是ANSI, 如果你在ANSI的编码输入汉字，那么他实际就是GB系列的编码方式，在这种编码下，"联通"的内码是：<br>c1 1100 0001<br>aa 1010 1010<br>cd 1100 1101<br>a8 1010 1000<br>注意到了吗？第一二个字节、第三四个字节的起始部分的都是"110"和"10"，正好与UTF8规则里的两字节模板是一致的，于是再次打开记事本时，记事本就误认为这是一个UTF8编码的文件，让我们把第一个字节的110和第二个字节的10去掉，我们就得到了"00001 101010"，再把各位对齐，补上前导的0，就得到了"0000 0000 0110 1010"，不好意思，这是UNICODE的006A，也就是小写的字母"j"，而之后的两字节用UTF8解码之后是0368，这个字符什么也不是。这就是只有"联通"两个字的文件没有办法在记事本里正常显示的原因。<br>而如果你在"联通"之后多输入几个字，其他的字的编码不见得又恰好是110和10开始的字节，这样再次打开时，记事本就不会坚持这是一个utf8编码的文件，而会用ANSI的方式解读之，这时乱码又不出现了。<br><br>ps: 在这里我们测试一下，在记事本中建立三种编码的文本，unicode，utf-8，Ascii 在文本中写下 &#8220;1我&#8221;我们查看二进制<br>Ascii 下：<br>31 CE D2<br>unicode下：<br>FF FE 31 00 11 62<br>UTF-8下：<br>EF BB BF 31 E6 88 91<br><br>这里分析一下：ascii中开头没有表示位，直截了当来了1，unicode下的表示位是FF FE UTF-8下是表示位EF BB<br>UTF-8下用三个字节来表示一个汉字，unicode下每个字都占用两个字节<br>不重复的标志应该是开头的字数。<br></p>
<p>相互转换：<br>原文地址:http://club.topsage.com/thread-670150-1-1.html<br></p>
<h1 style="MARGIN: 8px 0px; FONT-SIZE: 1.17em">Ansi、Unicode、UTF-8字符串之间的转换和写入文本文件</h1>
<p style="MARGIN: 8px 0px; FONT-SIZE: 1.17em">Ansi字符串我们最熟悉，英文占一个字节，汉字2个字节，以一个\0结尾，常用于txt文本文件<br>Unicode字符串，每个字符(汉字、英文字母)都占2个字节，以2个连续的\0结尾，NT<span class=t_tag onclick=tagshow(event) href="tag.php?name=%B2%D9%D7%F7%CF%B5%CD%B3">操作系统</span>内核用的是这种字符串，常被定义为typedef unsigned short wchar_t;所以我们有时常会见到什么char*无法转换为unsigned short*之类的错误，其实就是unicode<br>UTF8是 Unicode一种压缩形式，英文A在unicode中表示为0x0041，老外觉得这种存储方式太浪费，因为浪费了50%的空间，于是就把英文压缩成1 个字节，成了utf8编码，但是汉字在utf8中占3个字节，显然用做中文不如ansi合算，这就是中国的网页用作ansi编码而老外的网页常用utf8 的原因。<br>UTF8在还游戏里运用的很广泛，比如WOW的lua脚本等<br><br>下面来说一下转换，主要用代码来说明吧<br><br>写文件我用了CFile类，其实用FILE*之类的也是一样，写文件和字符串什么类别没有关系，硬件只关心数据和长度<br><br>Ansi转Unicode<br><br>介绍2种方法 </p>
<div class=blockcode>
<div id=code0>
<ol>
    <li>void CConvertDlg::OnBnClickedButtonAnsiToUnicode()<br>
    <li>{<br>
    <li>&nbsp; &nbsp; // ansi to unicode<br>
    <li>&nbsp; &nbsp; char* szAnsi = "abcd1234你我他";<br>
    <li>&nbsp; &nbsp; //预转换，得到所需空间的大小<br>
    <li>&nbsp; &nbsp; int wcsLen = ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), NULL, 0);<br>
    <li>&nbsp; &nbsp; //分配空间要给'\0'留个空间，MultiByteToWideChar不会给'\0'空间<br>
    <li>&nbsp; &nbsp; wchar_t* wszString = new wchar_t[wcsLen + 1];<br>
    <li>&nbsp; &nbsp; //转换<br>
    <li>&nbsp; &nbsp; ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), wszString, wcsLen);<br>
    <li>&nbsp; &nbsp; //最后加上'\0'<br>
    <li>&nbsp; &nbsp; wszString[wcsLen] = '\0';<br>
    <li>&nbsp; &nbsp; //unicode版的MessageBox API<br>
    <li>&nbsp; &nbsp; ::MessageBoxW(GetSafeHwnd(), wszString, wszString, MB_OK);<br>
    <li><br>
    <li>&nbsp; &nbsp; //接下来写入文本<br>
    <li>&nbsp; &nbsp; //写文本文件，头2个字节0xfeff，低位0xff写在前<br>
    <li>&nbsp; &nbsp; CFile cFile;<br>
    <li>&nbsp; &nbsp; cFile.Open(_T("1.txt"), CFile::modeWrite | CFile::modeCreate);<br>
    <li>&nbsp; &nbsp; //文件开头<br>
    <li>&nbsp; &nbsp; cFile.SeekToBegin();<br>
    <li>&nbsp; &nbsp; cFile.Write("\xff\xfe", 2);<br>
    <li>&nbsp; &nbsp; //写入内容<br>
    <li>&nbsp; &nbsp; cFile.Write(wszString, wcsLen * sizeof(wchar_t));<br>
    <li>&nbsp; &nbsp; cFile.Flush();<br>
    <li>&nbsp; &nbsp; cFile.Close();<br>
    <li>&nbsp; &nbsp; delete[] wszString;<br>
    <li>&nbsp; &nbsp; wszString =NULL;<br>
    <li><br>
    <li><br>
    <li>&nbsp; &nbsp; //方法2<br>
    <li>&nbsp; &nbsp; //设置当前地域信息，不设置的话，使用这种方法，中文不会正确显示<br>
    <li>&nbsp; &nbsp; //需要#include&lt;locale.h&gt;<br>
    <li>&nbsp; &nbsp; setlocale(LC_CTYPE, "chs"); <br>
    <li>&nbsp; &nbsp; wchar_t wcsStr[100];<br>
    <li>&nbsp; &nbsp; //注意下面是大写S，在unicode中，代表后面是ansi字符串<br>
    <li>&nbsp; &nbsp; //swprintf是sprintf的unicode版本<br>
    <li>&nbsp; &nbsp; //格式的前面要加大写L，代表是unicode<br>
    <li>&nbsp; &nbsp; swprintf(wcsStr, L"%S", szAnsi);<br>
    <li>&nbsp; &nbsp; ::MessageBoxW(GetSafeHwnd(), wcsStr, wcsStr, MB_OK);<br>
    <li><br>
    <li>} </li>
</ol>
</div>
<em onclick="copycode($('code0'));">复制代码</em></div>
<p style="MARGIN: 8px 0px; FONT-SIZE: 1.17em">Unicode转Ansi<br>也是2种方法 </p>
<div class=blockcode>
<div id=code1>
<ol>
    <li>void CConvertDlg::OnBnClickedButtonUnicodeToAnsi()<br>
    <li>{<br>
    <li>&nbsp; &nbsp; // unicode to ansi<br>
    <li>&nbsp; &nbsp; wchar_t* wszString = L"abcd1234你我他";<br>
    <li>&nbsp; &nbsp; //预转换，得到所需空间的大小，这次用的函数和上面名字相反<br>
    <li>&nbsp; &nbsp; int ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, wszString, wcslen(wszString), NULL, 0, NULL, NULL);<br>
    <li>&nbsp; &nbsp; //同上，分配空间要给'\0'留个空间<br>
    <li>&nbsp; &nbsp; char* szAnsi = new char[ansiLen + 1];<br>
    <li>&nbsp; &nbsp; //转换<br>
    <li>&nbsp; &nbsp; //unicode版对应的strlen是wcslen<br>
    <li>&nbsp; &nbsp; ::WideCharToMultiByte(CP_ACP, NULL, wszString, wcslen(wszString), szAnsi, ansiLen, NULL, NULL);<br>
    <li>&nbsp; &nbsp; //最后加上'\0'<br>
    <li>&nbsp; &nbsp; szAnsi[ansiLen] = '\0';<br>
    <li>&nbsp; &nbsp; //Ansi版的MessageBox API<br>
    <li>&nbsp; &nbsp; ::MessageBoxA(GetSafeHwnd(), szAnsi, szAnsi, MB_OK);<br>
    <li><br>
    <li>&nbsp; &nbsp; //接下来写入文本<br>
    <li>&nbsp; &nbsp; //写文本文件，ANSI文件没有BOM<br>
    <li>&nbsp; &nbsp; CFile cFile;<br>
    <li>&nbsp; &nbsp; cFile.Open(_T("1.txt"), CFile::modeWrite | CFile::modeCreate);<br>
    <li>&nbsp; &nbsp; //文件开头<br>
    <li>&nbsp; &nbsp; cFile.SeekToBegin();<br>
    <li>&nbsp; &nbsp; //写入内容<br>
    <li>&nbsp; &nbsp; cFile.Write(szAnsi, ansiLen * sizeof(char));<br>
    <li>&nbsp; &nbsp; cFile.Flush();<br>
    <li>&nbsp; &nbsp; cFile.Close();<br>
    <li>&nbsp; &nbsp; delete[] szAnsi;<br>
    <li>&nbsp; &nbsp; szAnsi =NULL;<br>
    <li><br>
    <li><br>
    <li>&nbsp; &nbsp; //方法2<br>
    <li>&nbsp; &nbsp; //和上面一样有另一种方法<br>
    <li>&nbsp; &nbsp; setlocale(LC_CTYPE, "chs"); <br>
    <li>&nbsp; &nbsp; char szStr[100];<br>
    <li>&nbsp; &nbsp; //注意下面是大写，在ansi中，代表后面是unicode字符串<br>
    <li>&nbsp; &nbsp; //sprintf<br>
    <li>&nbsp; &nbsp; sprintf(szStr, "%S", wszString);<br>
    <li>&nbsp; &nbsp; ::MessageBoxA(GetSafeHwnd(), szStr, szStr, MB_OK);<br>
    <li>} </li>
</ol>
</div>
<em onclick="copycode($('code1'));">复制代码</em></div>
<p style="MARGIN: 8px 0px; FONT-SIZE: 1.17em">Unicode转UTF8 </p>
<div class=blockcode>
<div id=code2>
<ol>
    <li>void CConvertDlg::OnBnClickedButtonUnicodeToU8()<br>
    <li>{<br>
    <li>&nbsp; &nbsp; // unicode to UTF8<br>
    <li>&nbsp; &nbsp; wchar_t* wszString = L"abcd1234你我他";<br>
    <li>&nbsp; &nbsp; //预转换，得到所需空间的大小，这次用的函数和上面名字相反<br>
    <li>&nbsp; &nbsp; int u8Len = ::WideCharToMultiByte(CP_UTF8, NULL, wszString, wcslen(wszString), NULL, 0, NULL, NULL);<br>
    <li>&nbsp; &nbsp; //同上，分配空间要给'\0'留个空间<br>
    <li>&nbsp; &nbsp; //UTF8虽然是Unicode的压缩形式，但也是多字节字符串，所以可以以char的形式保存<br>
    <li>&nbsp; &nbsp; char* szU8 = new char[u8Len + 1];<br>
    <li>&nbsp; &nbsp; //转换<br>
    <li>&nbsp; &nbsp; //unicode版对应的strlen是wcslen<br>
    <li>&nbsp; &nbsp; ::WideCharToMultiByte(CP_UTF8, NULL, wszString, wcslen(wszString), szU8, u8Len, NULL, NULL);<br>
    <li>&nbsp; &nbsp; //最后加上'\0'<br>
    <li>&nbsp; &nbsp; szU8[u8Len] = '\0';<br>
    <li>&nbsp; &nbsp; //MessageBox不支持UTF8,所以只能写文件<br>
    <li><br>
    <li>&nbsp; &nbsp; //接下来写入文本<br>
    <li>&nbsp; &nbsp; //写文本文件，UTF8的BOM是0xbfbbef<br>
    <li>&nbsp; &nbsp; CFile cFile;<br>
    <li>&nbsp; &nbsp; cFile.Open(_T("1.txt"), CFile::modeWrite | CFile::modeCreate);<br>
    <li>&nbsp; &nbsp; //文件开头<br>
    <li>&nbsp; &nbsp; cFile.SeekToBegin();<br>
    <li>&nbsp; &nbsp; //写BOM，同样低位写在前<br>
    <li>&nbsp; &nbsp; cFile.Write("\xef\xbb\xbf", 3);<br>
    <li>&nbsp; &nbsp; //写入内容<br>
    <li>&nbsp; &nbsp; cFile.Write(szU8, u8Len * sizeof(char));<br>
    <li>&nbsp; &nbsp; cFile.Flush();<br>
    <li>&nbsp; &nbsp; cFile.Close();<br>
    <li>&nbsp; &nbsp; delete[] szU8;<br>
    <li>&nbsp; &nbsp; szU8 =NULL;<br>
    <li><br>
    <li>} </li>
</ol>
</div>
<em onclick="copycode($('code2'));">复制代码</em></div>
<p style="MARGIN: 8px 0px; FONT-SIZE: 1.17em">UTF8转UNICODE </p>
<div class=blockcode>
<div id=code3>
<ol>
    <li>void CConvertDlg::OnBnClickedButtonU8ToUnicode()<br>
    <li>{<br>
    <li>&nbsp; &nbsp; //UTF8 to Unicode<br>
    <li>&nbsp; &nbsp; //由于中文直接复制过来会成乱码，编译器有时会报错，故采用16进制形式<br>
    <li>&nbsp; &nbsp; char* szU8 = "abcd1234\xe4\xbd\xa0\xe6\x88\x91\xe4\xbb\x96\x00";<br>
    <li>&nbsp; &nbsp; //预转换，得到所需空间的大小<br>
    <li>&nbsp; &nbsp; int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), NULL, 0);<br>
    <li>&nbsp; &nbsp; //分配空间要给'\0'留个空间，MultiByteToWideChar不会给'\0'空间<br>
    <li>&nbsp; &nbsp; wchar_t* wszString = new wchar_t[wcsLen + 1];<br>
    <li>&nbsp; &nbsp; //转换<br>
    <li>&nbsp; &nbsp; ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), wszString, wcsLen);<br>
    <li>&nbsp; &nbsp; //最后加上'\0'<br>
    <li>&nbsp; &nbsp; wszString[wcsLen] = '\0';<br>
    <li>&nbsp; &nbsp; //unicode版的MessageBox API<br>
    <li>&nbsp; &nbsp; ::MessageBoxW(GetSafeHwnd(), wszString, wszString, MB_OK);<br>
    <li><br>
    <li>&nbsp; &nbsp; //写文本同ansi to unicode<br>
    <li>} </li>
</ol>
</div>
<em onclick="copycode($('code3'));">复制代码</em></div>
<p style="MARGIN: 8px 0px; FONT-SIZE: 1.17em">Ansi转换utf8和utf8转换Ansi就是上面2个的结合，把unicode作为中间量，进行2次转换即可</p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/110567.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-26 09:13 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/03/26/110567.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LPTSTR、LPCSTR、LPCTSTR、LPSTR的来源及意义</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/03/26/110566.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Fri, 26 Mar 2010 01:01:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/03/26/110566.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/110566.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/03/26/110566.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/110566.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/110566.html</trackback:ping><description><![CDATA[原文地址：<a href="http://yizhiqiang.blog.51cto.com/917774/197859">http://yizhiqiang.blog.51cto.com/917774/197859</a><br><br>
<div style="POSITION: relative; WORD-WRAP: break-word; FONT-SIZE: 10pt; WORD-BREAK: break-all">
<div style="TEXT-INDENT: 2em">UNICODE：它是用两个字节表示一个字符的方法。比如字符'A'在ASCII下面是一个字符，可'A'在UNICODE下面是两个字符,高字符用0填充，而且汉字'程'在ASCII下面是两个字节，而在UNICODE下仍旧是两个字节。UNICODE的用处就是定长表示世界文字，据统计，用两个字节可以编码现存的所有文字而没有二义。</div>
<div style="TEXT-INDENT: 2em">MBCS，它是多字节字符集，它是不定长表示世界文字的编码。MBCS表示英文字母时就和ASCII一样（这也是我们容易把MBCS和ASCII搞混的原因），但表示其他文字时就需要用多字节。&nbsp; </div>
<div style="TEXT-INDENT: 2em">WINDOWS下面的程序设计可以支持MBCS和UNICODE两种编码的字符串，具体用那种就看你定义了MBCS宏还是UNICODE宏。MBCS宏对应的字符串指针是char*也就是LPSTR，UNICODE对应的指针是unsigned&nbsp;&nbsp; short*也就是LPWSTR，为了写程序方便微软定义了类型LPTSTR，在MBCS下他就是char*,&nbsp;&nbsp; 在UNICODE下它是unsigned&nbsp;&nbsp; char*,这样你就可以重定义一个宏进行不同字符集的转换了。</div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">LPTSTR、LPCSTR、LPCTSTR、LPSTR的意义：</div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">LPSTR：32bit指针 指向一个字符串，每个字符占1字节</div>
<div style="TEXT-INDENT: 2em">LPCSTR:32-bit指针 指向一个常字符串，每个字符占1字节</div>
<div style="TEXT-INDENT: 2em">LPCTSTR:32-bit指针 指向一个常字符串,每字符可能占1字节或2字节，取决于Unicode是否定义</div>
<div style="TEXT-INDENT: 2em">LPTSTR:32-bit指针 每字符可能占1字节或2字节，取决于Unicode是否定义</div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">Windows使用两种字符集ANSI和UNICODE，前者就是通常使用的单字节方式，但这种方式处理象中文这样的双字节字符不方便，容易出现半个汉字的情况。而后者是双字节方式，方便处理双字节字符。</div>
<div style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </div>
<div style="TEXT-INDENT: 2em">WindowsNT的所有与字符有关的函数都提供两种方式的版本，而Windows9x只支持ANSI方式。_T一般同字常数相关，如_T("Hello"。如果你编译一个程序为ANSI方式，_T实际不起任何作用。而如果编译一个程序为UNICODE方式，则编译器会把"Hello"字符串以UNICODE方式保存。_T和_L的区别在于，_L不管你是以什么方式编译，一律UNICODE方式保存.</div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">Windows核心编程的第一章。</div>
<div style="TEXT-INDENT: 2em">L是表示字符串资源为Unicode的。</div>
<div style="TEXT-INDENT: 2em">比如：wchar_t Str[] = L"Hello World!";这个就是双子节存储字符了。</div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">_T是一个适配的宏～</div>
<div style="TEXT-INDENT: 2em">当 #ifdef _UNICODE的时候 _T就是L；没有#ifdef _UNICODE的时候_T就是ANSI的。</div>
<div style="TEXT-INDENT: 2em">比如：LPTSTR lpStr = new TCHAR[32];</div>
<div style="TEXT-INDENT: 2em">TCHAR* szBuf = _T("Hello");</div>
<div style="TEXT-INDENT: 2em">以上两句使得无论是在UNICODE编译条件下都是正确编译的。</div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">而且MS推荐你使用相匹配的字符串函数。比如处理LPTSTR或者LPCTSTR 的时候，不要用strlen ,而是要用_tcslen，否则在UNICODE的编译条件下，strlen不能处理 wchar_t*的字符串。</div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">T是非常有意思的一个符号（TCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()...），它表示使用一种中间类型，既不明确表示使用 MBCS，也不明确表示使用 UNICODE。那到底使用哪种字符集?编译的时候才决定</div>
<div style="TEXT-INDENT: 2em">在vc++中有着各种字符串的表示法，如您所说。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">首先char*&nbsp;&nbsp; 是指向ANSI字符数组的指针，其中每个字符占据8位（有效数据是除掉最高位的其他7位），这里保持了与传统的C,C++的兼容。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">LP的含义是长指针(long&nbsp;&nbsp; pointer)。</div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">LPSTR是一个指向以&#8216;\0&#8217;结尾的ANSI字符数组的指针，与char*可以互换使用，在win32中较多地使用LPSTR。而LPCSTR中增加的&#8216;C&#8217;的含义是&#8220;CONSTANT&#8221;（常量），表明这种数据类型的实例不能被使用它的API函数改变，除此之外，它与LPSTR是等同的。&nbsp;&nbsp;&nbsp;&nbsp; </div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; 为了满足程序代码国际化的需要，业界推出了Unicode标准，它提供了一种简单和一致的表达字符串的方法，所有字符中的字节都是16位的值，其数量也可以满足差不多世界上所有书面语言字符的编码需求，开发程序时使用Unicode（类型为wchar_t)是一种被鼓励的做法。&nbsp;&nbsp;&nbsp;&nbsp; </div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; LPWSTR与LPCWSTR由此产生，它们的含义类似于LPSTR与LPCSTR，只是字符数据是16位的wchar_t而不是char。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后为了实现两种编码的通用，提出了TCHAR的定义：&nbsp;&nbsp;&nbsp; </div>
<div style="TEXT-INDENT: 2em">如果定义_UNICODE，声明如下：&nbsp;&nbsp;&nbsp;&nbsp; typedef&nbsp;&nbsp; wchar_t&nbsp;&nbsp; TCHAR;&nbsp;&nbsp;&nbsp;&nbsp; </div>
<div style="TEXT-INDENT: 2em">如果没有定义_UNICODE，则声明如下：&nbsp;&nbsp;&nbsp;&nbsp; typedef&nbsp;&nbsp; char&nbsp;&nbsp; TCHAR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">LPTSTR和LPCTSTR中的含义就是每个字符是这样的TCHAR。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </div>
<div style="TEXT-INDENT: 2em">CString类中的字符就是被声明为TCHAR类型的，它提供了一个封装好的类供用户方便地使用。</div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">如果您还需要进一步的信息，请参看<a href="http://msdn.microsoft.com/library/default.asp?_url=/library/en-us/vclib/html/_crt_data_type_mappings.asp"><font color=#336d89><u>http://msdn.microsoft.com/library/default.asp?_url=/library/en-us/vclib/html/_crt_data_type_mappings.asp</u></font></a>等其他有关信息。 </div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">LPTSTR、LPCSTR、LPCTSTR、LPSTR之间的转换：</div>
<div style="TEXT-INDENT: 2em">如何理解LPCTSTR类型？ </div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">L表示long指针 </div>
<div style="TEXT-INDENT: 2em">这是为了兼容Windows 3.1等16位操作系统遗留下来的，在win32中以及其他的32为操作系统中， long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。</div>
<div style="TEXT-INDENT: 2em">P表示这是一个指针</div>
<div style="TEXT-INDENT: 2em">C表示是一个常量</div>
<div style="TEXT-INDENT: 2em">T表示在Win32环境中， 有一个_T宏</div>
<div style="TEXT-INDENT: 2em">这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏，那么这个字符或者字符串将被作为UNICODE字符串，否则就是标准的ANSI字符串。</div>
<div style="TEXT-INDENT: 2em">STR表示这个变量是一个字符串</div>
<div style="TEXT-INDENT: 2em">所以LPCTSTR就表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。同样， LPCSTR就只能是一个ANSI字符串，在程序中我们大部分时间要使用带T的类型定义。</div>
<div style="TEXT-INDENT: 2em">LPCTSTR == const TCHAR *</div>
<div style="TEXT-INDENT: 2em">CString 和 LPCTSTR 可以说通用。 原因在于CString定义的自动类型转换，没什么奇特的，最简单的C++操作符重载而已。 </div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">常量字符串ansi和unicode的区分是由宏_T来决定的。但是用_T("abcd")时， 字符串"abcd"就会根据编译时的是否定一_UNICODE来决定是char* 还是 w_char*。 同样，TCHAR 也是相同目的字符宏。 看看定义就明白了。简单起见，下面只介绍 ansi 的情况，unicode 可以类推。 </div>
<div style="TEXT-INDENT: 2em">ansi情况下，LPCTSTR 就是 const char*, 是常量字符串（不能修改的）。 </div>
<div style="TEXT-INDENT: 2em">而LPTSTR 就是 char*, 即普通字符串（非常量，可修改的）。 </div>
<div style="TEXT-INDENT: 2em">这两种都是基本类型， 而CString 是 C++类， 兼容这两种基本类型是最起码的任务了。 </div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">由于const char* 最简单（常量，不涉及内存变更，操作迅速）， CString 直接定义了一个类型转换函数 operator LPCTSTR() {......}， 直接返回他所维护的字符串。 </div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">当你需要一个const char* 而传入了CString时， C++编译器自动调用 CString重载的操作符 LPCTSTR()来进行隐式的类型转换。 </div>
<div style="TEXT-INDENT: 2em">当需要CString , 而传入了 const char* 时（其实 char* 也可以），C++编译器则自动调用CString的构造函数来构造临时的 CString对象。 </div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">因此CString 和 LPCTSTR 基本可以通用。 </div>
<div style="TEXT-INDENT: 2em">但是 LPTSTR又不同了，他是 char*， 意味着你随时可能修改里面的数据，这就需要内存管理了(如字符串变长，原来的存贮空间就不够了，则需要重新调整分配内存)。 所以 不能随便的将 const char* 强制转换成 char* 使用。 楼主举的例子 </div>
<div style="TEXT-INDENT: 2em">LPSTR lpstr = (LPSTR)(LPCTSTR)string; 就是这种不安全的使用方法。 </div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">这个地方使用的是强制类型转换，你都强制转换了，C++编译器当然不会拒绝你，但同时他也认为你确实知道自己要做的是什么。因此是不会给出警告的。 </div>
<div style="TEXT-INDENT: 2em">强制的任意类型转换是C(++)的一项强大之处，但也是一大弊端。这一问题在 vc6 以后的版本(仅针对vc而言)中得到逐步的改进(你需要更明确的类型转换声明)。 </div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">其实在很多地方都可以看到类似 </div>
<div style="TEXT-INDENT: 2em">LPSTR lpstr = (LPSTR)(LPCTSTR)string; </div>
<div style="TEXT-INDENT: 2em">地用法，这种情况一般是函数的约束定义不够完善的原因， 比如一个函数接受一个字符串参数的输入，里面对该字符串又没有任何的修改，那么该参数就应该定义成 const char*， 但是很多初学者弄不清const地用法，或者是懒， 总之就是随意写成了 char* 。 这样子传入CString时就需要强制的转换一下。 </div>
<div style="TEXT-INDENT: 2em">这种做法是不安全的，也是不被建议的用法，你必须完全明白、确认该字符串没有被修改。 </div>
<div style="TEXT-INDENT: 2em">CString 转换到 LPTSTR (char*), 预定的做法是调用CString的GetBuffer函数，使用完毕之后一般都要再调用ReleaseBuffer函数来确认修改 (某些情况下也有不调用ReleaseBuffer的，同样你需要非常明确为什么这么做时才能这样子处理，一般应用环境可以不考虑这种情况)。 </div>
<div style="TEXT-INDENT: 2em">同时需要注意的是， 在GetBuffer 和 ReleaseBuffer之间，CString分配了内存交由你来处理，因此不能再调用其他的CString函数。</div>
<div style="TEXT-INDENT: 2em">CString 转LPCTSTR:</div>
<div style="TEXT-INDENT: 2em">CString cStr;</div>
<div style="TEXT-INDENT: 2em">const char *lpctStr=(LPCTSTR)cStr;</div>
<div style="TEXT-INDENT: 2em">&nbsp;</div>
<div style="TEXT-INDENT: 2em">LPCTSTR转CString:</div>
<div style="TEXT-INDENT: 2em">LPCTSTR lpctStr;</div>
<div style="TEXT-INDENT: 2em">CString cStr=lpctStr;</div>
<br>互转：<br>原文地址：<a href="http://yinengsoft.blog.163.com/blog/static/45958957200952341510414/">http://yinengsoft.blog.163.com/blog/static/45958957200952341510414/</a><br><br>
<p>/* LPTSTR 转换成 CString */<br><br>(1)直接赋值<br>CString strText;<br>LPTSTR lpszText = _T("LPTSTR &gt;&gt; CString");<br>strText = lpszText;<br>::MessageBox( NULL, strText , _T("标题"), MB_ICONASTERISK|MB_TASKMODAL|MB_OK );<br><br>(2)CString::Format()格式化<br>CString strText;<br>LPTSTR lpszText = _T("LPTSTR &gt;&gt; CString");<br>strText.Format( _T("%s"), lpszText );<br>::MessageBox( NULL, strText , _T("标题"), MB_ICONASTERISK|MB_TASKMODAL|MB_OK );<br><br>/* CString 转换成 LPTSTR */<br><br>(1)强制转换<br>CString strText( _T("This is a test") ); <br>LPTSTR lpszText =(LPTSTR)(LPCTSTR)strText; <br>::MessageBox( NULL, lpszText, _T("标题"), MB_ICONASTERISK|MB_TASKMODAL|MB_OK );<br><br>(2)使用lstrcpy()<br>CString strText( "This is a test" );<br>LPTSTR lpszText = new TCHAR[strText.GetLength()+1];<br>lstrcpy( lpszText, strText );<br>::MessageBox( NULL, lpszText, _T("标题"), MB_ICONASTERISK|MB_TASKMODAL|MB_OK );<br><br>(3)使用CString::GetBuffer()<br>CString strText(_T("This is a test "));<br>LPTSTR lpszText = strText.GetBuffer();<br>strText.ReleaseBuffer();<br>::MessageBox( NULL, lpszText, _T("标题"), MB_ICONASTERISK|MB_TASKMODAL|MB_OK ); </p>
<p>TRACE:http://hcorecore.blog.163.com/blog/static/79664102200931811428906/</p>
</div>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/110566.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-26 09:01 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/03/26/110566.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>获取“我的文档”路径</title><link>http://www.cppblog.com/AutomateProgram/archive/2009/05/22/85356.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Fri, 22 May 2009 03:45:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2009/05/22/85356.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/85356.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2009/05/22/85356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/85356.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/85356.html</trackback:ping><description><![CDATA[很多时候&#8220;我的文档&#8221;位置经常被人移到D盘，如下是获取&#8220;我的文档&#8221;路径：
<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">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</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">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">shlobj.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>#pragma&nbsp;comment(&nbsp;lib,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">shell32.lib</span><span style="COLOR: #000000">"</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">iostream</span><span style="COLOR: #000000">&gt;</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></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br><img id=Codehighlighter1_152_581_Open_Image onclick="this.style.display='none'; Codehighlighter1_152_581_Open_Text.style.display='none'; Codehighlighter1_152_581_Closed_Image.style.display='inline'; Codehighlighter1_152_581_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_152_581_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_152_581_Closed_Text.style.display='none'; Codehighlighter1_152_581_Open_Image.style.display='inline'; Codehighlighter1_152_581_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_152_581_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_152_581_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">char</span><span style="COLOR: #000000">&nbsp;m_lpszDefaultDir[MAX_PATH];<br><img id=Codehighlighter1_217_219_Open_Image onclick="this.style.display='none'; Codehighlighter1_217_219_Open_Text.style.display='none'; Codehighlighter1_217_219_Closed_Image.style.display='inline'; Codehighlighter1_217_219_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_217_219_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_217_219_Closed_Text.style.display='none'; Codehighlighter1_217_219_Open_Image.style.display='inline'; Codehighlighter1_217_219_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">char</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;szDocument[MAX_PATH]</span><span style="COLOR: #000000">=</span><span id=Codehighlighter1_217_219_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_217_219_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;memset(m_lpszDefaultDir,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,_MAX_PATH);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;LPITEMIDLIST&nbsp;pidl</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NULL;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;SHGetSpecialFolderLocation(NULL,&nbsp;&nbsp;&nbsp;CSIDL_PERSONAL,&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">pidl);&nbsp;&nbsp;&nbsp;<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;&nbsp;&nbsp;(pidl&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;SHGetPathFromIDList(pidl,&nbsp;&nbsp;&nbsp;szDocument))&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_429_498_Open_Image onclick="this.style.display='none'; Codehighlighter1_429_498_Open_Text.style.display='none'; Codehighlighter1_429_498_Closed_Image.style.display='inline'; Codehighlighter1_429_498_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_429_498_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_429_498_Closed_Text.style.display='none'; Codehighlighter1_429_498_Open_Image.style.display='inline'; Codehighlighter1_429_498_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_429_498_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_429_498_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetShortPathName(szDocument,m_lpszDefaultDir,_MAX_PATH);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</span></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;std::cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">m_lpszDefaultDir</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">std::endl;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello&nbsp;World!\n</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;</span><span style="COLOR: #0000ff">return</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/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>
可以使用SHGetSpecialFolderLocation函数获得&#8220;我的电脑&#8221;所对应的虚拟文件夹的id。然后使用ShellExecuteEx打开这个虚拟文件夹。 <br>&nbsp;&nbsp;&nbsp;&nbsp;使用API函数SHGetSpecialFolderLocation。shlobj.h里有SHGetSpecialFolderLocation的原型声明。这个函数可以帮我们找到Windows的桌面目录、启动目录、我的文档目录等。 <br>&nbsp;&nbsp;&nbsp;&nbsp;SHGetSpecialFolder需要三个参数。 第一个参数是HWND，它指定了"所有者窗口"：在调用这个函数时可能出现的对话框或消息框。第二个参数是一个整数id，决定哪个目录是待查找目录，它的取值可能是： <br>&nbsp;&nbsp;&nbsp;&nbsp;<!-- !@!H -->
<table border=1>
    <tbody>
        <tr>
            <td>CSIDL_BITBUCKET</td>
            <td>回收站</td>
        </tr>
        <tr>
            <td>CSIDL_CONTROLS</td>
            <td>控制面板</td>
        </tr>
        <tr>
            <td>CSIDL_DESKTOP</td>
            <td>Windows 桌面Desktop</td>
        </tr>
        <tr>
            <td>CSIDL_DESKTOPDIRECTORY</td>
            <td>Desktop的目录</td>
        </tr>
        <tr>
            <td>CSIDL_DRIVES</td>
            <td>我的电脑</td>
        </tr>
        <tr>
            <td>CSIDL_FONTS</td>
            <td>字体目录</td>
        </tr>
        <tr>
            <td>CSIDL_NETHOOD</td>
            <td>网上邻居</td>
        </tr>
        <tr>
            <td>CSIDL_NETWORK</td>
            <td>网上邻居虚拟目录</td>
        </tr>
        <tr>
            <td>CSIDL_PERSONAL</td>
            <td>我的文档</td>
        </tr>
        <tr>
            <td>CSIDL_PRINTERS</td>
            <td>打印机</td>
        </tr>
        <tr>
            <td>CSIDL_PROGRAMS</td>
            <td>程序组</td>
        </tr>
        <tr>
            <td>CSIDL_RECENT</td>
            <td>最近打开的文档</td>
        </tr>
        <tr>
            <td>CSIDL_SENDTO</td>
            <td>&#8220;发送到&#8221;菜单项</td>
        </tr>
        <tr>
            <td>CSIDL_STARTMENU</td>
            <td>任务条启动菜单项</td>
        </tr>
        <tr>
            <td>CSIDL_STARTUP</td>
            <td>启动目录</td>
        </tr>
        <tr>
            <td>CSIDL_TEMPLATES</td>
            <td>文档模板</td>
        </tr>
    </tbody>
</table>
<!-- !@!H --><br>&nbsp;&nbsp;&nbsp;&nbsp;这里只是最常用的部分。完整的请参考<a class=a1 href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/enums/csidl.asp" target=_blank><u><font color=#0000ff>http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/enums/csidl.asp</font></u></a>。 <br>&nbsp;&nbsp;&nbsp;&nbsp;最后一个参数是pidl地址。SHGetSpecialFolderLocation把地址写到pidl。 <br>&nbsp;&nbsp;&nbsp;&nbsp;下面是一个例子： <br>&nbsp;&nbsp;&nbsp;&nbsp;<font face="Courier New" size=2><font color=#000000>LPITEMIDLIST pidl;<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp;</font>TCHAR szPath [MAX_PATH];<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp;</font>LPMALLOC pMalloc;<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color=#0000ff><strong>if </strong></font>( SUCCEEDED( SHGetSpecialFolderLocation ( NULL, CSIDL_DRIVES, &amp;pidl )))<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp;</font>{<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font>SHELLEXECUTEINFO sei;<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font>ZeroMemory(&amp;sei, <font color=#0000ff><strong>sizeof</strong></font>(sei));<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font>sei.cbSize = <font color=#0000ff><strong>sizeof</strong></font>(sei);<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font>sei.fMask = SEE_MASK_IDLIST;<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font>sei.lpIDList = pidl;<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font>sei.lpVerb = "open";<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font>sei.hwnd = AfxGetMainWnd()-&gt;GetSafeHwnd();<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font>sei.nShow = SW_SHOWNORMAL;<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font>ShellExecuteEx(&amp;sei);<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font><font color=#0000ff><strong>if </strong></font>( SUCCEEDED( SHGetMalloc ( &amp;pMalloc )))<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font>{<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font>pMalloc-&gt;Free ( pidl );<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font>pMalloc-&gt;Release();<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font>}<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp;</font>} <br>&nbsp;&nbsp;&nbsp;&nbsp;</font> <br>&nbsp;&nbsp;&nbsp;&nbsp;由于&#8220;我的电脑&#8221;是虚拟文件夹，所以必须使用ShellExecuteEx函数，如果是普通文件夹，则可以使用SHGetPathFromIDList获得文件名，然后利用ShellExecute函数打开。例如要打开&#8220;发送到&#8221;文件夹，可以这样： <br>&nbsp;&nbsp;&nbsp;&nbsp;<font face="Courier New" size=2><font color=#0000ff><strong>if </strong></font>( SUCCEEDED( SHGetSpecialFolderLocation ( NULL, CSIDL_SENDTO, &amp;pidl )))<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp;</font>{<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font><font color=#0000ff><strong>if </strong></font>( SHGetPathFromIDList ( pidl, szPath ))<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font>{<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font>ShellExecute(AfxGetMainWnd()-&gt;GetSafeHwnd(),<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font>"open", szPath, NULL, NULL,<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font>SW_SHOWNORMAL);<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font>}<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; </font><font color=#0000ff><strong>if </strong></font>( SUCCEEDED( SHGetMalloc ( &amp;pMalloc )))<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font>{<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font>pMalloc-&gt;Free ( pidl );<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font>pMalloc-&gt;Release();<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; </font>}<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp;</font>}<font color=#ffffff> <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;</font></font> <br>&nbsp;&nbsp;&nbsp;&nbsp;如果是虚拟文件夹，SHGetPathFromIDList函数会失败。 <br>&nbsp;&nbsp;&nbsp;&nbsp;对于普通文件夹也可以使用SHGetSpecialFolderPath函数，而不使用SHGetSpecialFolderLocation函数，这样更简单些，但运行环境必须是Windows 2000以后的操作系统或安装了IE 4.0以上版本。 <br></font>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/85356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2009-05-22 11:45 <a href="http://www.cppblog.com/AutomateProgram/archive/2009/05/22/85356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>注册表的简单应用--获取所有安装的软件名</title><link>http://www.cppblog.com/AutomateProgram/archive/2009/05/22/85354.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Fri, 22 May 2009 03:30:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2009/05/22/85354.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/85354.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2009/05/22/85354.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/85354.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/85354.html</trackback:ping><description><![CDATA[先给一个注册表操作的封装类：<br><a href="http://www.cppblog.com/Files/AutomateProgram/Register.rar">下载</a><br>转：<a href="http://www.codeproject.com/KB/system/installed_programs.aspx">http://www.codeproject.com/KB/system/installed_programs.aspx</a><br>从HKEY_LOCAL_MACHINE Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall 下依次读取所有的DisplayName<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: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;IS_KEY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_T("Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall")</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;IS_KEY_LEN&nbsp;&nbsp;&nbsp;&nbsp;256</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;IS_DISPLAY&nbsp;&nbsp;&nbsp;&nbsp;_T("DisplayName")</span></div>
<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: #008000">//</span><span style="COLOR: #008000">&nbsp;Build&nbsp;a&nbsp;list&nbsp;of&nbsp;installed&nbsp;applications&nbsp;by&nbsp;enumerating<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;fetching&nbsp;"DisplayName"&nbsp;entry</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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HKEY&nbsp;hKey;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,&nbsp;IS_KEY,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;KEY_READ,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">hKey)&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;ERROR_SUCCESS)<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;</span><span style="COLOR: #0000ff">return</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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwIndex&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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LONG&nbsp;lRet;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;cbName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;IS_KEY_LEN;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCHAR&nbsp;szSubKeyName[IS_KEY_LEN];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;((lRet&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;::RegEnumKeyEx(hKey,&nbsp;dwIndex,&nbsp;szSubKeyName,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">cbName,&nbsp;NULL,<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;NULL,&nbsp;NULL,&nbsp;NULL))&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;ERROR_NO_MORE_ITEMS)<br><img id=Codehighlighter1_499_1129_Open_Image onclick="this.style.display='none'; Codehighlighter1_499_1129_Open_Text.style.display='none'; Codehighlighter1_499_1129_Closed_Image.style.display='inline'; Codehighlighter1_499_1129_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_499_1129_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_499_1129_Closed_Text.style.display='none'; Codehighlighter1_499_1129_Open_Image.style.display='inline'; Codehighlighter1_499_1129_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_499_1129_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_499_1129_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;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Do&nbsp;we&nbsp;have&nbsp;a&nbsp;key&nbsp;to&nbsp;open?</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(lRet&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;ERROR_SUCCESS)<br><img id=Codehighlighter1_566_1087_Open_Image onclick="this.style.display='none'; Codehighlighter1_566_1087_Open_Text.style.display='none'; Codehighlighter1_566_1087_Closed_Image.style.display='inline'; Codehighlighter1_566_1087_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_566_1087_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_566_1087_Closed_Text.style.display='none'; Codehighlighter1_566_1087_Open_Image.style.display='inline'; Codehighlighter1_566_1087_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_566_1087_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_566_1087_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;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Open&nbsp;the&nbsp;key&nbsp;and&nbsp;get&nbsp;the&nbsp;value</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HKEY&nbsp;hItem;<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: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(::RegOpenKeyEx(hKey,&nbsp;szSubKeyName,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;KEY_READ,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">hItem)&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;ERROR_SUCCESS)<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;</span><span style="COLOR: #0000ff">continue</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><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: #008000">//</span><span style="COLOR: #008000">&nbsp;Opened&nbsp;-&nbsp;look&nbsp;for&nbsp;"DisplayName"</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCHAR&nbsp;szDisplayName[IS_KEY_LEN];<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;DWORD&nbsp;dwSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(szDisplayName);<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;DWORD&nbsp;dwType;<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;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(::RegQueryValueEx(hItem,&nbsp;IS_DISPLAY,&nbsp;NULL,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">dwType,<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;(LPBYTE)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">szDisplayName,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">dwSize)&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;ERROR_SUCCESS)<br><img id=Codehighlighter1_978_1056_Open_Image onclick="this.style.display='none'; Codehighlighter1_978_1056_Open_Text.style.display='none'; Codehighlighter1_978_1056_Closed_Image.style.display='inline'; Codehighlighter1_978_1056_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_978_1056_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_978_1056_Closed_Text.style.display='none'; Codehighlighter1_978_1056_Open_Image.style.display='inline'; Codehighlighter1_978_1056_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;</span><span id=Codehighlighter1_978_1056_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_978_1056_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;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Add&nbsp;to&nbsp;the&nbsp;main&nbsp;array</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_aPrograms.Add(szDisplayName);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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;}</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;::RegCloseKey(hItem);<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;}</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;dwIndex</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;cbName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;IS_KEY_LEN;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.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/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::RegCloseKey(hKey);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br><a href="http://www.cppblog.com/Files/AutomateProgram/installed_programs_mfc_src.zip">下载</a>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/85354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2009-05-22 11:30 <a href="http://www.cppblog.com/AutomateProgram/archive/2009/05/22/85354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++中操作注册表的几个重要API</title><link>http://www.cppblog.com/AutomateProgram/archive/2009/05/22/85352.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Fri, 22 May 2009 03:24:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2009/05/22/85352.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/85352.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2009/05/22/85352.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/85352.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/85352.html</trackback:ping><description><![CDATA[转：<a href="http://blog.chinaunix.net/u2/67530/showart_602802.html">http://blog.chinaunix.net/u2/67530/showart_602802.html</a><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一起学习注册表的操作，API为我们提供了大约25个函数。他提供了对注册表的读取，写入，删除，以及打开注册表及键值时所有函数，并且可以达到对注册表的备份，连接和对远端注册表进行查看等等。注册表对整个系统十分重要，你在进行操作时，一定要先考虑清楚。这些函数有： <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RegCloseKey RegConnectReGIStry RegCreateKey RegCreateKeyEx RegDeleteKey RegDeleteVale&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RegEnumKey RegFlushKey RegGetKeySecurity（此函数，98不适用） RegLoadKey&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RegNotifyChangeKeyValue（98不适用） RegOpenKey RegOpenKeyEx RegQueryInfoKey RegQueryValue <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RegQueryValueEx RegReplaceKey RegRestoreKey（98不适用） RegSaveKey RegSetKeySecurity（98不适用） RegSetValue RegSetValueEx RegUnLoadKey <br>我们对经常使用的几个函数进行介绍。 <br><br><span style="COLOR: red">1&#183;RegClose()</span> <br>&nbsp;&nbsp;&nbsp; 原形：LONG RegCloseKey( <br>&nbsp;&nbsp;&nbsp; HKEY hKey // 释放已经打开的注册表句柄 <br>&nbsp;&nbsp;&nbsp; ); <br>返回值:不成功返回非0，成功返回ERROR_SUCCESS <br><span style="COLOR: #3366ff">解释：关闭指定的主册表键，释放句柄。当对一个或多个键或值操作完成以后，需要关闭其键来进行保存操作结果。关闭一个键后，句柄变为非法，以使其不可再次被使用。为系统重新使用而释放句柄。</span> <br>&nbsp;&nbsp;&nbsp; 例子 <br>BOOL bRet = TRUE; <br>if( m_hKey == NULL ) <br>return( FALSE ); <br>bRet = ( ::RegCloseKey( m_hKey ) == ERROR_SUCCESS ); <br>m_hKey = NULL; <br>return( bRet );&nbsp;<br><br><span style="COLOR: #ff0000">2&#183;RegCreateKeyEx()和RegCreateKey() <br></span>原形：LONG RegCreateKeyEx( <br>HKEY hKey, // 主键名称 <br>LPCTSTR lpSubKey, // 子键名称或路径 <br>DWORD Reserved, // 保留，为0 <br>LPTSTR lpClass, // 没弄懂，我设为空也差不多 <br>DWORD dwOptions, <br>/* 对你建立的键的一些选项，可以是这些值：REG_OPTION_NON_VOLATILE，REG_OPTION_VOLATILE，REG_OPTION_BACKUP_RESTORE第一个是默认的了。一般用第一个就可以了。*/ <br>REGSAM samDesired, // 设置你对你建立的这个键的访问权限 <br>LPSECURITY_ATTRIBUTES lpSecurityAttributes, <br>//不太明白 <br>PHKEY phkResult, // 指向你建的句柄 <br>LPDWORD lpdwDisposition //用来查看是打开一个已经有的键，还是新建了键 <br>); <br>RegCreateKey()函数简单了不少，请自己看了。 <br>返回值：不成功返回非0，成功返回ERROR_SUCCESS. <br>解释：打开指定的键或子键。如果要打开的键不存在的话，本函数会试图建立它。当在创建或打开注册表的键时，需要指定访问权限，而这些访问权限需要到一级。默认的权限是KEY_ALL_Access权限。还有KEY_CREATE_LINK创建字符链权限,KEY_CREATE_SUB_KEY创建子键权限,KEY_EXECUTE读取键权限，KEY_NOTIFY获得修改键通知的权限，KEY_QUERY_VALUE查询键值的权限，KEY_SET_VALUE设置数据值的权限。注意不能在根一级建键，在注册表的根一级仅可有预定义的键。具体使用，请查看联机手册。 <br>例子: <br>HKEY m_hkey; <br>DWORD dwDisposition; <br>long ret0=(::RegCreateKeyEx <br>(HKEY_CURRENT_USER,"REGD\\",0,NULL, <br>REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&amp;m_hkey,&amp;dwDisposition)); <br>if(ret0!=ERROR_SUCCESS) //如果无法打开hKEY，则终止程序的执行 <br>{ <br>MessageBox("错误: 无法打开有关的hKEY!"); <br>return; <br>} <br>if(dwDisposition==REG_OPENED_EXISTING_KEY) <br>MessageBox("打开了一个已经存在的键"); <br>else <br>{ <br>if(dwDisposition==REG_CREATED_NEW_KEY) <br>MessageBox("建立一个新键"); <br>} <br>RegClosekey(m_hkey); <br><br><span style="COLOR: #ff0000">3&#183;RegOpenKey()和RegOpenKeyEx()</span> <br>原形：LONG RegOpenKeyEx( <br>HKEY hKey, // 要打开主键名 <br>LPCTSTR lpSubKey, // 子键或路径 <br>DWORD ulOptions, // 保留，为0 <br>REGSAM samDesired, // 操作权限标志 <br>PHKEY phkResult // 指向你打开键的句柄 <br>); <br>返回值:不成功返回非0，成功返回ERROR_SUCCESS. <br>解释：该函数负责打开指定的键或子键，如果不存在他不建立。其他和RegCreateKeyEx()和RegCreateKey()基本相同。 <br><br><span style="COLOR: #ff0000">4&#183;RegDeleteKey()</span> <br>原形：LONG RegDeleteKey( <br>HKEY hKey, // 已打开的键的句柄 <br>LPCTSTR lpSubKey // 要删除的子键或路径，传如""将删除key本身 <br>); <br>返回值：不成功返回非0，成功返回ERROR_SUCCESS <br>该函数用来删除注册表中的一个键值的。在用此函数时需要注意98与NT的差异。在NT中在删除一个键之前，要求必须删除所有子键，需要从下向上递归删除所有子键，而Windows98没有他那么复杂，只要删除键及其所有子键就可以啦。 <br><br><span style="COLOR: #ff0000">5&#183;RegQueryValue()和RegQueryValueEx() <br></span>原形：LONG RegQueryValueEx( <br>HKEY hKey, // 已打开的键的句柄 <br>LPTSTR lpValueName, // 要查询值的名称，传如""为查询键下的默认值 <br>LPDWORD lpReserved, // 保留，为0 <br>LPDWORD lpType, // 查询的类型 <br>LPBYTE lpData, // 数据存放的地址 <br>LPDWORD lpcbData // 数据长度 1 <br>); <br>返回值：不成功返回非0，成功返回ERROR_SUCCESS <br>解释：读取某子键下特定名称的值。 <br>例子 <br>CString m_strQ;//用来存放查询来的字符串值 <br>DWORD m_dwCount;//记录字符串的长度 1（包括NULL字符） <br>::RegQueryValueEx(m_hkey,"",0,NULL,NULL,&amp;m_dwCount);//先查询出字节空间 <br>ret1=(::RegQueryValueEx <br>(m_hkey,"",0,NULL,(unsigned char *)m_strQ.GetBuffer(m_dwCount),&amp;m_kk)); <br>m_strQ.ReleaseBuffer(); <br>MessageBox(m_strQ); <br><br><span style="COLOR: #ff0000">6&#183;RegSetValue()和RegSetValueEX() <br></span>原形：LONG RegSetValueEx( <br>HKEY hKey, // 已打开的键的句柄 <br>LPCTSTR lpValueName, // 要查询值的名称，传如""为查询键下的默认值 <br>DWORD Reserved, // 保留 <br>DWORD dwType, // 变量的类型 <br>CONST BYTE *lpData, // 变量数据的地址 <br>DWORD cbData // 变量的长度 <br>); <br>返回值：不成功返回非0，成功返回ERROR_SUCCESS <br>解释：设置某子键下特定名称的值。 <br><br><span style="COLOR: #ff0000">7&#183;RegEnumValue()</span> <br>原形：LONG RegEnumValue( <br>HKEY hKey, // 要查询的已打开的键的句柄 <br>DWORD dwIndex, // 读取名称的索引号 <br>LPTSTR lpValueName, // 返回所读取的名称 <br>LPDWORD lpcbValueName, // 返回读取名称的长度，不含chr(0) <br>LPDWORD lpReserved, // 保留，为0 <br>LPDWORD lpType, // 返回所读取的数据类型 <br>LPBYTE lpData, // 返回所读取的数据 <br>LPDWORD lpcbData // 返回所读取的数据长度 <br>); <br>返回值：不成功返回非0，成功返回ERROR_SUCCESS <br>解释：列出某Key的所有名称的值，变化索引即可遍历整个键下的名称和数据。 <br><br><span style="COLOR: #ff0000">8&#183;RegDeleteValue()</span> <br>原形：LONG RegDeleteValue( <br>HKEY hKey, // 要删除的键的句柄 <br>LPCTSTR lpValueName // 要删除的名称 <br>); <br>返回值：不成功返回非0，成功返回ERROR_SUCCESS <br>解释：删除某Key的某一名称 <br><br><span style="COLOR: #ff0000">9&#183;RegEnumKey()和RegEnumKeyEx() <br></span>原形：LONG RegEnumKeyEx( <br>HKEY hKey, // 要列举的键的句柄 <br>DWORD dwIndex, // 索引 <br>LPTSTR lpName, // 子键的名称 <br>LPDWORD lpcbName, // 子键名称的长度 <br>LPDWORD lpReserved, // 保留 <br>LPTSTR lpClass, // address of buffer for class string <br>LPDWORD lpcbClass, // address for size of class buffer <br>PFILETIME lpftLastWriteTime <br>// address for time key last written to <br>); <br>返回值：不成功返回非0，成功返回ERROR_SUCCESS <br>返回注册表键及其子键的详细信息。 <br><br><span style="COLOR: #ff0000">10&#183;RegQueryInfoKey()</span> <br>原形：LONG RegQueryInfoKey( <br>HKEY hKey, // 已打开的键的句柄 <br>LPTSTR lpClass, // 类型名称，仅使用于NT。若不使用则传入Null <br>LPDWORD lpcbClass, // 类型名称的长度 <br>LPDWORD lpReserved, // 保留 <br>LPDWORD lpcSubKeys, // 返回子键的数目 <br>LPDWORD lpcbMaxSubKeyLen, // 返回最长的子键长度 <br>LPDWORD lpcbMaxClassLen, // 返回最长的类长度 <br>LPDWORD lpcValues, // 返回值的数目 <br>LPDWORD lpcbMaxValueNameLen, // 返回最长的值项名称的长度 <br>LPDWORD lpcbMaxValueLen, // 返回最长的值的长度 <br>LPDWORD lpcbSecurityDescriptor, //返回安全描述，仅适用于 NT <br>PFILETIME lpftLastWriteTime // 返回键最后被写入的时间，仅适用于 NT <br>); <br>返回值：不成功返回非0，成功返回ERROR_SUCCESS <br>解释：返回注册表键的信息，包括类名、子键数量、最长子键名、值的数量、最长值数据、安全描述符的长度以及上一次写入的时间等。 <br><br><span style="COLOR: #ff0000">11&#183;RegLoadKey()</span> <br>原形：LONG RegLoadKey( <br>HKEY hKey, // 打开的句柄 <br>LPCTSTR lpSubKey, //子键的路径 <br>LPCTSTR lpFile // 要写入注册表信息的文件 <br>); <br>返回值：不成功返回非0，成功返回ERROR_SUCCESS <br>解释：从指定的文件恢复注册表键的子键信息到注册表。 <br><br><span style="COLOR: #ff0000">12&#183;RegReplaceKey()</span> <br>原形：LONG RegReplaceKey( <br>HKEY hKey, // handle to open key <br>LPCTSTR lpSubKey, // address of name of subkey <br>LPCTSTR lpNewFile, // 在替换前生成新的备份文件 <br>LPCTSTR lpOldFile // 需要覆盖上注册表的文件 <br>); <br>返回值：不成功返回非0，成功返回ERROR_SUCCESS <br>解释：从指定的文件恢复注册表键的子键信息到注册表并替换原有的值，并生成新的备份文件 <br><br><span style="COLOR: #ff0000">13&#183; RegSaveKey()</span> <br>LONG RegSaveKey( <br>HKEY hKey, // 要保存的句柄 <br>LPCTSTR lpFile, // 保存子键的文件 <br>LPSECURITY_ATTRIBUTES lpSecurityAttributes //不太懂 <br>); <br>返回值：不成功返回非0，成功返回ERROR_SUCCESS <br>解释：保存键及其子键信息到指定的文件。 <br><br><span style="COLOR: #ff0000">14&#183; RegConnectRegistry()</span> <br>原形：LONG RegConnectRegistry( <br>LPTSTR lpMachineName, //远程计算机的名称 <br>HKEY hKey, // 预先注册的句柄 <br>PHKEY phkResult // 远程计算机上的句柄 <br>); <br>返回值：不成功返回非0，成功返回ERROR_SUCCESS <br>解释：连接到远程系统的注册表。 <br><br><span style="COLOR: #ff0000">15&#183;RegNotifyChangeKeyValue()</span> <br>当修改指定的注册表对象时提供通知。 <br><br><span style="COLOR: #ff0000">16&#183; RegUnloadKey()</span> <br>LONG RegUnLoadKey( <br>HKEY hKey, // handle to open key <br>LPCTSTR lpSubKey // address of name of subkey to unload <br>); <br>返回值：不成功返回非0，成功返回ERROR_SUCCESS <br>删除注册表键及其所有的子键。 
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/85352.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2009-05-22 11:24 <a href="http://www.cppblog.com/AutomateProgram/archive/2009/05/22/85352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>