??xml version="1.0" encoding="utf-8" standalone="yes"?>91麻豆精品国产91久久久久久,99精品伊人久久久大香线蕉,久久久WWW成人免费毛片http://www.shnenglu.com/AutomateProgram/category/8847.html当音乐和传说在深夜中沉寂后,E序的每个字W还在蟩动!zh-cnFri, 13 Jan 2012 09:06:39 GMTFri, 13 Jan 2012 09:06:39 GMT60Nginx模块开发入?/title><link>http://www.shnenglu.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.shnenglu.com/AutomateProgram/archive/2012/01/05/163629.html</guid><wfw:comment>http://www.shnenglu.com/AutomateProgram/comments/163629.html</wfw:comment><comments>http://www.shnenglu.com/AutomateProgram/archive/2012/01/05/163629.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/AutomateProgram/comments/commentRss/163629.html</wfw:commentRss><trackback:ping>http://www.shnenglu.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: error: the HTTP rewrite module requires the PCRE 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 can either disable the module by using --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, or install the PCRE library into the system, or build the PCRE 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 from the source with nginx by using --with-pcre=<path> 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 aptitude install 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'">如果q缺其他包Ql安装?/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 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 make 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="宋体">Q?/font><font face="Times New Roman">sudo /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 apt-get install 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 -i 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'">讉K</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 to nginx</font><font face="宋体">的欢q字q?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 Gif</font><font face="宋体">插g</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="宋体">的开发,比较全面Q但较老,如果要详l了?/font><font face="Times New Roman">nginx</font><font face="宋体">的模块开发,q得熟悉</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 Gif</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'">较ؓ单,主要的功能就是浏览器讉K某个地址Q返回一?/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'">如何~译Q?/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 Gif</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">使用C囄库,先安?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 apt-get install libmagickwand-dev</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><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 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: '微Y雅黑'; color: rgb(0,0,0); font-size: 9.5pt; font-weight: normal; mso-spacerun: 'yes'">1?/span><span style="font-style: normal; font-family: '微Y雅黑'; color: rgb(0,0,0); font-size: 9.5pt; font-weight: normal; mso-spacerun: 'yes'">~写模块config文gQ这个文仉要放在和模块源代码文件放在同一目录下。文件内容如下:</span><span style="font-family: 'Times New Roman'; 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> <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'"> </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 <font face="宋体">模块完整名称</font><font face="Times New Roman">"</font></span><span style="font-family: 'Times New Roman'; 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> <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 $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'"> </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'">文gQ放在同一个目录下<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'">q入<font face="Times New Roman">Nginx</font><font face="宋体">源代码,使用命o~译安装<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 />   </span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">./configure --prefix=<font face="宋体">安装目录 </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'"> </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'"> </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 make install</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'"><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 /circles {</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'">        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'">    }</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  </span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'">/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf</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'"><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 ><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'"> <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.shnenglu.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/<background color>/<foreground color>/<size>.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 ><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="宋体">的文ӞҎ~译选项Q?/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="宋体">的g发生变化Q?/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 gif</font><font face="宋体">模块Q默认就是用了Q,则最l?/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 /</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'">              ngx_http_core_module /</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'">              ngx_http_log_module /</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'">              ngx_http_upstream_module /</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'">              ngx_http_empty_gif_module "</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'">注意Q这里的<font face="Arial">ngx_http_empty_gif_module</font><font face="宋体">字符串对应了</font><font face="Arial">ngx_http_empty_gif_module.c</font><font face="宋体">文g中的</font><font face="Arial">Module</font><font face="宋体">ȝ构变量名?/font></span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; mso-spacerun: 'yes'"> <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 ><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'"> </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 ><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'"> </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 ><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'"> </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 ><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'"> </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 ><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'"> <br /><a >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 ><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'"> </span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'">中有很多关于W三Ҏ块的开发,国h</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'">在这斚w做了大量的工作?/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.shnenglu.com/AutomateProgram/aggbug/163629.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/AutomateProgram/" target="_blank">漂漂</a> 2012-01-05 15:12 <a href="http://www.shnenglu.com/AutomateProgram/archive/2012/01/05/163629.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>centso5下用coreseek(sphinx)建立搜烦引擎http://www.shnenglu.com/AutomateProgram/archive/2011/08/25/154335.html漂漂漂漂Thu, 25 Aug 2011 06:15:00 GMThttp://www.shnenglu.com/AutomateProgram/archive/2011/08/25/154335.htmlhttp://www.shnenglu.com/AutomateProgram/comments/154335.htmlhttp://www.shnenglu.com/AutomateProgram/archive/2011/08/25/154335.html#Feedback0http://www.shnenglu.com/AutomateProgram/comments/commentRss/154335.htmlhttp://www.shnenglu.com/AutomateProgram/services/trackbacks/154335.html1.安装coreseek

CentOS的测试环境安?br />参考地址Q?a >http://www.coreseek.cn/products/products-install/install_on_bsd_linux/CentOS-5-5/

32位版本:
coreseek安装需要预装的软gQyum install make gcc g++ gcc-c++ libtool autoconf automake imake mysql-devel libxml2-devel expat-devel

64位版本:
coreseek安装需要预装的软gQyum install make gcc g++ gcc-c++ libtool autoconf automake imake mysql-devel libxml2-devel expat-devel

CoreSeek安装Q?br />参考地址Q?br />http://www.coreseek.cn/products-install/install_on_bsd_linux/

##下蝲coreseekQcoreseek 3.2.14Q点M载、coreseek 4.0.1Q点M?br />$ wget http://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.14.tar.gz
$ 或?http://www.coreseek.cn/uploads/csft/4.0/coreseek-4.0.1-beta.tar.gz
$ tar xzvf coreseek-3.2.14.tar.gz 或?coreseek-4.0.1-beta.tar.gz
$ cd coreseek-3.2.14 或?coreseek-4.0.1-beta

##前提Q需提前安装操作pȝ基础开发库及mysql依赖库以支持mysql数据源和xml数据?br />##安装mmseg
$ cd mmseg-3.2.14
$ ./bootstrap    #输出的warning信息可以忽略Q如果出现error则需要解?br />$ ./configure --prefix=/usr/local/mmseg3
$ make && make install
$ cd ..

一般情况这都不会出C么问题?/p>

##安装coreseek
$ cd csft-3.2.14 或?cd csft-4.0.1
$ sh buildconf.sh    #输出的warning信息可以忽略Q如果出现error则需要解?br />$ ./configure --prefix=/usr/local/coreseek  --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql    ##如果提示mysql问题Q可以查看MySQL数据源安装说?br />$ make && make install
$ cd ..

---------------------------------------------------------------------------------------------------------------------------------------------------
注:
问题1:在sh buildconf.sh是可能会出现QAutoconf version 2.62 or higher is required的错误,q是centos的Autoconf版本太低D的,手动安装一下Autoconf卛_
centos下升Uautoconf
#whereis autoconf #查看autoconf的\?
#rpm -qf /usr/bin/autoconf #查看autoconf的版?br />#rpm -e --nodeps autoconf-2.59-12 #卸蝲原来版本
#tar -zxf autoconf-2.65.tar.gz
#cd autoconf-2.65
#./configure --prefix=/usr
#make && make install
#/usr/bin/autoconf -V #查看是否安装成功

问题2:出现 undefined reference to libiconv_open的错误,
sphinx依赖于libiconv实现~码转换。所以在机器上提前要安装libiconv库。然后有configure完成后,使用命o vim src/Makefile(在csft目录?Q?br />扑ֈ LIBS = -lm -lexpat -L/usr/local/lib 改ؓLIBS = -lm -lexpat -liconv -L/usr/local/lib重新make可以了。网上有其它人将?define USE_LIBICONV改ؓ0Q?br />表示不用libiconv。虽然可以解决问题,但不推荐此方法?br />安装liconvQ?br />#wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz
#tar -zxvf libiconv-1.13.1.tar.gz
#cd libiconv-1.13.1
# ./configure --prefix=/usr/local/libiconv
# make
# make install

~辑Q?br />./src/MakeFile文g
?br />LIBS = -lm -lexpat -L/usr/local/lib
Ҏ
LIBS = -lm -lexpat -liconv -L/usr/local/lib 


使用命o”bin/indexer”创徏索引Ӟ出现”error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or directory”的问?/p>

在出现这个问题时Q先看是否在 /usr/lib下有libiconv.so.2文g或此文g的Y(?q接。没有的话就做一下连?前提是安装了libiconv)。然后执行如下的命oQ?br />echo   /usr/lib >> /etc/ld.so.conf 接着执行ldconfig。这时就没有问题了?br />----------------------------------------------------------------------------------------------------------------------------------------------------


##试mmseg分词Qcoreseek搜烦Q需要预先设|好字符集ؓzh_CN.UTF-8Q确保正显CZ文)
$ cd testpack
$ cat var/test/test.xml    #此时应该正确昄中文
$ /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc var/test/test.xml
$ /usr/local/coreseek/bin/indexer -c etc/csft.conf --all
$ /usr/local/coreseek/bin/search -c etc/csft.conf |络搜烦



漂漂 2011-08-25 14:15 发表评论
]]>
SetWindowsHookEx原理(如何使用钩子Q用钩子hook其他q程的函?http://www.shnenglu.com/AutomateProgram/archive/2011/01/24/139227.html漂漂漂漂Mon, 24 Jan 2011 07:30:00 GMThttp://www.shnenglu.com/AutomateProgram/archive/2011/01/24/139227.htmlhttp://www.shnenglu.com/AutomateProgram/comments/139227.htmlhttp://www.shnenglu.com/AutomateProgram/archive/2011/01/24/139227.html#Feedback0http://www.shnenglu.com/AutomateProgram/comments/commentRss/139227.htmlhttp://www.shnenglu.com/AutomateProgram/services/trackbacks/139227.htmlhttp://blog.sina.com.cn/s/blog_5a0662bf0100g8jd.html

基本概念
  钩子(Hook)Q是Windows消息处理机制的一个^?应用E序可以在上面设|子E以监视指定H口的某U消息,而且所监视的窗口可以是其他q程所创徏的。当消息到达后,在目标窗口处理函C前处理它。钩子机制允许应用程序截获处理window消息或特定事件?钩子实际上是一个处理消息的E序D,通过pȝ调用Q把它挂入系l。每当特定的消息发出Q在没有到达目的H口前,钩子E序先捕获该消息,亦即钩子函数先得到控制权。这旉子函数即可以加工处理Q改变)该消息,也可以不作处理而l传递该消息Q还可以强制l束消息的传递?/p>

q行机制
  1、钩子链表和钩子子程Q?br>  每一个Hook都有一个与之相兌的指针列表,UC为钩子链表,ql来l护。这个列表的指针指向指定的,应用E?序定义的Q被Hook子程调用的回调函敎ͼ也就是该钩子的各个处理子E。当与指定的Hookcd兌的消息发生时Q系l就把这个消息传递到Hook子程?一些Hook子程可以只监视消息,或者修Ҏ息,或者停止消息的前进Q避免这些消息传递到下一个Hook子程或者目的窗口。最q安装的钩子攑֜铄开始, 而最早安装的钩子攑֜最后,也就是后加入的先获得控制权?/p>

   Windows q不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸蝲QWindows 侉K攑օ占用的内存,q更新整个Hook链表。如果程序安装了钩子Q但是在未卸蝲钩子之前q束了Q那么系l会自动为它做卸载钩子的操作?br>  钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函敎ͼ只能定义为普通的C函数。用以监视系l或某一特定cd的事Ӟq些事g可以是与某一特定U程兌的,也可以是pȝ中所有线E的事g?/p>

钩子子程必须按照以下的语法:
  LRESULT CALLBACK HookProc
  (
  int nCode,
  WPARAM wParam,
  LPARAM lParam
  );
  HookProc是应用程序定义的名字?br>  nCode参数是Hook代码QHook子程使用q个参数来确定Q务。这个参数的g赖于HookcdQ每一UHook都有自己的Hook代码特征字符集?br>  wParam和lParam参数的g赖于Hook代码Q但是它们的典型值是包含了关于发送或者接收消息的信息?/p>

2、钩子的安装与释放:
  使用API函数SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子链表中?SetWindowsHookEx函数L在Hook铄开头安装Hook子程。当指定cd的Hook监视的事件发生时Q系l就调用与这个Hook兌?Hook铄开头的Hook子程。每一个Hook链中的Hook子程都决定是否把q个事g传递到下一个Hook子程。Hook子程传递事件到下一?Hook子程需要调用CallNextHookEx函数?/p>

HHOOK SetWindowsHookEx(
  int idHook, // 钩子的类型,卛_处理的消息类?br>  HOOKPROC lpfn, // 钩子子程的地址指针。如果dwThreadId参数?
  // 或是一个由别的q程创徏的线E的标识Q?br>  // lpfn必须指向DLL中的钩子子程?br>  // 除此以外Qlpfn可以指向当前q程的一D钩子子E代码?br>  // 钩子函数的入口地址Q当钩子钩到M消息后便调用q个函数?br>  HINSTANCE hMod, // 应用E序实例的句柄。标识包含lpfn所指的子程?br>  DLL?br>  // 如果dwThreadId 标识当前q程创徏的一个线E,
  // 而且子程代码位于当前q程QhMod必须为NULL?br>  // 可以很简单的讑֮其ؓ本应用程序的实例句柄?br>  DWORD dwThreadId // 与安装的钩子子程相关联的U程的标识符?br>  // 如果?Q钩子子E与所有的U程兌Q即为全局钩子?br>  );

函数成功则返回钩子子E的句柄Q失败返回NULL?br>  以上所说的钩子子程与线E相兌是指在一钩子链表中发l该U程的消息同时发送给钩子子程Q且被钩子子E先处理。 在钩子子E中调用得到控制权的钩子函数在完成对消息的处理后Q如果想要该消息l箋传递,那么它必调用另外一?SDK中的API函数CallNextHookEx来传递它Q以执行钩子链表所指的下一个钩子子E。这个函数成功时q回钩子链中下一个钩子过E的q回| q回值的cd依赖于钩子的cd。这个函数的原型如下Q?br>  LRESULT CallNextHookEx
  (
  HHOOK hhk;
  int nCode;
  WPARAM wParam;
  LPARAM lParam;
  );
  hhk为当前钩子的句柄Q由SetWindowsHookEx()函数q回?br>  NCodeZl钩子过E的事g代码?br>  wParam和lParam 分别是传l钩子子E的wParam|其具体含义与钩子cd有关?br>  钩子函数也可以通过直接q回TRUE来丢弃该消息QƈL该消息的传递。否则的话,其他安装了钩子的应用E序不会接收到钩子的通知而且q有可能产生不正的l果?br>  钩子在用完之后需要用UnHookWindowsHookEx()卸蝲Q否则会造成ȝ。释N子比较简单,UnHookWindowsHookEx()只有一个参数。函数原型如下:
  UnHookWindowsHookEx
  (
  HHOOK hhk;
  );
  函数成功q回TRUEQ否则返回FALSE.

3、一些运行机Ӟ
  在Win16环境中,DLL的全局数据Ҏ个蝲入它的进E来说都是相同的Q而在Win32环境中,情况却发生了变化QDLL函数中的代码所创徏的Q何对象(包括变量Q都归调用它的线E或q程所有。当q程在蝲入DLLӞ操作pȝ自动把DLL地址映射到该q程的私有空_也就是进E的虚拟地址I间Q而且也复制该DLL的全局数据的一份拷贝到该进E空间。也是说每个进E所拥有的相同的DLL的全局数据Q它们的名称相同Q但其值却q不一定是相同的,而且是互不干涉的?br>  因此Q在Win32环境下要惛_多个q程中共享数据,必进行必要的讄。在讉K同一个Dll的各q程 之间׃n存储器是通过存储器映文件技术实现的。也可以把这些需要共享的数据分离出来Q放|在一个独立的数据D里Qƈ把该D늚属性设|ؓ׃n。必ȝq些 变量赋初|否则~译器会把没有赋初始值的变量攑֜一个叫未被初始化的数据D中?br>  #pragma data_seg预处理指令用于设|共享数据段。例如:
  #pragma data_seg("SharedDataName")
  HHOOK hHook=NULL;
  #pragma data_seg()
  ?pragma data_seg("SharedDataName")?pragma data_seg()之间的所有变量将被访问该Dll的所有进E看到和׃n。再加上一条指?pragma comment(linker,"/section:.SharedDataName,rws"),那么q个数据节中的数据可以在所有DLL的实例之间共 享。所有对q些数据的操作都针对同一个实例的Q而不是在每个q程的地址I间中都有一份?br>  当进E隐式或昑ּ调用一个动态库里的函数Ӟpȝ都要把这个动态库映射到这个进E的虚拟地址I间?以下U?地址I间")。这使得DLL成ؓq程的一部分Q以q个q程的n份执行,使用q个q程的堆栈?br>  4、系l钩子与U程钩子Q?br>  SetWindowsHookEx()函数的最后一个参数决定了此钩子是pȝ钩子q是U程钩子?br>  U程勑֭用于监视指定U程的事件消息。线E勾子一般在当前U程或者当前线E派生的U程内?br>  pȝ勑֭监视pȝ中的所有线E的事g消息。因为系l勾子会影响pȝ中所有的应用E序Q所以勾子函数必L在独立的动态链接库(DLL) 中。系l自动将包含"钩子回调函数"的DLL映射到受钩子函数影响的所有进E的地址I间中,卛_q个DLL注入了那些进E?br>  几点说明Q?br>  Q?Q如果对于同一事gQ如鼠标消息Q既安装了线E勾子又安装了系l勾子,那么pȝ会自动先调用U程勑֭Q然后调用系l勾子?br>  Q?Q对同一事g消息可安装多个勾子处理过E,q些勑֭处理q程形成了勾子链。当前勾子处理结束后应把勑֭信息传递给下一个勾子函数?br>  Q?Q勾子特别是pȝ勑֭会消耗消息处理时_降低pȝ性能。只有在必要的时候才安装勑֭Q在使用完毕后要及时卸蝲?/p>



漂漂 2011-01-24 15:30 发表评论
]]>
l典~程书籍QC++, |络, Windows, LinuxQ?- [技术]http://www.shnenglu.com/AutomateProgram/archive/2010/09/05/125934.html漂漂漂漂Sun, 05 Sep 2010 05:28:00 GMThttp://www.shnenglu.com/AutomateProgram/archive/2010/09/05/125934.htmlhttp://www.shnenglu.com/AutomateProgram/comments/125934.htmlhttp://www.shnenglu.com/AutomateProgram/archive/2010/09/05/125934.html#Feedback0http://www.shnenglu.com/AutomateProgram/comments/commentRss/125934.htmlhttp://www.shnenglu.com/AutomateProgram/services/trackbacks/125934.html原文地址Q?a >http://bobbycalf.blogbus.com/logs/2463095.html

两年前就l自己列Z一个读书清单,但进展缓慢,看的l典书籍仍然寥寥可数Q惭愧中......
现在这个书单重C改,一斚w鞭策自己学习Q另一斚w也表辑֯大牛们有如滔滔江水般的敬C意?
书单中列丄都是相关领域的经怹c,必读之作。此书单的编辑参考了很多|站Q包括一些名家的推荐Q例如侯P孟岩Q荣耀Q潘爱民{等Q在此也向这些前辈表C感谢。^_^

1、C++ Language
------------------------------

Bjarne Stroustrup. The C++ Programming Language (Special 3rd Edition)
《C++E序设计语言Q特别版Q?

Bjarne Stroustrup. The Design and Evolution of C++
《C++语言的设计和演化?

Stanley B.Lippman, Josée LaJoie, Barbara E.Moo. C++ Primer (4th Edition)
《C++ Primer中文版(W?版)?

Scott Meyers, Effective C++ (3rd Edition)
《Effective C++中文版(W三版)?

Scott Meyers, More Effective C++
《More Effective C++中文版?

Herb Sutter, Exceptional C++
《Exceptional C++中文版?

Herb Sutter, More Exceptional C++
《More Exceptional C++中文版?

Nicolai M. Josuttis, The C++ Standard Library: A Tutorial and Reference
《C++标准E序库:自修教程与参考手册?

Scott Meyers, Effective STL

Brian W.Kernighan, The Prictice of Programming
《程序设计实c?

Steve McConnell, Code Complete , 2nd Edition
《代码大全(W二版)?

Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Design Patterns: Elements of Reusable Object-Oriented software
《设计模式:可复用面向对象Y件的基础?

John Lakos, Large-Scale C++ Software Design
《大规模C++E序设计?


2、网l编E?
------------------------------

Richard Stevens, TCP/IP Illustrated, Vol.1 / Vol.2 / Vol.3
《TCP/IP详解》(三卷Q?

Richard Stevens, Bill Fenner, Andrew M. Rudoff.
Unix Network Programming, Vol. 1: The Sockets Networking API, Third Edition
《UNIX|络~程?

Jon C. Snader, Effective TCP/IP Programming
《高UTCP/IP~程?

Douglas Schmidt, Steven HustonQC++ Network Programming, Vol.1 / Vol.2
《C++|络~程 ?Q运用ACE和模式消除复杂性?
《C++|络~程,?Q基于ACE和框架的pȝ化复用?

Anthony Jones, Jim Ohlund. Network Programming for Microsoft Windows
《Windows|络~程Q第2版)?

非常详尽的TCP/IP资源介绍Q?
Uri's TCP/IP Resources List: http://www.private.org.il/tcpip_rl.html


3、Windows
------------------------------

Mark E. Russinovich, David A. Solomon.
Microsoft Windows Internals, Fourth Edition

Charles Petzold, Programming Windows (Fifth Edition)
《WINDOWSE序设计Q第5版)?

Jeffrey Richter, Programming Applications for Microsoft Windows Fourth Edition
《WINDOWS核心~程?

Jim Beveridge, Robert Wiener. Multithreading Applications in Win32
《WIN32多线E程序设计?

侯捷, 《深入浅出MFC?

George Shepherd, David Kruglinski. Programming with Microsoft Visual C++ .NET, Sixth Edition
《Visual C++ .NET技术内q(W?版)?

Jeff Prosise, Programming Windows with MFC Second Edition
《MFC WindowsE序设计Q第2版)?

Jeffrey Richter, Applied Microsoft .NET Framework Programming
《Microsoft .NET框架E序设计Q修订版Q?

John Robbins, Debugging Applications for Microsoft .NET and Microsoft Windows
《Microsoft .NET和Windows应用E序调试?

Chris Cant, Writing Windows WDM Device Drivers
《Windows WDM讑֤驱动E序开发指南?


4、Linux
------------------------------

Richard Stevens, Advanced Programming in the UNIX Environment
《UNIX环境高~程?

Richard Stevens, Bill Fenner, Andrew M. Rudoff.
Unix Network Programming, Vol. 1: The Sockets Networking API, Third Edition
《UNIX|络~程?

John Lions, Lion'Cornmentary on UNIX 6th Edition With Source Code
《莱昂氏UNIX源代码分析?

Robert Love, Linux Kernel Development, 2nd Edition
《Linux内核设计与实玎ͼW?版)?

Daniel Pierre Bovet, Marco Cesati. Understanding the Linux Kernel, 3rd Edition
《深入理解Linux内核Q第三版Q?

Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman. Linux Device Drivers, 3rd Edition
《LINUX讑֤驱动E序Q第三版Q?

Marshall Kirk McKusick, Keith Bostic, Michael J. Karels and John S. Quarterman.
The Design and Implementation of the 4.4 BSD Operating System
?.4BSD操作pȝ设计与实现?

毛d? 胡希? 《Linux内核源代码情景分析?


5、Others
------------------------------

Donald E.Knuth, Art of Computer Programming, Volume 1-3
《计机E序设计艺术》(三卷Q?

Thomas H.Cormen Charles E.Leiserson Ronald L.Rivest Clifford Stein.
Introduction to Algorithms, Second Edition
《算法导论(W二版)?

Bruce Schneier, Applied Cryptography
《应用密码学?

漂漂 2010-09-05 13:28 发表评论
]]>
unicode、utf-8、ansi的故?/title><link>http://www.shnenglu.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.shnenglu.com/AutomateProgram/archive/2010/03/26/110567.html</guid><wfw:comment>http://www.shnenglu.com/AutomateProgram/comments/110567.html</wfw:comment><comments>http://www.shnenglu.com/AutomateProgram/archive/2010/03/26/110567.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/AutomateProgram/comments/commentRss/110567.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/AutomateProgram/services/trackbacks/110567.html</trackback:ping><description><![CDATA[<p>原文地址Q?a ?br>再后来,他们又做了一些可以处理这些字节的机器Q机器开动了Q可以用字节来组合出很多状态,状态开始变来变厅R他们看到这h好的Q于是它们就q机器称?计算??br>开始计机只在国用。八位的字节一共可以组合出256(2?ơ方)U不同的状态?br>他们把其中的~号?开始的32U状态分别规定了Ҏ的用途,一但终端、打印机遇上U定好的q些字节被传q来Ӟp做一些约定的动作。遇?0x10, l端换行,遇上0x07, l端向Z嘟嘟叫,例好遇上0x1b, 打印机就打印反白的字Q或者终端就用彩色显C字母。他们看到这样很好,于是把q些0x20以下的字节状态称?控制??br>他们又把所有的I格、标点符受数字、大写字母分别用连l的字节状态表C,一直编CW?27Pq样计算机就可以用不同字节来存储p的文字了。大家看到这P都感觉很好,于是大家都把q个Ҏ叫做 ANSI ?Ascii"~码QAmerican Standard Code for Information InterchangeQ美国信息互换标准代码)。当时世界上所有的计算机都用同LASCIIҎ来保存英文文字?br>后来Q就像徏造巴比u塔一P世界各地的都开始用计机Q但是很多国家用的不是英文,他们的字母里有许多是ASCII里没有的Qؓ了可以在计算Z存他们的文字Q他们决定采?127号之后的IZ来表C些新的字母、符Pq加入了很多画表格时需要用下到的横Uѝ竖Uѝ交叉等形状Q一直把序号~到了最后一个状?55。从128 ?55q一늚字符集被U?扩展字符?。从此之后,贪婪的hcd没有新的状态可以用了,帝国主义可能没有想到还有第三世界国家的Z也希望可以用到计机吧!<br>{中国h们得到计机Ӟ已经没有可以利用的字节状态来表示汉字Q况且有6000多个常用汉字需要保存呢。但是这难不倒智慧的中国人民Q我们不客气地把那些127号之后的奇异W号们直接取消掉, 规定Q一个小?27的字W的意义与原来相同,但两个大?27的字W连在一hQ就表示一个汉字,前面的一个字节(他称之ؓ高字节)?xA1用到 0xF7Q后面一个字节(低字节)?xA1?xFEQ这h们就可以l合出大U?000多个体汉字了。在q些~码里,我们q把数学W号、罗马希腊的字母、日文的假名们都~进MQ连?ASCII 里本来就有的数字、标炏V字母都l统重新~了两个字节长的~码Q这是常说?全角"字符Q而原来在127号以下的那些叫"半角"字符了?br>中国人民看到q样很不错,于是把q种汉字Ҏ叫做 "GB2312"。GB2312 是对 ASCII 的中文扩展?br>但是中国的汉字太多了Q我们很快就发现有许多人的人名没有办法在这里打出来Q特别是某些很会ȝ别h的国安gh。于是我们不得不l箋?GB2312 没有用到的码位找出来老实不客气地用上?br>后来q是不够用,于是q脆不再要求低字节一定是127号之后的内码Q只要第一个字节是大于127固定表C是一个汉字的开始,不管后面跟的是不是扩展字W集里的内容。结果扩展之后的~码Ҏ被称?GBK 标准QGBK 包括?GB2312 的所有内容,同时又增加了q?0000个新的汉字(包括J体字)和符受?br>后来数民族也要用电脑了Q于是我们再扩展Q又加了几千个新的少数民族的字,GBK 扩成?GB18030。从此之后,中华民族的文化就可以在计机时代中传承了?br>中国的程序员们看到这一pd汉字~码的标准是好的Q于是通称他们叫做 "DBCS"QDouble Byte Charecter Set 双字节字W集Q。在DBCSpd标准里,最大的特点是两字节长的汉字字符和一字节长的英文字符q存于同一套编码方案里Q因此他们写的程序ؓ了支持中文处理,必须要注意字串里的每一个字节的|如果q个值是大于127的,那么pZ个双字节字符集里的字W出C。那时候凡是受q加持,会编E的计算机僧侣们都要每天念下面这个咒语数NQ?br>"一个汉字算两个英文字符Q一个汉字算两个英文字符……"<br>因ؓ当时各个国家都像中国q样搞出一套自q~码标准Q结果互怹间谁也不懂谁的编码,谁也不支持别人的~码Q连大陆和台湾这样只盔R?50里Q用着同一U语a的兄弟地区,也分别采用了不同?DBCS ~码Ҏ——当时的中国人想让电脑显C汉字,必装上一?汉字pȝ"Q专门用来处理汉字的昄、输入的问题Q但是那个台湄愚昧徏人士写的命E序必d装另一套支?BIG5 ~码的什?倚天汉字pȝ"才可以用Q装错了字符pȝQ显C就会ؕ了套Q这怎么办?而且世界民族之林中还有那些一时用不上电脑的穷苦h民,他们的文字又怎么办?<br>真是计算机的巴比伦塔命题啊!<br>正在q时Q大天加百列及时出C——一个叫 ISO Q国际标谁化l织Q的国际l织军_着手解册个问题。他们采用的Ҏ很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和W号的编码!他们打算叫它"Universal Multiple-Octet Coded Character Set"Q简U?UCS, 俗称 "UNICODE"?br>UNICODE 开始制订时Q计机的存储器定w极大地发展了Q空间再也不成ؓ问题了。于?ISO q接规定必ȝ两个字节Q也是16位来l一表示所有的字符Q对于ascii里的那些“半角”字符QUNICODE 包持其原~码不变Q只是将光度由原来?位扩展ؓ16位,而其他文化和语言的字W则全部重新l一~码。由?半角"英文W号只需要用C8位,所以其?8位永q是0Q因此这U大气的Ҏ在保存英文文本时会多费一倍的I间?br>q时候,从旧C会里走q来的程序员开始发C个奇怪的现象Q他们的 strlen函数靠不住了Q一个汉字不再是相当于两个字W了Q而是一个!是的Q从 UNICODE 开始,无论是半角的英文字母Q还是全角的汉字Q它们都是统一?一个字W?Q同Ӟ也都是统一?两个字节"Q请注意"字符"?字节"两个术语的不同, “字节”是一?位的物理存贮单元Q?#8220;字符”则是一个文化相关的W号。在UNICODE 中,一个字W就是两个字节。一个汉字算两个英文字符的时代已l快q去了?br>从前多种字符集存在时Q那些做多语a软g的公叔R上过很大ȝQ他们ؓ了在不同的国安售同一套YӞ׃得不在区域化软g时也加持那个双字节字W集咒语Q不仅要处处心不要搞错Q还要把软g中的文字在不同的字符集中转来转去。UNICODE 对于他们来说是一个很好的一揽子解决ҎQ于是从 Windows NT 开始,MS 机把它们的操作pȝ改了一遍,把所有的核心代码都改成了?UNICODE 方式工作的版本,从这时开始,WINDOWS pȝl于无需要加装各U本土语apȝQ就可以昄全世界上所有文化的字符了?br>但是QUNICODE 在制订时没有考虑与Q何一U现有的~码Ҏ保持兼容Q这使得 GBK 与UNICODE 在汉字的内码~排上完全是不一LQ没有一U简单的术Ҏ可以把文本内容从UNICODE~码和另一U编码进行{换,q种转换必须通过查表来进行?br>如前所qͼUNICODE 是用两个字节来表CZؓ一个字W,他d可以l合?5535不同的字W,q大概已l可以覆盖世界上所有文化的W号。如果还不够也没有关p,ISO已经准备了UCS-4ҎQ说单了是四个字节来表CZ个字W,q样我们可以组合出21亿个不同的字W出来(最高位有其他用途)Q这大概可以用到银河联邦成立那一天吧Q?br>UNICODE 来到Ӟ一起到来的q有计算机网l的兴vQUNICODE 如何在网l上传输也是一个必考虑的问题,于是面向传输的众?UTFQUCS Transfer formatQ标准出CQ顾名思义QUTF8是每次8个位传输数据Q而UTF16是每次16个位Q只不过Z传输时的可靠性,从UNICODE?UTF时ƈ不是直接的对应,而是要过一些算法和规则来{换?br>受到q网l编E加持的计算机僧侣们都知道,在网l里传递信息时有一个很重要的问题,是对于数据高低位的解读方式Q一些计机是采用低位先发送的ҎQ例如我们PC机采用的 INTEL 架构Q而另一些是采用高位先发送的方式Q在|络中交换数据时Qؓ了核对双方对于高低位的认识是否是一致的Q采用了一U很便的ҎQ就是在文本的开始时向对方发送一个标志符——如果之后的文本是高位在位,那就发?FEFF"Q反之,则发?FFFE"。不信你可以用二q制方式打开一个UTF-X格式的文Ӟ看看开头两个字节是不是q两个字节?<br>讲到q里Q我们再Z说说一个很著名的奇怪现象:当你?windows 的记事本里新Z个文Ӟ输入"联?两个字之后,保存Q关闭,然后再次打开Q你会发现这两个字已l消׃Q代之的是几个ؕ码!呵呵Q有q就是联通之所以拼不过Ud的原因?br>其实q是因ؓGB2312~码与UTF8~码产生了编码冲撞的原因?br>从网上引来一D从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~码?C49?C49?800-FFFF之间Q所以要?字节模板Q?110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是Q?110 1100 0100 1001Q将q个比特按三字节模板的分段Ҏ分ؓ0110 110001 001001Q依ơ代替模板中的xQ得刎ͼ1110-0110 10-110001 10-001001Q即E6 B1 89Q这是其UTF8的编码?br>而当你新Z个文本文件时Q记事本的编码默认是ANSI, 如果你在ANSI的编码输入汉字,那么他实际就是GBpd的编码方式,在这U编码下Q?联?的内码是Q?br>c1 1100 0001<br>aa 1010 1010<br>cd 1100 1101<br>a8 1010 1000<br>注意C吗?W一二个字节、第三四个字节的起始部分的都?110"?10"Q正好与UTF8规则里的两字节模板是一致的Q于是再ơ打开C本时Q记事本p认ؓq是一个UTF8~码的文Ӟ让我们把W一个字节的110和第二个字节?0LQ我们就得到?00001 101010"Q再把各位对齐,补上前导?Q就得到?0000 0000 0110 1010"Q不好意思,q是UNICODE?06AQ也是写的字?j"Q而之后的两字节用UTF8解码之后?368Q这个字W什么也不是。这是只有"联?两个字的文g没有办法在记事本里正常显C的原因?br>而如果你?联?之后多输入几个字Q其他的字的~码不见得又恰好?10?0开始的字节Q这样再ơ打开ӞC本就不会坚持q是一个utf8~码的文Ӟ而会用ANSI的方式解MQ这时ؕ码又不出C?br><br>ps: 在这里我们测试一下,在记事本中徏立三U编码的文本QunicodeQutf-8QAscii 在文本中写下 “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>q里分析一下:ascii中开头没有表CZQ直截了当来?Qunicode下的表示位是FF FE UTF-8下是表示位EF BB<br>UTF-8下用三个字节来表CZ个汉字,unicode下每个字都占用两个字?br>不重复的标志应该是开头的字数?br></p> <p>怺转换Q?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字符串我们最熟悉Q英文占一个字节,汉字2个字节,以一个\0l尾Q常用于txt文本文g<br>Unicode字符Ԍ每个字符(汉字、英文字?都占2个字节,?个连l的\0l尾QNT<span id="dl5fxjt" class=t_tag onclick=tagshow(event) href="tag.php?name=%B2%D9%D7%F7%CF%B5%CD%B3">操作pȝ</span>内核用的是这U字W串Q常被定义ؓtypedef unsigned short wchar_t;所以我们有时常会见C么char*无法转换为unsigned short*之类的错误,其实是unicode<br>UTF8?Unicode一U压~Ş式,英文A在unicode中表CZؓ0x0041Q老外觉得q种存储方式太浪费,因ؓ费?0%的空_于是把英文压羃? 个字节,成了utf8~码Q但是汉字在utf8中占3个字节,昄用做中文不如ansi合算Q这是中国的网는作ansi~码而老外的网常用utf8 的原因?br>UTF8在还游戏里运用的很广泛,比如WOW的lua脚本{?br><br>下面来说一下{换,主要用代码来说明?br><br>写文件我用了CFilec,其实用FILE*之类的也是一P写文件和字符串什么类别没有关p,g只关心数据和长度<br><br>Ansi转Unicode<br><br>介绍2U方?</p> <div id="rfthfnv" class=blockcode> <div class="1n5rpvl" id=code0> <ol> <li>void CConvertDlg::OnBnClickedButtonAnsiToUnicode()<br> <li>{<br> <li>    // ansi to unicode<br> <li>    char* szAnsi = "abcd1234你我?;<br> <li>    //预{换,得到所需I间的大?br> <li>    int wcsLen = ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), NULL, 0);<br> <li>    //分配I间要给'\0'留个I间QMultiByteToWideChar不会l?\0'I间<br> <li>    wchar_t* wszString = new wchar_t[wcsLen + 1];<br> <li>    //转换<br> <li>    ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), wszString, wcsLen);<br> <li>    //最后加?\0'<br> <li>    wszString[wcsLen] = '\0';<br> <li>    //unicode版的MessageBox API<br> <li>    ::MessageBoxW(GetSafeHwnd(), wszString, wszString, MB_OK);<br> <li><br> <li>    //接下来写入文?br> <li>    //写文本文Ӟ?个字?xfeffQ低?xff写在?br> <li>    CFile cFile;<br> <li>    cFile.Open(_T("1.txt"), CFile::modeWrite | CFile::modeCreate);<br> <li>    //文g开?br> <li>    cFile.SeekToBegin();<br> <li>    cFile.Write("\xff\xfe", 2);<br> <li>    //写入内容<br> <li>    cFile.Write(wszString, wcsLen * sizeof(wchar_t));<br> <li>    cFile.Flush();<br> <li>    cFile.Close();<br> <li>    delete[] wszString;<br> <li>    wszString =NULL;<br> <li><br> <li><br> <li>    //Ҏ2<br> <li>    //讄当前地域信息Q不讄的话Q用这U方法,中文不会正确昄<br> <li>    //需?include<locale.h><br> <li>    setlocale(LC_CTYPE, "chs"); <br> <li>    wchar_t wcsStr[100];<br> <li>    //注意下面是大写SQ在unicode中,代表后面是ansi字符?br> <li>    //swprintf是sprintf的unicode版本<br> <li>    //格式的前面要加大写LQ代表是unicode<br> <li>    swprintf(wcsStr, L"%S", szAnsi);<br> <li>    ::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>也是2U方?</p> <div id="1z3pnnv" class=blockcode> <div class="zv33dtl" id=code1> <ol> <li>void CConvertDlg::OnBnClickedButtonUnicodeToAnsi()<br> <li>{<br> <li>    // unicode to ansi<br> <li>    wchar_t* wszString = L"abcd1234你我?;<br> <li>    //预{换,得到所需I间的大,q次用的函数和上面名字相?br> <li>    int ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, wszString, wcslen(wszString), NULL, 0, NULL, NULL);<br> <li>    //同上Q分配空间要l?\0'留个I间<br> <li>    char* szAnsi = new char[ansiLen + 1];<br> <li>    //转换<br> <li>    //unicode版对应的strlen是wcslen<br> <li>    ::WideCharToMultiByte(CP_ACP, NULL, wszString, wcslen(wszString), szAnsi, ansiLen, NULL, NULL);<br> <li>    //最后加?\0'<br> <li>    szAnsi[ansiLen] = '\0';<br> <li>    //Ansi版的MessageBox API<br> <li>    ::MessageBoxA(GetSafeHwnd(), szAnsi, szAnsi, MB_OK);<br> <li><br> <li>    //接下来写入文?br> <li>    //写文本文ӞANSI文g没有BOM<br> <li>    CFile cFile;<br> <li>    cFile.Open(_T("1.txt"), CFile::modeWrite | CFile::modeCreate);<br> <li>    //文g开?br> <li>    cFile.SeekToBegin();<br> <li>    //写入内容<br> <li>    cFile.Write(szAnsi, ansiLen * sizeof(char));<br> <li>    cFile.Flush();<br> <li>    cFile.Close();<br> <li>    delete[] szAnsi;<br> <li>    szAnsi =NULL;<br> <li><br> <li><br> <li>    //Ҏ2<br> <li>    //和上面一h另一U方?br> <li>    setlocale(LC_CTYPE, "chs"); <br> <li>    char szStr[100];<br> <li>    //注意下面是大写,在ansi中,代表后面是unicode字符?br> <li>    //sprintf<br> <li>    sprintf(szStr, "%S", wszString);<br> <li>    ::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 id="n3l35d5" class=blockcode> <div class="p1ntrxx" id=code2> <ol> <li>void CConvertDlg::OnBnClickedButtonUnicodeToU8()<br> <li>{<br> <li>    // unicode to UTF8<br> <li>    wchar_t* wszString = L"abcd1234你我?;<br> <li>    //预{换,得到所需I间的大,q次用的函数和上面名字相?br> <li>    int u8Len = ::WideCharToMultiByte(CP_UTF8, NULL, wszString, wcslen(wszString), NULL, 0, NULL, NULL);<br> <li>    //同上Q分配空间要l?\0'留个I间<br> <li>    //UTF8虽然是Unicode的压~Ş式,但也是多字节字符Ԍ所以可以以char的Ş式保?br> <li>    char* szU8 = new char[u8Len + 1];<br> <li>    //转换<br> <li>    //unicode版对应的strlen是wcslen<br> <li>    ::WideCharToMultiByte(CP_UTF8, NULL, wszString, wcslen(wszString), szU8, u8Len, NULL, NULL);<br> <li>    //最后加?\0'<br> <li>    szU8[u8Len] = '\0';<br> <li>    //MessageBox不支持UTF8,所以只能写文g<br> <li><br> <li>    //接下来写入文?br> <li>    //写文本文ӞUTF8的BOM?xbfbbef<br> <li>    CFile cFile;<br> <li>    cFile.Open(_T("1.txt"), CFile::modeWrite | CFile::modeCreate);<br> <li>    //文g开?br> <li>    cFile.SeekToBegin();<br> <li>    //写BOMQ同样低位写在前<br> <li>    cFile.Write("\xef\xbb\xbf", 3);<br> <li>    //写入内容<br> <li>    cFile.Write(szU8, u8Len * sizeof(char));<br> <li>    cFile.Flush();<br> <li>    cFile.Close();<br> <li>    delete[] szU8;<br> <li>    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 id="tpnj335" class=blockcode> <div class="f5h5l5d" id=code3> <ol> <li>void CConvertDlg::OnBnClickedButtonU8ToUnicode()<br> <li>{<br> <li>    //UTF8 to Unicode<br> <li>    //׃中文直接复制q来会成qQ编译器有时会报错,故采?6q制形式<br> <li>    char* szU8 = "abcd1234\xe4\xbd\xa0\xe6\x88\x91\xe4\xbb\x96\x00";<br> <li>    //预{换,得到所需I间的大?br> <li>    int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), NULL, 0);<br> <li>    //分配I间要给'\0'留个I间QMultiByteToWideChar不会l?\0'I间<br> <li>    wchar_t* wszString = new wchar_t[wcsLen + 1];<br> <li>    //转换<br> <li>    ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), wszString, wcsLen);<br> <li>    //最后加?\0'<br> <li>    wszString[wcsLen] = '\0';<br> <li>    //unicode版的MessageBox API<br> <li>    ::MessageBoxW(GetSafeHwnd(), wszString, wszString, MB_OK);<br> <li><br> <li>    //写文本同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个的l合Q把unicode作ؓ中间量,q行2ơ{换即?/p> <img src ="http://www.shnenglu.com/AutomateProgram/aggbug/110567.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-26 09:13 <a href="http://www.shnenglu.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的来源及意义http://www.shnenglu.com/AutomateProgram/archive/2010/03/26/110566.html漂漂漂漂Fri, 26 Mar 2010 01:01:00 GMThttp://www.shnenglu.com/AutomateProgram/archive/2010/03/26/110566.htmlhttp://www.shnenglu.com/AutomateProgram/comments/110566.htmlhttp://www.shnenglu.com/AutomateProgram/archive/2010/03/26/110566.html#Feedback0http://www.shnenglu.com/AutomateProgram/comments/commentRss/110566.htmlhttp://www.shnenglu.com/AutomateProgram/services/trackbacks/110566.htmlhttp://yizhiqiang.blog.51cto.com/917774/197859

UNICODEQ它是用两个字节表示一个字W的Ҏ。比如字W?A'在ASCII下面是一个字W,?A'在UNICODE下面是两个字W?高字W用0填充Q而且汉字'E?在ASCII下面是两个字节,而在UNICODE下仍旧是两个字节。UNICODE的用处就是定长表CZ界文字,据统计,用两个字节可以编码现存的所有文字而没有二义?/div>
MBCSQ它是多字节字符集,它是不定长表CZ界文字的~码。MBCS表示英文字母时就和ASCII一Pq也是我们容易把MBCS和ASCII搞؜的原因)Q但表示其他文字时就需要用多字节?nbsp;
WINDOWS下面的程序设计可以支持MBCS和UNICODE两种~码的字W串Q具体用那种q你定义了MBCS宏还是UNICODE宏。MBCS宏对应的字符串指针是char*也就是LPSTRQUNICODE对应的指针是unsigned   short*也就是LPWSTRQؓ了写E序方便微Y定义了类型LPTSTRQ在MBCS下他是char*,   在UNICODE下它是unsigned   char*,q样你就可以重定义一个宏q行不同字符集的转换了?/div>
 
LPTSTR、LPCSTR、LPCTSTR、LPSTR的意义:
 
LPSTRQ?2bit指针 指向一个字W串Q每个字W占1字节
LPCSTR:32-bit指针 指向一个常字符Ԍ每个字符?字节
LPCTSTR:32-bit指针 指向一个常字符?每字W可能占1字节?字节Q取决于Unicode是否定义
LPTSTR:32-bit指针 每字W可能占1字节?字节Q取决于Unicode是否定义
 
Windows使用两种字符集ANSI和UNICODEQ前者就是通常使用的单字节方式Q但q种方式处理象中文这L双字节字W不方便Q容易出现半个汉字的情况。而后者是双字节方式,方便处理双字节字W?/div>
      
WindowsNT的所有与字符有关的函数都提供两种方式的版本,而Windows9x只支持ANSI方式。_T一般同字常数相养I如_T("Hello"。如果你~译一个程序ؓANSI方式Q_T实际不vM作用。而如果编译一个程序ؓUNICODE方式Q则~译器会?Hello"字符串以UNICODE方式保存。_T和_L的区别在于,_L不管你是以什么方式编译,一律UNICODE方式保存.
 
Windows核心~程的第一章?/div>
L是表C字W串资源为Unicode的?/div>
比如Qwchar_t Str[] = L"Hello World!";q个是双子节存储字W了?/div>
 
_T是一个适配的宏?/div>
?#ifdef _UNICODE的时?_T是LQ没?ifdef _UNICODE的时候_T是ANSI的?/div>
比如QLPTSTR lpStr = new TCHAR[32];
TCHAR* szBuf = _T("Hello");
以上两句使得无论是在UNICODE~译条g下都是正编译的?/div>
 
而且MS推荐你用相匚w的字W串函数。比如处理LPTSTR或者LPCTSTR 的时候,不要用strlen ,而是要用_tcslenQ否则在UNICODE的编译条件下Qstrlen不能处理 wchar_t*的字W串?/div>
 
T是非常有意思的一个符PTCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()...Q,它表CZ用一U中间类型,既不明确表示使用 MBCSQ也不明表CZ?UNICODE。那到底使用哪种字符?~译的时候才军_
在vc++中有着各种字符串的表示法,如您所说?nbsp;       
 
首先char*   是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其?位)Q这里保持了与传l的C,C++的兼宏V?nbsp;     
 
LP的含义是长指?long   pointer)?/div>
 
LPSTR是一个指向以‘\0’l尾的ANSI字符数组的指针,与char*可以互换使用Q在win32中较多地使用LPSTR。而LPCSTR中增加的‘C’的含义是“CONSTANT”Q常量)Q表明这U数据类型的实例不能被用它的API函数改变Q除此之外,它与LPSTR是等同的?nbsp;   
 
    Z满E序代码国际化的需要,业界推出了Unicode标准Q它提供了一U简单和一致的表达字符串的ҎQ所有字W中的字节都?6位的|其数量也可以满差不多世界上所有书面语a字符的编码需求,开发程序时使用UnicodeQ类型ؓwchar_t)是一U被鼓励的做法?nbsp;   
 
    LPWSTR与LPCWSTR由此产生Q它们的含义cM于LPSTR与LPCSTRQ只是字W数据是16位的wchar_t而不是char?nbsp;      
 
      然后Z实现两种~码的通用Q提ZTCHAR的定义:   
如果定义_UNICODEQ声明如下:     typedef   wchar_t   TCHAR;    
如果没有定义_UNICODEQ则声明如下Q?nbsp;    typedef   char   TCHAR;     
 
LPTSTR和LPCTSTR中的含义是每个字符是这LTCHAR?nbsp;      
CStringcM的字W就是被声明为TCHARcd的,它提供了一个封装好的类供用h便地使用?/div>
 
 
LPTSTR、LPCSTR、LPCTSTR、LPSTR之间的{换:
如何理解LPCTSTRcdQ?
 
L表示long指针
q是Z兼容Windows 3.1{?6位操作系l遗留下来的Q在win32中以及其他的32为操作系l中Q?long指针和near指针及far修饰W都是ؓ了兼容的作用。没有实际意义?/div>
P表示q是一个指?/div>
C表示是一个常?/div>
T表示在Win32环境中, 有一个_T?/div>
q个宏用来表CZ的字W是否用UNICODE, 如果你的E序定义了UNICODE或者其他相关的宏,那么q个字符或者字W串被作ؓUNICODE字符Ԍ否则是标准的ANSI字符丌Ӏ?/div>
STR表示q个变量是一个字W串
所以LPCTSTRpCZ个指向常固定地址的可以根据一些宏定义改变语义的字W串。同P LPCSTR只能是一个ANSI字符Ԍ在程序中我们大部分时间要使用带T的类型定义?/div>
LPCTSTR == const TCHAR *
CString ?LPCTSTR 可以说通用?原因在于CString定义的自动类型{换,没什么奇特的Q最单的C++操作W重载而已?
 
帔R字符串ansi和unicode的区分是由宏_T来决定的。但是用_T("abcd")Ӟ 字符?abcd"׃Ҏ~译时的是否定一_UNICODE来决定是char* q是 w_char*?同样QTCHAR 也是相同目的字符宏?看看定义明白了。简单v见,下面只介l?ansi 的情况,unicode 可以cL?
ansi情况下,LPCTSTR 是 const char*, 是常量字W串Q不能修改的Q?
而LPTSTR 是 char*, x通字W串Q非帔RQ可修改的)?
q两U都是基本类型, 而CString ?C++c, 兼容q两U基本类型是最L的Q务了?
 
׃const char* 最单(帔RQ不涉及内存变更Q操作迅速)Q?CString 直接定义了一个类型{换函?operator LPCTSTR() {......}Q?直接q回他所l护的字W串?
 
当你需要一个const char* 而传入了CStringӞ C++~译器自动调?CString重蝲的操作符 LPCTSTR()来进行隐式的cd转换?
当需要CString , 而传入了 const char* Ӟ其实 char* 也可以)QC++~译器则自动调用CString的构造函数来构造时的 CString对象?
 
因此CString ?LPCTSTR 基本可以通用?
但是 LPTSTR又不同了Q他?char*Q?意味着你随时可能修攚w面的数据Q这需要内存管理了(如字W串变长Q原来的存贮I间׃够了Q则需要重新调整分配内??所?不能随便的将 const char* 强制转换?char* 使用?g丄例子
LPSTR lpstr = (LPSTR)(LPCTSTR)string; 是q种不安全的使用Ҏ?
 
q个地方使用的是强制cd转换Q你都强制{换了QC++~译器当然不会拒l你Q但同时他也认ؓ你确实知道自p做的是什么。因此是不会l出警告的?
强制的Q意类型{换是C(++)的一强大之处,但也是一大弊端。这一问题?vc6 以后的版?仅针对vc而言)中得到逐步的改q?你需要更明确的类型{换声??
 
其实在很多地斚w可以看到cM
LPSTR lpstr = (LPSTR)(LPCTSTR)string;
地用法,q种情况一般是函数的约束定义不够完善的原因Q?比如一个函数接受一个字W串参数的输入,里面对该字符串又没有M的修改,那么该参数就应该定义?const char*Q?但是很多初学者弄不清const地用法,或者是懒, M是随意写成?char* ?q样子传入CString时就需要强制的转换一下?
q种做法是不安全的,也是不被的用法,你必d全明白、确认该字符串没有被修改?
CString 转换?LPTSTR (char*), 预定的做法是调用CString的GetBuffer函数Q用完毕之后一般都要再调用ReleaseBuffer函数来确认修?(某些情况下也有不调用ReleaseBuffer的,同样你需要非常明ؓ什么这么做时才能这样子处理Q一般应用环境可以不考虑q种情况)?
同时需要注意的是, 在GetBuffer ?ReleaseBuffer之间QCString分配了内存交׃来处理,因此不能再调用其他的CString函数?/div>
CString 转LPCTSTR:
CString cStr;
const char *lpctStr=(LPCTSTR)cStr;
 
LPCTSTR转CString:
LPCTSTR lpctStr;
CString cStr=lpctStr;

互{Q?br>原文地址Q?a >http://yinengsoft.blog.163.com/blog/static/45958957200952341510414/

/* LPTSTR 转换?CString */

(1)直接赋?br>CString strText;
LPTSTR lpszText = _T("LPTSTR >> CString");
strText = lpszText;
::MessageBox( NULL, strText , _T("标题"), MB_ICONASTERISK|MB_TASKMODAL|MB_OK );

(2)CString::Format()格式?br>CString strText;
LPTSTR lpszText = _T("LPTSTR >> CString");
strText.Format( _T("%s"), lpszText );
::MessageBox( NULL, strText , _T("标题"), MB_ICONASTERISK|MB_TASKMODAL|MB_OK );

/* CString 转换?LPTSTR */

(1)强制转换
CString strText( _T("This is a test") );
LPTSTR lpszText =(LPTSTR)(LPCTSTR)strText;
::MessageBox( NULL, lpszText, _T("标题"), MB_ICONASTERISK|MB_TASKMODAL|MB_OK );

(2)使用lstrcpy()
CString strText( "This is a test" );
LPTSTR lpszText = new TCHAR[strText.GetLength()+1];
lstrcpy( lpszText, strText );
::MessageBox( NULL, lpszText, _T("标题"), MB_ICONASTERISK|MB_TASKMODAL|MB_OK );

(3)使用CString::GetBuffer()
CString strText(_T("This is a test "));
LPTSTR lpszText = strText.GetBuffer();
strText.ReleaseBuffer();
::MessageBox( NULL, lpszText, _T("标题"), MB_ICONASTERISK|MB_TASKMODAL|MB_OK );

TRACE:http://hcorecore.blog.163.com/blog/static/79664102200931811428906/



漂漂 2010-03-26 09:01 发表评论
]]>获取“我的文档”\?/title><link>http://www.shnenglu.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.shnenglu.com/AutomateProgram/archive/2009/05/22/85356.html</guid><wfw:comment>http://www.shnenglu.com/AutomateProgram/comments/85356.html</wfw:comment><comments>http://www.shnenglu.com/AutomateProgram/archive/2009/05/22/85356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/AutomateProgram/comments/commentRss/85356.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/AutomateProgram/services/trackbacks/85356.html</trackback:ping><description><![CDATA[很多时?#8220;我的文档”位置l常被hUdD盘,如下是获?#8220;我的文档”路径Q? <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.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include </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.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">windows.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">shlobj.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>#pragma comment( lib, </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.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> 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.shnenglu.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.shnenglu.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.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_152_581_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> 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.shnenglu.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.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>    </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">   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.shnenglu.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">;   <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    memset(m_lpszDefaultDir,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,_MAX_PATH);   <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    LPITEMIDLIST pidl</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NULL;   <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    SHGetSpecialFolderLocation(NULL,   CSIDL_PERSONAL,   </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">pidl);   <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">   (pidl   </span><span style="COLOR: #000000">&&</span><span style="COLOR: #000000">   SHGetPathFromIDList(pidl,   szDocument))   <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.shnenglu.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.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>    </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.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_429_498_Open_Text><span style="COLOR: #000000">{   <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>        GetShortPathName(szDocument,m_lpszDefaultDir,_MAX_PATH);   <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>  }</span></span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    std::cout</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">m_lpszDefaultDir</span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000">std::endl;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello World!\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span></div> 可以使用SHGetSpecialFolderLocation函数获得“我的电脑”所对应的虚拟文件夹的id。然后用ShellExecuteEx打开q个虚拟文g夏V?<br>    使用API函数SHGetSpecialFolderLocation。shlobj.h里有SHGetSpecialFolderLocation的原型声明。这个函数可以帮我们扑ֈWindows的桌面目录、启动目录、我的文档目录等?<br>    SHGetSpecialFolder需要三个参数?W一个参数是HWNDQ它指定?所有者窗?Q在调用q个函数时可能出现的对话框或消息框。第二个参数是一个整数idQ决定哪个目录是待查扄录,它的取值可能是Q?<br>    <!-- !@!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>|上d</td> </tr> <tr> <td>CSIDL_NETWORK</td> <td>|上d虚拟目录</td> </tr> <tr> <td>CSIDL_PERSONAL</td> <td>我的文档</td> </tr> <tr> <td>CSIDL_PRINTERS</td> <td>打印?/td> </tr> <tr> <td>CSIDL_PROGRAMS</td> <td>E序l?/td> </tr> <tr> <td>CSIDL_RECENT</td> <td>最q打开的文?/td> </tr> <tr> <td>CSIDL_SENDTO</td> <td>“发送到”菜单?/td> </tr> <tr> <td>CSIDL_STARTMENU</td> <td>d条启动菜单项</td> </tr> <tr> <td>CSIDL_STARTUP</td> <td>启动目录</td> </tr> <tr> <td>CSIDL_TEMPLATES</td> <td>文档模板</td> </tr> </tbody> </table> <!-- !@!H --><br>    q里只是最常用的部分。完整的请参?a class=a1 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>    最后一个参数是pidl地址。SHGetSpecialFolderLocation把地址写到pidl?<br>    下面是一个例子: <br>    <font face="Courier New" size=2><font color=#000000>LPITEMIDLIST pidl;<font color=#ffffff> <br>    </font>TCHAR szPath [MAX_PATH];<font color=#ffffff> <br>    </font>LPMALLOC pMalloc;<font color=#ffffff> <br>     <br>    </font><font color=#0000ff><strong>if </strong></font>( SUCCEEDED( SHGetSpecialFolderLocation ( NULL, CSIDL_DRIVES, &pidl )))<font color=#ffffff> <br>    </font>{<font color=#ffffff> <br>     </font>SHELLEXECUTEINFO sei;<font color=#ffffff> <br>     </font>ZeroMemory(&sei, <font color=#0000ff><strong>sizeof</strong></font>(sei));<font color=#ffffff> <br>     </font>sei.cbSize = <font color=#0000ff><strong>sizeof</strong></font>(sei);<font color=#ffffff> <br>     </font>sei.fMask = SEE_MASK_IDLIST;<font color=#ffffff> <br>     </font>sei.lpIDList = pidl;<font color=#ffffff> <br>     </font>sei.lpVerb = "open";<font color=#ffffff> <br>     </font>sei.hwnd = AfxGetMainWnd()->GetSafeHwnd();<font color=#ffffff> <br>     </font>sei.nShow = SW_SHOWNORMAL;<font color=#ffffff> <br>     </font>ShellExecuteEx(&sei);<font color=#ffffff> <br>     </font><font color=#0000ff><strong>if </strong></font>( SUCCEEDED( SHGetMalloc ( &pMalloc )))<font color=#ffffff> <br>     </font>{<font color=#ffffff> <br>     </font>pMalloc->Free ( pidl );<font color=#ffffff> <br>     </font>pMalloc->Release();<font color=#ffffff> <br>     </font>}<font color=#ffffff> <br>    </font>} <br>    </font> <br>    ׃“我的电脑”是虚拟文件夹Q所以必M用ShellExecuteEx函数Q如果是普通文件夹Q则可以使用SHGetPathFromIDList获得文g名,然后利用ShellExecute函数打开。例如要打开“发送到”文g夹,可以q样Q?<br>    <font face="Courier New" size=2><font color=#0000ff><strong>if </strong></font>( SUCCEEDED( SHGetSpecialFolderLocation ( NULL, CSIDL_SENDTO, &pidl )))<font color=#ffffff> <br>    </font>{<font color=#ffffff> <br>     </font><font color=#0000ff><strong>if </strong></font>( SHGetPathFromIDList ( pidl, szPath ))<font color=#ffffff> <br>     </font>{<font color=#ffffff> <br>     </font>ShellExecute(AfxGetMainWnd()->GetSafeHwnd(),<font color=#ffffff> <br>     </font>"open", szPath, NULL, NULL,<font color=#ffffff> <br>     </font>SW_SHOWNORMAL);<font color=#ffffff> <br>     </font>}<font color=#ffffff> <br>     <br>     </font><font color=#0000ff><strong>if </strong></font>( SUCCEEDED( SHGetMalloc ( &pMalloc )))<font color=#ffffff> <br>     </font>{<font color=#ffffff> <br>     </font>pMalloc->Free ( pidl );<font color=#ffffff> <br>     </font>pMalloc->Release();<font color=#ffffff> <br>     </font>}<font color=#ffffff> <br>    </font>}<font color=#ffffff> <br>     <br>    </font></font> <br>    如果是虚拟文件夹QSHGetPathFromIDList函数会失败?<br>    对于普通文件夹也可以用SHGetSpecialFolderPath函数Q而不使用SHGetSpecialFolderLocation函数Q这h单些Q但q行环境必须是Windows 2000以后的操作系l或安装了IE 4.0以上版本?<br></font> <img src ="http://www.shnenglu.com/AutomateProgram/aggbug/85356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/AutomateProgram/" target="_blank">漂漂</a> 2009-05-22 11:45 <a href="http://www.shnenglu.com/AutomateProgram/archive/2009/05/22/85356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>注册表的单应?-获取所有安装的软g?/title><link>http://www.shnenglu.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.shnenglu.com/AutomateProgram/archive/2009/05/22/85354.html</guid><wfw:comment>http://www.shnenglu.com/AutomateProgram/comments/85354.html</wfw:comment><comments>http://www.shnenglu.com/AutomateProgram/archive/2009/05/22/85354.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/AutomateProgram/comments/commentRss/85354.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/AutomateProgram/services/trackbacks/85354.html</trackback:ping><description><![CDATA[先给一个注册表操作的封装类Q?br><a href="http://www.shnenglu.com/Files/AutomateProgram/Register.rar">下蝲</a><br>转:<a >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.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">    IS_KEY        _T("Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall")</span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">    IS_KEY_LEN    256</span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> IS_DISPLAY    _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.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Build a list of installed applications by enumerating<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">    HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">    and fetching "DisplayName" entry</span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>        HKEY hKey;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, IS_KEY, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, KEY_READ, </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">hKey) </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> ERROR_SUCCESS)<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>        DWORD dwIndex </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>        LONG lRet;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>        DWORD cbName </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> IS_KEY_LEN;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>        TCHAR szSubKeyName[IS_KEY_LEN];<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>        <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>        </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> ((lRet </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ::RegEnumKeyEx(hKey, dwIndex, szSubKeyName, </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">cbName, NULL,<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>            NULL, NULL, NULL)) </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> 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.shnenglu.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.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>        </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.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_499_1129_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Do we have a key to open?</span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (lRet </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> 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.shnenglu.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.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>            </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.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_566_1087_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Open the key and get the value</span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">                HKEY hItem;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>                </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (::RegOpenKeyEx(hKey, szSubKeyName, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, KEY_READ, </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">hItem) </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> ERROR_SUCCESS)<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>                    </span><span style="COLOR: #0000ff">continue</span><span style="COLOR: #000000">;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Opened - look for "DisplayName"</span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">                TCHAR szDisplayName[IS_KEY_LEN];<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>                DWORD dwSize </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(szDisplayName);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>                DWORD dwType;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>                </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (::RegQueryValueEx(hItem, IS_DISPLAY, NULL, </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">dwType,<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>                    (LPBYTE)</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">szDisplayName, </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">dwSize) </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> 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.shnenglu.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.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>                </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.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_978_1056_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>                    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Add to the main array</span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">                    m_aPrograms.Add(szDisplayName);                    <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>                }</span></span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>                ::RegCloseKey(hItem);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>            }</span></span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>            dwIndex</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>            cbName </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> IS_KEY_LEN;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>        }</span></span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>        ::RegCloseKey(hKey);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>    }</span></div> <br><a href="http://www.shnenglu.com/Files/AutomateProgram/installed_programs_mfc_src.zip">下蝲</a> <img src ="http://www.shnenglu.com/AutomateProgram/aggbug/85354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/AutomateProgram/" target="_blank">漂漂</a> 2009-05-22 11:30 <a href="http://www.shnenglu.com/AutomateProgram/archive/2009/05/22/85354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++中操作注册表的几个重要APIhttp://www.shnenglu.com/AutomateProgram/archive/2009/05/22/85352.html漂漂漂漂Fri, 22 May 2009 03:24:00 GMThttp://www.shnenglu.com/AutomateProgram/archive/2009/05/22/85352.htmlhttp://www.shnenglu.com/AutomateProgram/comments/85352.htmlhttp://www.shnenglu.com/AutomateProgram/archive/2009/05/22/85352.html#Feedback0http://www.shnenglu.com/AutomateProgram/comments/commentRss/85352.htmlhttp://www.shnenglu.com/AutomateProgram/services/trackbacks/85352.htmlhttp://blog.chinaunix.net/u2/67530/showart_602802.html


         一起学习注册表的操作,API为我们提供了大约25个函数。他提供了对注册表的dQ写入,删除Q以及打开注册表及键值时所有函敎ͼq且可以辑ֈҎ册表的备份,q接和对q端注册表进行查看等{。注册表Ҏ个系l十分重要,你在q行操作Ӟ一定要先考虑清楚。这些函数有Q?
               RegCloseKey RegConnectReGIStry RegCreateKey RegCreateKeyEx RegDeleteKey RegDeleteVale 
               RegEnumKey RegFlushKey RegGetKeySecurityQ此函数Q?8不适用Q?RegLoadKey 
               RegNotifyChangeKeyValueQ?8不适用Q?RegOpenKey RegOpenKeyEx RegQueryInfoKey RegQueryValue
               RegQueryValueEx RegReplaceKey RegRestoreKeyQ?8不适用Q?RegSaveKey RegSetKeySecurityQ?8不适用Q?RegSetValue RegSetValueEx RegUnLoadKey
我们对经怋用的几个函数q行介绍?

1·RegClose()
    原ŞQLONG RegCloseKey(
    HKEY hKey // 释放已经打开的注册表句柄
    );
q回?不成功返回非0Q成功返回ERROR_SUCCESS
解释Q关闭指定的d表键Q释攑֏柄。当对一个或多个键或值操作完成以后,需要关闭其键来q行保存操作l果。关闭一个键后,句柄变ؓ非法Q以使其不可再次被用。ؓpȝ重新使用而释攑֏柄?/span>
    例子
BOOL bRet = TRUE;
if( m_hKey == NULL )
return( FALSE );
bRet = ( ::RegCloseKey( m_hKey ) == ERROR_SUCCESS );
m_hKey = NULL;
return( bRet ); 

2·RegCreateKeyEx()和RegCreateKey()
原ŞQLONG RegCreateKeyEx(
HKEY hKey, // 主键名称
LPCTSTR lpSubKey, // 子键名称或\?
DWORD Reserved, // 保留Qؓ0
LPTSTR lpClass, // 没弄懂,我设为空也差不多
DWORD dwOptions,
/* 对你建立的键的一些选项Q可以是q些|REG_OPTION_NON_VOLATILEQREG_OPTION_VOLATILEQREG_OPTION_BACKUP_RESTOREW一个是默认的了。一般用W一个就可以了?/
REGSAM samDesired, // 讄你对你徏立的q个键的讉K权限
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
//不太明白
PHKEY phkResult, // 指向你徏的句?
LPDWORD lpdwDisposition //用来查看是打开一个已l有的键Q还是新Z?
);
RegCreateKey()函数单了不少Q请自己看了?
q回|不成功返回非0Q成功返回ERROR_SUCCESS.
解释Q打开指定的键或子键。如果要打开的键不存在的话,本函C试图建立它。当在创建或打开注册表的键时Q需要指定访问权限,而这些访问权限需要到一U。默认的权限是KEY_ALL_Access权限。还有KEY_CREATE_LINK创徏字符链权?KEY_CREATE_SUB_KEY创徏子键权限,KEY_EXECUTEd键权限,KEY_NOTIFY获得修改键通知的权限,KEY_QUERY_VALUE查询键值的权限QKEY_SET_VALUE讄数据值的权限。注意不能在根一U徏键,在注册表的根一U仅可有预定义的键。具体用,h看联机手册?
例子:
HKEY m_hkey;
DWORD dwDisposition;
long ret0=(::RegCreateKeyEx
(HKEY_CURRENT_USER,"REGD\\",0,NULL,
REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&m_hkey,&dwDisposition));
if(ret0!=ERROR_SUCCESS) //如果无法打开hKEYQ则l止E序的执?
{
MessageBox("错误: 无法打开有关的hKEY!");
return;
}
if(dwDisposition==REG_OPENED_EXISTING_KEY)
MessageBox("打开了一个已l存在的?);
else
{
if(dwDisposition==REG_CREATED_NEW_KEY)
MessageBox("建立一个新?);
}
RegClosekey(m_hkey);

3·RegOpenKey()和RegOpenKeyEx()
原ŞQLONG RegOpenKeyEx(
HKEY hKey, // 要打开主键?
LPCTSTR lpSubKey, // 子键或\?
DWORD ulOptions, // 保留Qؓ0
REGSAM samDesired, // 操作权限标志
PHKEY phkResult // 指向你打开键的句柄
);
q回?不成功返回非0Q成功返回ERROR_SUCCESS.
解释Q该函数负责打开指定的键或子键,如果不存在他不徏立。其他和RegCreateKeyEx()和RegCreateKey()基本相同?

4·RegDeleteKey()
原ŞQLONG RegDeleteKey(
HKEY hKey, // 已打开的键的句?
LPCTSTR lpSubKey // 要删除的子键或\径,传如""删除key本n
);
q回|不成功返回非0Q成功返回ERROR_SUCCESS
该函数用来删除注册表中的一个键值的。在用此函数旉要注?8与NT的差异。在NT中在删除一个键之前Q要求必d除所有子键,需要从下向上递归删除所有子键,而Windows98没有他那么复杂,只要删除键及其所有子键就可以啦?

5·RegQueryValue()和RegQueryValueEx()
原ŞQLONG RegQueryValueEx(
HKEY hKey, // 已打开的键的句?
LPTSTR lpValueName, // 要查询值的名称Q传?"为查询键下的默认?
LPDWORD lpReserved, // 保留Qؓ0
LPDWORD lpType, // 查询的类?
LPBYTE lpData, // 数据存放的地址
LPDWORD lpcbData // 数据长度 1
);
q回|不成功返回非0Q成功返回ERROR_SUCCESS
解释Q读取某子键下特定名U的倹{?
例子
CString m_strQ;//用来存放查询来的字符串?
DWORD m_dwCount;//记录字符串的长度 1Q包括NULL字符Q?
::RegQueryValueEx(m_hkey,"",0,NULL,NULL,&m_dwCount);//先查询出字节I间
ret1=(::RegQueryValueEx
(m_hkey,"",0,NULL,(unsigned char *)m_strQ.GetBuffer(m_dwCount),&m_kk));
m_strQ.ReleaseBuffer();
MessageBox(m_strQ);

6·RegSetValue()和RegSetValueEX()
原ŞQLONG RegSetValueEx(
HKEY hKey, // 已打开的键的句?
LPCTSTR lpValueName, // 要查询值的名称Q传?"为查询键下的默认?
DWORD Reserved, // 保留
DWORD dwType, // 变量的类?
CONST BYTE *lpData, // 变量数据的地址
DWORD cbData // 变量的长?
);
q回|不成功返回非0Q成功返回ERROR_SUCCESS
解释Q设|某子键下特定名U的倹{?

7·RegEnumValue()
原ŞQLONG RegEnumValue(
HKEY hKey, // 要查询的已打开的键的句?
DWORD dwIndex, // d名称的烦引号
LPTSTR lpValueName, // q回所d的名U?
LPDWORD lpcbValueName, // q回d名称的长度,不含chr(0)
LPDWORD lpReserved, // 保留Qؓ0
LPDWORD lpType, // q回所d的数据类?
LPBYTE lpData, // q回所d的数?
LPDWORD lpcbData // q回所d的数据长?
);
q回|不成功返回非0Q成功返回ERROR_SUCCESS
解释Q列出某Key的所有名U的|变化索引卛_遍历整个键下的名U和数据?

8·RegDeleteValue()
原ŞQLONG RegDeleteValue(
HKEY hKey, // 要删除的键的句柄
LPCTSTR lpValueName // 要删除的名称
);
q回|不成功返回非0Q成功返回ERROR_SUCCESS
解释Q删除某Key的某一名称

9·RegEnumKey()和RegEnumKeyEx()
原ŞQLONG RegEnumKeyEx(
HKEY hKey, // 要列丄键的句柄
DWORD dwIndex, // 索引
LPTSTR lpName, // 子键的名U?
LPDWORD lpcbName, // 子键名称的长?
LPDWORD lpReserved, // 保留
LPTSTR lpClass, // address of buffer for class string
LPDWORD lpcbClass, // address for size of class buffer
PFILETIME lpftLastWriteTime
// address for time key last written to
);
q回|不成功返回非0Q成功返回ERROR_SUCCESS
q回注册表键及其子键的详l信息?

10·RegQueryInfoKey()
原ŞQLONG RegQueryInfoKey(
HKEY hKey, // 已打开的键的句?
LPTSTR lpClass, // cd名称Q仅使用于NT。若不用则传入Null
LPDWORD lpcbClass, // cd名称的长?
LPDWORD lpReserved, // 保留
LPDWORD lpcSubKeys, // q回子键的数?
LPDWORD lpcbMaxSubKeyLen, // q回最长的子键长度
LPDWORD lpcbMaxClassLen, // q回最长的c长?
LPDWORD lpcValues, // q回值的数目
LPDWORD lpcbMaxValueNameLen, // q回最长的值项名称的长?
LPDWORD lpcbMaxValueLen, // q回最长的值的长度
LPDWORD lpcbSecurityDescriptor, //q回安全描述Q仅适用?NT
PFILETIME lpftLastWriteTime // q回键最后被写入的时_仅适用?NT
);
q回|不成功返回非0Q成功返回ERROR_SUCCESS
解释Q返回注册表键的信息Q包括类名、子键数量、最长子键名、值的数量、最长值数据、安全描q符的长度以及上一ơ写入的旉{?

11·RegLoadKey()
原ŞQLONG RegLoadKey(
HKEY hKey, // 打开的句?
LPCTSTR lpSubKey, //子键的\?
LPCTSTR lpFile // 要写入注册表信息的文?
);
q回|不成功返回非0Q成功返回ERROR_SUCCESS
解释Q从指定的文件恢复注册表键的子键信息到注册表?

12·RegReplaceKey()
原ŞQLONG RegReplaceKey(
HKEY hKey, // handle to open key
LPCTSTR lpSubKey, // address of name of subkey
LPCTSTR lpNewFile, // 在替换前生成新的备䆾文g
LPCTSTR lpOldFile // 需要覆盖上注册表的文g
);
q回|不成功返回非0Q成功返回ERROR_SUCCESS
解释Q从指定的文件恢复注册表键的子键信息到注册表q替换原有的|q生成新的备份文?

13· RegSaveKey()
LONG RegSaveKey(
HKEY hKey, // 要保存的句柄
LPCTSTR lpFile, // 保存子键的文?
LPSECURITY_ATTRIBUTES lpSecurityAttributes //不太?
);
q回|不成功返回非0Q成功返回ERROR_SUCCESS
解释Q保存键及其子键信息到指定的文g?

14· RegConnectRegistry()
原ŞQLONG RegConnectRegistry(
LPTSTR lpMachineName, //q程计算机的名称
HKEY hKey, // 预先注册的句?
PHKEY phkResult // q程计算Z的句?
);
q回|不成功返回非0Q成功返回ERROR_SUCCESS
解释Q连接到q程pȝ的注册表?

15·RegNotifyChangeKeyValue()
当修Ҏ定的注册表对象时提供通知?

16· RegUnloadKey()
LONG RegUnLoadKey(
HKEY hKey, // handle to open key
LPCTSTR lpSubKey // address of name of subkey to unload
);
q回|不成功返回非0Q成功返回ERROR_SUCCESS
删除注册表键及其所有的子键?

漂漂 2009-05-22 11:24 发表评论
]]>
޹˾ƷŮ˾þþ | ˾þô߽| þùӰԺ| þþƷһ| þ۲ӰԺѿҹɫ| ŷպƷþþѹۿ| þۺɫ99žak| պӰþþñ| þһҹ | ޾ƷŮþþ| ޾þһ | þݺҹҹվ | þ޹ƷAVϼ| 뾫Ʒþþɫ| þó鱬Ļ| þۺϺݺۺϾþü | պһþ99| avþþþòվ| ܻƺ۵վþmimiɫ| þþƷŷƬ| Ʒþþþþ֣ݹ˾| ˾þó˳ۺ222| һƷþ | պ޾Ʒþ| 99þþƷ鶹| һۺϾþù| þþþӰԺС| ٸþĻ| һŮȫƾþƬ | ޹Ʒ˾þ | þ޾ƷƵ| ˼˼þþƷ| þþþþƷ66| ƷžžþƵ| 99þ99þþƷѿ| þþþƷһ| ŷ޾Ʒ˾þԻӰƬ| þԭƷӰԺ| þۺϹ׾Ʒ| þþƷ˘AV| AþþƷ|