??xml version="1.0" encoding="utf-8" standalone="yes"?>久久综合给久久狠狠97色 ,久久婷婷五月综合色高清,无码8090精品久久一区http://www.shnenglu.com/killsound/C/C++ 交流zh-cnWed, 07 May 2025 18:40:40 GMTWed, 07 May 2025 18:40:40 GMT60linux下patch打补?/title><link>http://www.shnenglu.com/killsound/archive/2009/12/03/102463.html</link><dc:creator>不懂^_^</dc:creator><author>不懂^_^</author><pubDate>Thu, 03 Dec 2009 05:45:00 GMT</pubDate><guid>http://www.shnenglu.com/killsound/archive/2009/12/03/102463.html</guid><wfw:comment>http://www.shnenglu.com/killsound/comments/102463.html</wfw:comment><comments>http://www.shnenglu.com/killsound/archive/2009/12/03/102463.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/killsound/comments/commentRss/102463.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/killsound/services/trackbacks/102463.html</trackback:ping><description><![CDATA[<table style="TABLE-LAYOUT: fixed; WIDTH: 100%"> <tbody> <tr> <td> <div id="oquooco" class=cnt id=blog_text><span>首先介绍一?/span><span>diff</span><span>?/span><span>patch</span><span>。在q里不会?/span><span>man</span><span>在线文档上所有的选项都介l一下,那样也没有必要。在</span><span>99</span><span>Q的旉里,我们只会用到几个选项。所以必d会这几个选项?/span> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><font face=宋体><span>1</span><span>?/span><span>diff</span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><font face=宋体><span>Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-</span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><font face=宋体><span>NAME</span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><font face=宋体><span><span>       </span>diff - find differences between two files</span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><font face=宋体><span>SYNOPSIS</span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><font face=宋体><span><span>       </span>diff [options] from-file to-file</span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><font face=宋体><span>Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-</span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><font face=宋体><span>单的_</span><span>diff</span><span>的功能就是用来比较两个文件的不同Q然后记录下来,也就是所谓的</span><span>diff</span><span>补丁。语法格式:</span><span>diff </span><span>【选项?/span></font><font face=宋体> <span style="COLOR: green">源文Ӟ夹)</span></font><font face=宋体> <span style="COLOR: fuchsia">目的文gQ夹Q?/span><span>Q就是要l?span style="COLOR: green">源文Ӟ夹)</span>打个补丁Q之变?span style="COLOR: fuchsia">目的文gQ夹Q?/span>Q术语也是“升”。下面介l三个最为常用选项Q?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face=宋体><span>-r </span><span>是一个递归选项Q设|了q个选项Q?/span><span>diff</span><span>会将两个不同版本源代码目录中的所有对应文件全部都q行一ơ比较,包括子目录文件?/span></font><font face=宋体> </font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face=宋体><span>-N </span><span>选项保补丁文g正地处理已经创徏或删除文件的情况?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face=宋体><span>-u </span><span>选项以统一格式创徏补丁文gQ这U格式比~省格式更紧凑些?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face=宋体><span>2</span><span>?/span><span>patch</span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face=宋体><span>Q-Q-Q-Q-Q-Q-Q-Q-Q-</span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face=宋体><span>NAME</span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face=宋体><span><span>       </span>patch - apply a diff file to an original</span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face=宋体><span>SYNOPSIS</span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face=宋体><span><span>       </span>patch [options] [originalfile [patchfile]]</span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face=宋体><span><span>       </span>but usually just</span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face=宋体><span><span>       </span>patch -pnum <patchfile></span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face=宋体><span>Q-Q-Q-Q-Q-Q-Q-Q-Q-</span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face=宋体><span>单的_</span><span>patch</span><span>是利用</span><span>diff</span><span>制作的补丁来实现<span style="COLOR: green">源文Ӟ夹)</span>?span style="COLOR: fuchsia">目的文gQ夹Q?/span>的{换。这栯意味着你可以有<span style="COLOR: green">源文Ӟ夹)</span>―?/span><span>></span><span style="COLOR: fuchsia">目的文gQ夹Q?/span><span>Q也可以<span style="COLOR: fuchsia">目的文gQ夹Q?/span>―?/span><span>></span><span style="COLOR: green">源文Ӟ夹)?/span><span>下面介绍几个最常用选项Q?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face=宋体><span>-p0 </span><span>选项要从当前目录查找目的文gQ夹Q?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face=宋体><span>-p1 </span><span>选项</span><span style="COLOR: black">要忽略掉W一层目录,从当前目录开始查找?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><font face=宋体><span style="FONT-SIZE: 12pt; COLOR: olive"><font size=2>************************************************************</font></span></font></p> <span style="FONT-SIZE: 12pt; COLOR: olive"> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face=宋体><span style="COLOR: rgb(255,102,0)">在这里以实例说明Q?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: rgb(255,102,0)"><font face=宋体 size=2>--- old/modules/pcitable<span>       </span>Mon Sep 27 11:03:56 1999</font></span></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: rgb(255,102,0)"><font face=宋体 size=2>+++ new/modules/pcitable<span>       </span>Tue Dec 19 20:05:41 2000</font></span></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: rgb(255,102,0)"><font face=宋体 size=2>    如果使用参数-p0Q那pCZ当前目录找一个叫做old的文件夹Q在它下面寻找modules下的pcitable文g来执行patch操作?/font></span></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-SIZE: 12pt; COLOR: rgb(255,102,0)"><font face=宋体 size=2>    如果使用参数-p1Q那pC忽略第一层目录(即不oldQ,从当前目录寻找modules的文件夹Q在它下面找pcitable。这L前提是当前目 录必Mؓmodules所在的目录。而diff补丁文g则可以在L位置Q只要指明了diff补丁文g的\径就可以了。当Ӟ可以用相对\径,也可以用l?对\径。不q我一般习惯用相对路径?/font></span></p> </span><font size=3><font face=宋体><span style="COLOR: olive">************************************************************</span> </font></font> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face=宋体><span>-E<span> </span></span><span>选项说明如果发现了空文gQ那么就删除?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face=宋体><span>-R<span> </span></span><span>选项说明在补丁文件中?/span><span>“</span><span>?/span><span>”</span><span>文g?/span><span>“</span><span>?/span><span>”</span><span>文g现在要调换过来了Q实际上是l新版本打补丁,让它变成老版本)</span></font></p> <p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face=宋体><span>下面l合具体实例来分析和解决Q分ZU类型:为单个文件打补丁和ؓ文g夹内的多个文件打补丁?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>环境Q在</span><span>RedHat 9.0</span><span>下面?/span><span>armlinux</span><span>用户登陆?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>目录树如下:</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>|-- bootloader</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>|-- debug</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>|-- images</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>|-- kernel</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>|-- program</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>|-- rootfiles</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>|-- software</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>|-- source</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>|-- sysapps</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>|-- tmp</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>`-- tools</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>下面?/span><span>program</span><span>文g夹下面徏?/span><span>patch</span><span>文g夹作为实验用Q然后进?/span><span>patch</span><span>文g夏V?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>一、ؓ单个文gq行补丁操作</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>1</span><span>、徏立测试文?/span><span>test0</span><span>?/span><span>test1</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ cat<span> </span>>>test0<<EOF</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>> 111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>> 111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>> 111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>> EOF</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ more test0</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ cat >>test1<<EOF</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>> 222222</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>> 111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>> 222222</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>> 111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>> EOF</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ more test1</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>222222</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>222222</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>2</span><span>、?/span><span>diff</span><span>创徏补丁</span><span>test1.patch</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ diff -uN test0 test1 > test1.patch</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span style="COLOR: green">【注Q因为单个文Ӟ所以不需?/span><span style="COLOR: green">-r</span><span style="COLOR: green">选项。选项序没有关系Q即可以?/span><span style="COLOR: green">-uN</span><span style="COLOR: green">Q也可以?/span><span style="COLOR: green">-Nu</span><span style="COLOR: green">。?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ ls</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>test0<span> </span>test1<span> </span>test1.patch</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ more test1.patch</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span><span style="COLOR: rgb(255,153,0)">************************************************************</span></span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span style="COLOR: olive">patch</span><span style="COLOR: olive">文g的结?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span style="COLOR: olive">补丁?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span style="COLOR: rgb(255,153,0)">补丁头是分别?/span><span style="COLOR: rgb(255,153,0)">---/+++</span><span style="COLOR: rgb(255,153,0)">开头的两行Q用来表C打补丁的文g?/span><span style="COLOR: rgb(255,153,0)">---</span><span style="COLOR: rgb(255,153,0)">开头表C旧文gQ?/span><span style="COLOR: rgb(255,153,0)">+++</span><span style="COLOR: rgb(255,153,0)">开头表C新文g?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span style="COLOR: olive">一个补丁文件中的多个补?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span style="COLOR: rgb(255,153,0)">一个补丁文件中可能包含?/span><span style="COLOR: rgb(255,153,0)">---/+++</span><span style="COLOR: rgb(255,153,0)">开头的很多节,每一节用来打一个补丁。所以在一个补丁文件中可以包含好多个补丁?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span style="COLOR: olive">?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span style="COLOR: rgb(255,153,0)">块是补丁中要修改的地斏V它通常׃部分不用修改的东西开始和l束。他们只是用来表C修改的位|。他们通常?/span><span style="COLOR: rgb(255,153,0)">@@</span><span style="COLOR: rgb(255,153,0)">开始,l束于另一个块的开始或者一个新的补丁头?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span style="COLOR: olive">块的~进</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span style="COLOR: rgb(255,153,0)">块会~进一列,而这一列是用来表示q一行是要增加还是要删除的?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span style="COLOR: olive">块的W一?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span style="COLOR: rgb(255,153,0)">+</span><span style="COLOR: rgb(255,153,0)">可C一行是要加上的?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span style="COLOR: rgb(255,153,0)">-</span><span style="COLOR: rgb(255,153,0)">可C一行是要删除的?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span style="COLOR: rgb(255,153,0)">没有加号也没有减可C里只是引用的而不需要修攏V?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span style="COLOR: rgb(255,153,0)">************************************************************</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span style="COLOR: green">***diff</span><span style="COLOR: green">命o会在补丁文g中记录这两个文g的首ơ创建时_如下</span><span style="COLOR: green">***</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>--- test0<span>       </span>2006-08-18 09:12:01.000000000 +0800</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>+++ test1<span>       </span>2006-08-18 09:13:09.000000000 +0800</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>@@ -1,3 +1,4 @@</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>+222222</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>-111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>+222222</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ patch -p0 < test1.patch</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>patching file test0</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ ls</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>test0<span> </span>test1<span> </span>test1.patch</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ cat test0</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>222222</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>222222</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>3、可以去除补丁,恢复旧版?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ patch -RE -p0 < test1.patch</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>patching file test0</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ ls</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>test0<span> </span>test1<span> </span>test1.patch</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ cat test0</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>二、ؓ多个文gq行补丁操作</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>1</span><span>、创建测试文件夹</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ mkdir prj0</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ cp test0 prj0</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ ls</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>prj0<span> </span>test0<span> </span>test1<span> </span>test1.patch</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ cd prj0/</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm prj0]$ ls</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>test0</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm prj0]$ cat >>prj0name<<EOF</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>> --------</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>> prj0/prj0name</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>> --------</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>> EOF</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm prj0]$ ls</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>prj0name<span> </span>test0</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm prj0]$ cat prj0name</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>--------</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>prj0/prj0name</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>--------</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm prj0]$ cd ..</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ mkdir prj1</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ cp test1 prj1</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ cd prj1</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm prj1]$ cat >>prj1name<<EOF</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>> ---------</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>> prj1/prj1name</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>> ---------</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>> EOF</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm prj1]$ cat prj1name</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>---------</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>prj1/prj1name</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>---------</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm prj1]$ cd ..</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>2</span><span>、创?/span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ diff -uNr prj0 prj1 > prj1.patch</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ more prj1.patch</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>diff -uNr prj0/prj0name prj1/prj0name</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>--- prj0/prj0name<span>       </span>2006-08-18 09:25:11.000000000 +0800</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>+++ prj1/prj0name<span>       </span>1970-01-01 08:00:00.000000000 +0800</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>@@ -1,3 +0,0 @@</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>---------</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>-prj0/prj0name</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>---------</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>diff -uNr prj0/prj1name prj1/prj1name</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>--- prj0/prj1name<span>       </span>1970-01-01 08:00:00.000000000 +0800</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>+++ prj1/prj1name<span>       </span>2006-08-18 09:26:36.000000000 +0800</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>@@ -0,0 +1,3 @@</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>+---------</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>+prj1/prj1name</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>+---------</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>diff -uNr prj0/test0 prj1/test0</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>--- prj0/test0<span> </span>2006-08-18 09:23:53.000000000 +0800</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>+++ prj1/test0<span> </span>1970-01-01 08:00:00.000000000 +0800</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>@@ -1,3 +0,0 @@</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>-111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>-111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>-111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>diff -uNr prj0/test1 prj1/test1</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>--- prj0/test1<span> </span>1970-01-01 08:00:00.000000000 +0800</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>+++ prj1/test1<span> </span>2006-08-18 09:26:00.000000000 +0800</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>@@ -0,0 +1,4 @@</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>+222222</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>+111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>+222222</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>+111111</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ ls</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>prj0<span> </span>prj1<span> </span>prj1.patch<span> </span>test0<span> </span>test1<span> </span>test1.patch</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ cp prj1.patch ./prj0</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm patch]$ cd prj0</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm prj0]$ patch -p1 < prj1.patch </span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>patching file prj0name</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>patching file prj1name</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>patching file test0</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>patching file test1</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm prj0]$ ls</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>prj1name<span> </span>prj1.patch<span> </span>test1</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm prj0]$ patch -R -p1 < prj1.patch </span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>patching file prj0name</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>patching file prj1name</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>patching file test0</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>patching file test1</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>[armlinux@lqm prj0]$ ls</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span>prj0name<span> </span>prj1.patch<span> </span>test0</span></font></p> <p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span><span style="COLOR: red">Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?/span></span></font></p> <font face=宋体><span> <p style="MARGIN: 0cm 0cm 0pt"><span style="COLOR: red">ȝ一下:</span></p> </span><span> <p style="MARGIN: 0cm 0cm 0pt"><span style="COLOR: red">单个文g</span></p> <p style="MARGIN: 0cm 0cm 0pt"><span style="COLOR: red">diff –uN from-file to-file >to-file.patch</span></p> <p style="MARGIN: 0cm 0cm 0pt"><span style="COLOR: red">patch –p0 < to-file.patch</span></p> <p style="MARGIN: 0cm 0cm 0pt"><span style="COLOR: red">patch –RE –p0 < to-file.patch</span></p> <p style="MARGIN: 0cm 0cm 0pt"><span style="COLOR: red">多个文g</span></p> <p style="MARGIN: 0cm 0cm 0pt"><span style="COLOR: red">diff –uNr from-docu to-docu<span> </span>>to-docu.patch</span></p> <p style="MARGIN: 0cm 0cm 0pt"><span style="COLOR: red">patch –p1 < to-docu.patch</span></p> <p style="MARGIN: 0cm 0cm 0pt"><span style="COLOR: red">patch –R –p1 <to-docu.patch</span></p> </span></font></div> </td> </tr> </tbody> </table> <img src ="http://www.shnenglu.com/killsound/aggbug/102463.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/killsound/" target="_blank">不懂^_^</a> 2009-12-03 13:45 <a href="http://www.shnenglu.com/killsound/archive/2009/12/03/102463.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>setsockopt 讄socket 详细用法http://www.shnenglu.com/killsound/archive/2009/01/16/72138.html不懂^_^不懂^_^Fri, 16 Jan 2009 01:36:00 GMThttp://www.shnenglu.com/killsound/archive/2009/01/16/72138.htmlhttp://www.shnenglu.com/killsound/comments/72138.htmlhttp://www.shnenglu.com/killsound/archive/2009/01/16/72138.html#Feedback7http://www.shnenglu.com/killsound/comments/commentRss/72138.htmlhttp://www.shnenglu.com/killsound/services/trackbacks/72138.html1.closesocketQ一般不会立卛_闭而经历TIME_WAIT的过E)后想l箋重用该socketQ?br>BOOL bReuseaddr=TRUE;
setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));


2. 如果要已l处于连接状态的soket在调用closesocket后强制关闭,不经?br>TIME_WAIT的过E:
BOOL bDontLinger = FALSE;
setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL));


3.在send(),recv()q程中有时由于网l状늭原因Q发收不能预期进?而设|收发时限:
int nNetTimeout=1000;//1U?br>//发送时?br>setsockopt(socketQSOL_S0CKET,SO_SNDTIMEOQ?char *)&nNetTimeout,sizeof(int));
//接收旉
setsockopt(socketQSOL_S0CKET,SO_RCVTIMEOQ?char *)&nNetTimeout,sizeof(int));


4.在send()的时候,q回的是实际发送出ȝ字节(同步)或发送到socket~冲区的字节
(异步);pȝ默认的状态发送和接收一ơؓ8688字节(Uؓ8.5K)Q在实际的过E中发送数?br>和接收数据量比较大,可以讄socket~冲区,而避免了send(),recv()不断的@环收发:
// 接收~冲?br>int nRecvBuf=32*1024;//讄?2K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
//发送缓冲区
int nSendBuf=32*1024;//讄?2K
setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));


5. 如果在发送数据的Ӟ希望不经历由pȝ~冲区到socket~冲区的拯而媄?br>E序的性能Q?br>int nZero=0;
setsockopt(socketQSOL_S0CKET,SO_SNDBUFQ?char *)&nZero,sizeof(nZero));


6.同上在recv()完成上述功能(默认情况是将socket~冲区的内容拯到系l缓冲区)Q?br>int nZero=0;
setsockopt(socketQSOL_S0CKET,SO_RCVBUFQ?char *)&nZero,sizeof(int));


7.一般在发送UDP数据报的时候,希望该socket发送的数据hq播Ҏ:
BOOL bBroadcast=TRUE;
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const char*)&bBroadcast,sizeof(BOOL));


8.在clientq接服务器过E中Q如果处于非d模式下的socket在connect()的过E中?br>以设|connect()延时,直到accpet()被呼?本函数设|只有在非阻塞的q程中有显著?br>作用Q在d的函数调用中作用不大)
BOOL bConditionalAccept=TRUE;
setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const char*)&bConditionalAccept,sizeof(BOOL));


9.如果在发送数据的q程?send()没有完成Q还有数据没发?而调用了closesocket(),以前我们
一般采取的措施?从容关闭"shutdown(s,SD_BOTH),但是数据是肯定丢׃Q如何设|让E序满具体
应用的要?卌没发完的数据发送出d在关闭socket)Q?br>struct linger {
u_short l_onoff;
u_short l_linger;
};
linger m_sLinger;
m_sLinger.l_onoff=1;//(在closesocket()调用,但是q有数据没发送完毕的时候容讔R留)
// 如果m_sLinger.l_onoff=0;则功能和2.)作用相同;
m_sLinger.l_linger=5;//(容许逗留的时间ؓ5U?
setsockopt(s,SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof(linger));

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

讄套接口的选项?br>
   #include <winsock.h>

   int PASCAL FAR setsockopt( SOCKET s, int level, int optname,
   const char FAR* optval, int optlen);

   sQ标识一个套接口的描q字?br>   levelQ选项定义的层ơ;目前仅支持SOL_SOCKET和IPPROTO_TCP层次?br>   optnameQ需讄的选项?br>   optvalQ指针,指向存放选项值的~冲区?br>   optlenQoptval~冲区的长度?br>
注释Q?br>  setsockopt()函数用于Lcd、Q意状态套接口的设|选项倹{尽在不同协议层上存在选项Q但本函C定义了最高的“套接?#8221;层次上的选项。选项影响套接口的操作Q诸如加急数据是否在普通数据流中接Ӟq播数据是否可以从套接口发送等{?br>   有两U套接口的选项Q一U是布尔型选项Q允许或止一U特性;另一U是整Ş或结构选项。允怸个布型选项Q则optval指向非零整Ş敎ͼ止一个选项optval指向一个等于零的整形数。对于布型选项Qoptlen应等于sizeof(int)Q对其他选项Qoptval指向包含所需选项的整形数或结构,而optlen则ؓ整Ş数或l构的长度。SO_LINGER选项用于控制下述情况的行动:套接口上有排队的待发送数据,且closesocket()调用已执行。参见closesocket()函数中关于SO_LINGER选项对closesocket()语义的媄响。应用程序通过创徏一个lingerl构来设|相应的操作Ҏ:
   struct linger {
int l_onoff;
int l_linger;
   };
   Z允许SO_LINGERQ应用程序应l_onoff设ؓ非零Q将l_linger设ؓ零或需要的时|以秒为单位)Q然后调?strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">setsockopt()。ؓ了允许SO_DONTLINGERQ亦即禁止SO_LINGERQ,l_onoff应设为零Q然后调?strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">setsockopt()?br>   ~省条g下,一个套接口不能与一个已在用中的本地地址捆绑Q参见bind()Q。但有时会需?#8220;重用”地址。因为每一个连接都由本地地址和远端地址的组合唯一定Q所以只要远端地址不同Q两个套接口与一个地址捆绑q无大碍。ؓ了通知WINDOWS套接口实C要因Z个地址已被一个套接口使用׃让它与另一个套接口捆绑Q应用程序可在bind()调用前先讄SO_REUSEADDR选项。请注意仅在bind()调用时该选项才被解释Q故此无需Q但也无宻I一个不会共用地址的套接口讄该选项Q或者在bind()对这个或其他套接口无影响情况下设|或清除q一选项?br>   一个应用程序可以通过打开SO_KEEPALIVE选项Q得WINDOWS套接口实现在TCPq接情况下允怋?#8220;保持zd”包。一个WINDOWS套接口实现ƈ不是必需支持“保持zd”Q但是如果支持的话,具体的语义将与实现有养I应遵守RFC1122“InternetL要求Q通讯?#8221;中第4.2.3.6节的规范。如果有兌接由?#8220;保持zd”而失效,则进行中的Q何对该套接口的调用都以WSAENETRESET错误q回Q后l的M调用以WSAENOTCONN错误q回?br>   TCP_NODELAY选项止Nagle法。Nagle法通过未认的数据存入缓冲区直到蓄一个包一起发送的ҎQ来减少L发送的零碎数据包的数目。但对于某些应用来说Q这U算法将降低pȝ性能。所以TCP_NODELAY可用来将此算法关闭。应用程序编写者只有在切了解它的效果q确实需要的情况下,才设|TCP_NODELAY选项Q因|后对网l性能有明昄负面影响。TCP_NODELAY是唯一使用IPPROTO_TCP层的选项Q其他所有选项都用SOL_SOCKET层?br>   如果讄了SO_DEBUG选项QWINDOWS套接口供应商被鼓励(但不是必需Q提供输出相应的调试信息。但产生调试信息的机制以及调试信息的形式已超出本规范的讨围?br>  setsockopt()支持下列选项。其?#8220;cd”表明optval所指数据的cd?br>选项        cd   意义
SO_BROADCAST BOOL 允许套接口传送广播信息?br>SO_DEBUG BOOL 记录调试信息?br>SO_DONTLINER BOOL 不要因ؓ数据未发送就d关闭操作。设|本选项相当于将SO_LINGER的l_onoff元素|ؓ零?br>SO_DONTROUTE BOOL 止选径Q直接传送?br>SO_KEEPALIVE BOOL 发?#8220;保持zd”包?br>SO_LINGER struct linger FAR*   如关闭时有未发送数据,则逗留?br>SO_OOBINLINE BOOL 在常规数据流中接收带外数据?br>SO_RCVBUF int 为接收确定缓冲区大小?br>SO_REUSEADDR BOOL 允许套接口和一个已在用中的地址捆绑Q参见bind()Q?br>SO_SNDBUF int 指定发送缓冲区大小?br>TCP_NODELAY BOOL 止发送合q的Nagle法?br>
  setsockopt()不支持的BSD选项有:
选项?   cd 意义
SO_ACCEPTCONN BOOL 套接口在监听?br>SO_ERROR int 获取错误状态ƈ清除?br>SO_RCVLOWAT int 接收低水印?br>SO_RCVTIMEO int 接收时?br>SO_SNDLOWAT int 发送低U水印?br>SO_SNDTIMEO int 发送超时?br>SO_TYPE     int 套接口类型?br>IP_OPTIONS    在IP头中讄选项?br>
q回|
   若无错误发生Q?strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">setsockopt()q回0。否则的话,q回SOCKET_ERROR错误Q应用程序可通过WSAGetLastError()获取相应错误代码?br>
错误代码Q?br>   WSANOTINITIALISEDQ在使用此API之前应首先成功地调用WSAStartup()?br>   WSAENETDOWNQWINDOWS套接口实现检到|络子系l失效?br>   WSAEFAULTQoptval不是q程地址I间中的一个有效部分?br>   WSAEINPROGRESSQ一个阻塞的WINDOWS套接口调用正在运行中?br>   WSAEINVALQlevel值非法,或optval中的信息非法?br>   WSAENETRESETQ当SO_KEEPALIVE讄后连接超时?br>   WSAENOPROTOOPTQ未知或不支持选项。其中,SOCK_STREAMcd的套接口不支持SO_BROADCAST选项QSOCK_DGRAMcd的套接口不支持SO_DONTLINGER 、SO_KEEPALIVE、SO_LINGER和SO_OOBINLINE选项?br>   WSAENOTCONNQ当讄SO_KEEPALIVE后连接被复位?br>   WSAENOTSOCKQ描q字不是一个套接口?br>
参见Q?br>   bind(), getsockopt(), ioctlsocket(), socket(), WSAAsyncSelect().

copy from:http://blog.csdn.net/qinmi/archive/2007/03/07/1523081.aspx



不懂^_^ 2009-01-16 09:36 发表评论
]]>
动态改变Dialog中IDC_STATIC的文字及颜色http://www.shnenglu.com/killsound/archive/2008/09/18/62149.html不懂^_^不懂^_^Thu, 18 Sep 2008 05:27:00 GMThttp://www.shnenglu.com/killsound/archive/2008/09/18/62149.htmlhttp://www.shnenglu.com/killsound/comments/62149.htmlhttp://www.shnenglu.com/killsound/archive/2008/09/18/62149.html#Feedback0http://www.shnenglu.com/killsound/comments/commentRss/62149.htmlhttp://www.shnenglu.com/killsound/services/trackbacks/62149.html阅读全文

不懂^_^ 2008-09-18 13:27 发表评论
]]>
UPnP协议?/title><link>http://www.shnenglu.com/killsound/archive/2007/12/19/39054.html</link><dc:creator>不懂^_^</dc:creator><author>不懂^_^</author><pubDate>Wed, 19 Dec 2007 08:47:00 GMT</pubDate><guid>http://www.shnenglu.com/killsound/archive/2007/12/19/39054.html</guid><wfw:comment>http://www.shnenglu.com/killsound/comments/39054.html</wfw:comment><comments>http://www.shnenglu.com/killsound/archive/2007/12/19/39054.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/killsound/comments/commentRss/39054.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/killsound/services/trackbacks/39054.html</trackback:ping><description><![CDATA[<p>UPnP协议<br>l一x即用英文是Universal Plug and PlayQ羃写ؓUPnP。要说计机外设的即插即?Plug and PlayQ羃写PnPQ?Q大家可能很熟悉Q但对统一x即用Q多Ch会感到是一头雾水。由于windows xp加入对UPnP的支持,q且被查出存在很严重的安全问题,所以,一旉Q得UPnP名声大噪。y的是Q本人原来查阅过关于UPnP的技术白皮书Q而且也较l地看了关于此次发现的安全缺L介绍。因此,着q个ZQ将UPnP以及引v安全~陷的详情披露出来?/p> <p>一?UPnP是用来干什么的Q?/p> <p>|络发展到现在,已经可以使我们在|上冲浪、收发邮件、听到远方传送来的声韟뀁搜索感兴趣的内宏V下载Y件、点播节目、即时聊?#8230;…实现的功能好像已l不,但,人的Ʋ望无止境,享福x享福Q还有许多目标没有达刎ͼ例如Q怎样才能使我们在|络上,像^时用遥控器那P操作I器、电风扇、厨房电器,或网l远端的电器讑֤呢?如何利用|络上的计算源,使这U?#8220;遥控”更具化?甚至Q将一pd相关的控制写C个脚本中Q以便用户定制自己所喜爱的控制流E?#8230;…实现诸如此类的效果,是有巨大需求的应用技术。如果实现通过|络用UPnP控制家用讑֤Q将l我们的生活带来很大的方便和很多新的体验。例如:</p> <p>1.你在下班之前Q或在回ȝ路上Q就可以先打开安的空调器和厨房设备,{进入家门,立刻是一个温度宜人的环境――厨戉K的饭也做好了。房间温度的高低和厨房内煮饭的过E,都是Ҏ事先设计好的“脚本”E序q行的,l对可靠?/p> <p>2.你若是一位上档次的音乐发烧者,肯定对聆听音乐的环境要求很严Q音׃|高低、音量大、灯光明暗、窗帘拉不拉上都有讲I。手动控刉好,毕竟不方ѝ你要用上UPnPQ一切都会ؓ你代功뀂还能将你习惯的韛_音量、灯光亮度、音q高度{等Q以你认为最佳的参数写到执行脚本中,以后可以都以此ؓ准。如果你拥有自己的专门听韛_Q只要你打开听音室的门,上述的环境就会立刻设|好。曲lh散,只管攑ֿd好了QUPnPpȝ会自己关闭音响,熄灭늁Q拉上窗帘?/p> <p>3.你h在办公室Q心里却放不下家里的孩子。用上UPnPQ只要在安安装摄像_建立好与|络的连接。在办公室内Q启用桌面电脑的WEBTVQ连通网l后Q可以即时监视孩子在安的一举一动?/p> <p>凡此U种的方便和׃h之处q很多,不胜枚D?/p> <p>其实Q这已经不是U学qL、也不是专家预言。目前用UPnP协议可以实现这些操作!q正是windows xppȝ急于加入UPnP的原因。正因ؓUPnP是一个协议,UPnP的用可跨越各种操作pȝq_Q开发应用程序也没有开发语a的局限。可工作于各UŞ式的|络l构。且仅以现在的网l设施ؓ基础Q仅仅加上这个UPnP协议Q既不用d新的设施Q也不用重新架设|络介质可以投入用!</p> <p>UPnP协议h下述特色Q?/p> <p>1. 以网lؓ应用环境Q不考虑“孤岛”中的计算机?/p> <p>2. 以TCP/IP和整个Internet为基。这h“中立”的,不依附于M操作pȝ或应用程序,不用特定的API函数Q不受程序设计语a的局限。可以无~地接入传统|络?/p> <p>3. 讑֤可以动态地q入|络中,随后获得IP地址Q?#8220;学习” 或查找自己应当进行的操作和服务的信息Q?#8220;感知”别的讑֤是否存在以及它们的作用和当前的状?。所有这些,都应当是可自动完成的?/p> <p>4. 每个讑֤都可d属于自己的、特定的状态和参数Q完成控制操作后应当发出“操作完成”的响应信受如果失败,则应发出控制p|的信受?/p> <p>二、UPnP协议的层Q?/p> <p>UPnP协议的最l目的,是徏立一个可用的讑֤模型Q?因篇q这里不Ҏ个结构进行详l的分析Q但你应当记住下面的主要特征Q?/p> <p>1. UPnP是一个多层协议构成的框架体系Q每一层都以相ȝ下层为基Q同时又是相M层的基础。直臌到应用层为止。该图中的最下面是就是IP和TCPQ共两层Q负责设备的IP地址?/p> <p>2. 三层是HTTP、HTTPU、HTTPMUQ这一层,大家应当是熟悉的Q属于传送协议层。传送的是内定wl过“装”后,存放在特定的XML文g中的。对应的SSDP、GENA、SOAP指的是保存在XML文g中的数据格式。到q一层,已经解决了UPnP讑֤的IP地址和传送信息问题?/p> <p>3. W四层是UPnP讑֤体系定义Q仅仅是一个抽象的、公用的讑֤模型。Q何UPnP讑֤都必M用这一层?/p> <p>4. W五层是UPnP论坛的各个专业委员会的设备定义层Q在q个论坛中,不同电器讑֤׃同的专业委员会定义,例如Q电视委员会只负责定义网l电视设备部分,I器委员会只负责定义网l空调设备部?#8230;…依此cL。所有的不同cd的设备都被定义成一个专门的架构或者模板,供徏立设备的时候用。可以推知,q入q一层,讑֤已经被指定了明确用途。当Ӟq些都必遵守标准化的规范。从目前看,UPnP已经可以支持大部分的讑֤Q从电脑、电脑外设,Ud讑֤和家用消费类电子讑֤{等Q无所不包Q随着q个体系的普及,可能有更多的厂家承认这一标准Q最l,可能演化为公认的行业标准?/p> <p>5. 最上层Q也是应用层,由UPnP讑֤刉厂商定义的部分。这一层的信息是由讑֤刉厂商来“填充” 的,q部分一般有讑֤厂商提供的、对讑֤控制和操作的底层代码Q然后,是名称序列号呀Q厂商信息之cȝ东西?/p> <p>三、协议内部的详细情况</p> <p>仅仅有这样五层UPnP协议Q也只不q有了一个共同遵守的框架Q实际的UPnPpȝI竟是如何构成的呢?</p> <p>完整的UPnP服务pȝ由支持UPnP的网l和W合UPnP规范的设备共同构成的?/p> <p>整个pȝ是由讑֤、服务、和控制指针三部分所构成?/p> <p>讑֤Q?/p> <p>q里是指W合UPnP规范的设备。一个UPnP讑֤可以看成一个包含服务ƈ嵌套了常规设备的“容器” 。例如,一个UPnP的VCRQ录像机Q设备可以包含磁带传送服务、调谐服务和旉服务。就是说QUPnP之下的设备不能仅仅理解ؓg意义上的讑֤Q而应当包括服务功能?/p> <p>不同U类的UPnP讑֤关联不同的讄、服务和嵌入讑֤。如打印机和VCR属于不同用途的讑֤Q服务就不可能定义成一L?/p> <p>服务Q?/p> <p>讑֤执行用户h的控制过E,可划分成一个个很小的阶D|单位Q每个单位就UCؓ一个服务。每一个服务,对外都表Cؓ具体的行为和模式Q而行为和模式又可以用状态和变量D行描q。只要可以用数值描qͼ在计机里面容易处理了。例如,模仿一个时钟,它只有一个工作模式:q个模式是模拟q显C当前的旉。而一个时钟的行ؓ共有两种Q也只有两种Q:</p> <p>1. 讄旉Q用?#8220;卛_^时说的对?#8221;Q?</p> <p>2. 得到旉Q用于显C时_?/p> <p>其它讑֤服务Q也是用q样思\来描q和定义的,一个设备也可以被定义多个服务。不论是讑֤的定义信息和服务的描qC息,都保存在一个XML文g中,q个文g也是UPnP协议构成的一部分。当讑֤建立和用服务的时候,XML文g可以与它们进行关联?/p> <p>XML文g中还有一个很关键?#8220;状态表”Q状态表可进一步分?#8220;服务状态表”?#8220;事g状态表”。整个UPnP讑֤q行的全q程内,状态表贯穿始终Q当讑֤状态改变的时候,例如发生参数变化或状态刷新的时候,立即在“状态表”中反映出来。如控制服务器在接收到设|时间的行ؓhӞqx行请求(Ҏ操作Q,q给出响应,同时更新状态表中的有关数据。相应地Q事件服务器负责向对此事件感兴趣的设备公布所发生的状态改变。例如,一个火灾事件发生后Q事件服务器向火灾报警器发布这个事ӞD报警器动作生报警信受?/p> <p>控制指针Q?/p> <p>在UPnP|络中,用户h讑֤执行的控制是通过控制指针实现的,控制指针首先是一个有能力控制别的讑֤的控制者,q要h在网l中 “发现”控制目标的能力。在发现Q控制目标)之后Q控制指针应当:</p> <p>①取得设备的描述信息q得到所兌的服务列表?/p> <p>②取得相x务的描述?/p> <p>③调用控制服务行为?/p> <p>④确定服务的事g “?#8221;Q不ZӞ只要服务状态发生改变,事g服务器会立即向控制指针发送一个事件信息?/p> <p>从上面说到的各种信息Q都保存在XML文g中,不同用途的信息Q格式不同。保证可以各取所需Q不会؜淆?/p> <p>那么QUPnP的完整工作过E是怎样的呢Q?/p> <p>UPnP在控制指针和被控制设备之间提供通讯功能。而网l介质、TCP/IP协议、HTTP仅提供基本的q接和IP地址分配。整个工作过E需要处理六个方面的内容Q即地址分配、发现设备、对讑֤的描q、设备控制、设备事件、设备表达?/p> <p>地址问题Q?/p> <p>地址是整个UPnPpȝ工作的基条gQ每个设备都应当是DHCPQDynamic Host Configuration Protocol 动态主机配|协议)的客戗当讑֤首次与网l徏立连接后Q利用DHCP服务Q讑֤得到一个IP地址。这个IP地址可以是DHCPpȝ指定的,也可以是p备选择的,当然Q有能力自己选择IP地址的设备,必然是那?#8220;聪明”的设备才行!q也是所谓的“自动”IP地址?/p> <p>如果遇到本地DHCP理范围之外的IP地址hQ还需要解?#8220;友好讑֤”</p> <p>的地址分配问题Q这个问题通常由域名服务器来解冟?/p> <p>发现讑֤Q?/p> <p>可分成两U情况,一U是在有控制h之后Q在当前的网l中查找有无对应的可用设备;另一U情冉|某一讑֤接入|络、取得IP地址之后Q就开始向|络“q播”自己已经q入|络Q即L控制h?/p> <p>讑֤的描qͼ</p> <p>单说Q这是声?#8220;自己”是什么样的设备,例如名称、制造厂商、序列号码等{。刚开?#8220;发现”讑֤后,控制指针对这个设备的“了解”q很,需要依据ULR扑ֈ该设备的描述文gQ从q些文g中读取更多的描述信息。描qC息的范围很广Q一般都是由讑֤的制造厂商提供的。主要的描述目有:控制的模式名U和模式L、设备序列号、制造厂商名U、厂商的WEB的ULR{等。这些一般都存放在特定的XML文g中;</p> <p>讑֤控制Q?/p> <p>控制指针扑ֈ讑֤描述之后Q会从描qC“提炼”q行的操作ƈh所有的服务Q对每个UPnP讑֤来说Q这些描q必L很确切、很详细的,描述中可能包含有命o或行为列表、服务响应信息、用到的参数{等。对于服务的每个行ؓQ也伴有描述信息Q主要是整个服务q行期间的变量、变量的数据cd、可用的取D围和事g的特征?/p> <p>要控制某个设备,控制指针必须先发送一个控制行求,要求讑֤开始服务,然后再按讑֤的ULR发送相应的控制消息Q控制消息就是放|在XML文g中的那些SOAP格式的信息。最后,服务会返回响应信息,指出服务是成功或是失败?/p> <p>讑֤事gQ?/p> <p>在服务进行的整个旉内,只要变量值发生了变化或者模式的状态发生了改变Q就产生了一个事Ӟpȝ修改上q提到的事g列表的内宏V随之,事g服务器把事g向整个网l进行广播。另一斚wQ控制指针也可以事先向事件服务器预约事g信息Q保证将该控制指针感兴趣的事件及时准地传送过来?/p> <p>q播或预U事Ӟ传送的都是事g消息Q事件消息也攑֜XML文g中,使用的格式是GENA?/p> <p>讑֤投入工作之前的准备―――初始化q程Q也是一个事Ӟ初始化需要的各种信息也是用事件消息传送的。包括的内容主要是:变量初始|模式的初始状态等{?/p> <p>讑֤表达Q?/p> <p>只要得到了设备的ULRQ就可以取得该设备表N面的ULRQ然后可以将此表辄入用L本地览器上。这部分q包括与用户对话的界面,以及与用戯行会话的处理?/p> <p>整个UPnPpȝQ是?#8220;中枢经”的指挥下协同工作的。其大致情Ş如下Q?/p> <p>凡是具备IP地址的的讑֤都必ȝ接用网l的IP地址Q但有些讑֤可能q不具备直接使用|络IP地址的能力,例如Q电灯开关的控制是q样Q这是非IP讑֤Q非IP讑֤通过|桥QUPnP BridgeQ来与控制指针交换信息?/p> <p>直接使用IP地址的有Q控制指针(可在口袋电脑和远E设备上发出控制Q、本地设备,例如VCR和时钟;以及|桥。非IP讑֤有所谓轻讑֤Q如温度控制器)和非UPnP的设备(如电灯控制开关等Q?/p> <p>上述介绍属于g斚wQ下面再说作为控制灵的软gQ?/p> <p>在上面的叙述中,多次提到用XML文g存放需要的信息Q因为无论是控制指针或设备服务,都需要很多信息,有读出的Q有传出的,UPnP协议U定q些都存攑֜特定的文件XML中。用途不同的信息Q在XML文g中的格式不同。所以,相关的XML文g是控制服务的灵魂?/p> <p>四、关于UPnP隐藏的安全缺~陷Q?/p> <p>q次发现的安全缺陷共有两个,其中W一个缺h对缓冲区QBufferQ的使用没有q行查和限制。外部的d者,可以通过q里取得整个pȝ的控制特权!׃UPnp功能必须使用计算机的端口来进行工作,取得控制权的d者,q有可能利用q些端口Q达到攻击者的目的。这个缺陷导致的后果很严重,不论那个版本的windows pȝQ只要运行UPnPQ就都存在这个危险!但严格地_qƈ不完全是UPnP技术本w的问题Q更多的是程序设计的疏忽?/p> <p>W二个缺陷就与UPnP的工作机理有关系了!</p> <p>该缺陷存在于UPnP工作时的“讑֤发现”阶段。发现设备可以分ZU情况:如果某个具备UPnP功能的计机引导成功q连接到|络上,׃立刻向网l发?#8220;q播”Q向|络上的UPnP讑֤通知自己已经准备qAQ在E序设计q一U别上看Q该q播内容是一个M-SEARCHQ消息)指示。该q播被“声音所?#8221;范围之内的所有设备所“听到”。ƈ向该计算机反馈自q有关信息Q以备随后进行控制之用?/p> <p>相类|如果某个讑֤刚刚q接到网l上Q也会向|络发出“通知”Q表C己准备就l,可以接受来自|络的控Ӟ在程序设计这一U别上看Q该通知是一个NOTIFYQ消息)指示。也被“声音所?#8221;范围之内的所有计机接受。计机?“感知”该设备已l向自己“报到”。实际上QNOTIFYQ消息)指示也不是单单发送给计算机听的,别的|络讑֤也可以听到?/p> <p>是在上q的一播一听之_出现了问题!</p> <p>如果某个黑客向某个用Ll发送一个NOTIFYQ消息)指示Q该用户pȝ׃收到q个NOTIFYQ消息)指示q在其指CZQ连接到一个特定服务器上,接着向相应的服务器请求下载服务―――下载将要执行的服务内容。服务器当然会响应这个请求。UPnP服务pȝ解释这个设备的描述部分Q请求发送更多的文gQ服务器又需要响应这些请求。这P构成一?#8220;h――响?#8221;的@环,大量占用pȝ资源Q造成UPnPpȝ服务速度变慢甚至停止。所以,q个~陷导?#8220;拒绝服务”dUCؓ可能Q?/p> <p>l束?/p> <p>UpnP正在向我们一步步走近Q现在已l是_可闻了。不久的来Q必然对我们的工作和生活产生巨大影响。也蕴含着无限商机。尽现在存在问题,也难保以后就不会再出现新的问题,但这既然体现了h的需求意向,׃有巨大的生命力,暂时的挫折不会得它停下前进的脚步!  <br></p> <img src ="http://www.shnenglu.com/killsound/aggbug/39054.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/killsound/" target="_blank">不懂^_^</a> 2007-12-19 16:47 <a href="http://www.shnenglu.com/killsound/archive/2007/12/19/39054.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Debug q行正常?Release p|的问?Debug ?Release ~译方式的本质区?/title><link>http://www.shnenglu.com/killsound/archive/2007/02/26/18997.html</link><dc:creator>不懂^_^</dc:creator><author>不懂^_^</author><pubDate>Mon, 26 Feb 2007 08:57:00 GMT</pubDate><guid>http://www.shnenglu.com/killsound/archive/2007/02/26/18997.html</guid><wfw:comment>http://www.shnenglu.com/killsound/comments/18997.html</wfw:comment><comments>http://www.shnenglu.com/killsound/archive/2007/02/26/18997.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/killsound/comments/commentRss/18997.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/killsound/services/trackbacks/18997.html</trackback:ping><description><![CDATA[l常在 CSDN 上看见有人问 Debug q行正常但 Release p|的问题。以往的讨论往往是经验性的Qƈ没有指出会这L真正原因是什么,要想扑և真正的原因通常要凭q气。最q我看了一些这斚w的书Q又参考了 CSDN 上的一些帖子,然后深入研究了一下关于二者的不同。以下是我的一些体会,拿来与大家共享。?------------------------------------- 本文主要包含如下内容Q?br /> 1. Debug 和 Release ~译方式的本质区别?br />2. 哪些情况下 Release 版会出错 <br />2. 怎样"调试" Release 版的E序 -------------------------------------- <br />关于Debug和Release之本质区别的讨论 一、Debug 和 Release ~译方式的本质区别 Debug 通常UCؓ调试版本Q它包含调试信息Qƈ且不作Q何优化,便于E序员调试程序。Release UCؓ发布版本Q它往往是进行了各种优化Q得程序在代码大小和运行速度上都是最优的Q以便用户很好地使用。 Debug 和 Release 的真正秘密,在于一l编译选项。下面列Z分别针对二者的选项Q当焉此之外还有其他一些,?Fd /FoQ但区别q不重要Q通常他们也不会引起 Release 版错误,在此不讨论) Debug 版本Q?MDd /MLd 或?MTd 使用 Debug runtime library(调试版本的运行时d数库) /Od 关闭优化开?D "_DEBUG" 相当于?define _DEBUG,打开~译调试代码开?主要针对 assert函数) /ZI 创徏 Edit and continue(~辑l箋)数据库,q样在调试过 E中如果修改了源代码不需重新~译 /GZ 可以帮助捕获内存错误 /Gm 打开最化重链接开养I减少链接旉 Release 版本Q?MD /ML 或?MT 使用发布版本的运行时d数库 /O1 或?O2 优化开养I使程序最或最快?D "NDEBUG" 关闭条g~译调试代码开?即不~译assert函数) /GF 合ƈ重复的字W串Qƈ字W串帔R攑ֈ只读内存Q防止 被修改 实际上,Debug 和 Release q没有本质的界限Q他们只是一l编译选项的集合,~译器只是按照预定的选项行动。事实上Q我们甚臛_以修改这些选项Q从而得C化过的调试版本或是带跟踪语句的发布版本。 二、哪些情况下 Release 版会出错 有了上面的介l,我们再来逐个对照q些选项看看 Release 版错误是怎样产生的?. Runtime LibraryQ链接哪U运行时d数库通常只对E序的性能产生影响。调试版本的 Runtime Library 包含了调试信息,q用了一些保护机制以帮助发现错误Q因此性能不如发布版本。编译器提供的 Runtime Library 通常很稳定,不会造成 Release 版错误;倒是׃ Debug 的 Runtime Library 加强了对错误的检,如堆内存分配Q有时会出现 Debug 有错但 Release 正常的现象。应当指出的是,如果 Debug 有错Q即使 Release 正常Q程序肯定是有 Bug 的,只不q可能是 Release 版的某次q行没有表现出来而已。?. 优化Q这是造成错误的主要原因,因ؓ关闭优化时源E序基本上是直接译的,而打开优化后编译器会作Zpd假设。这c错误主要有以下几种Q?1) 帧指?Frame Pointer)省略Q简UWFPO Q:在函数调用过E中Q所有调用信息(q回地址、参敎ͼ以及自动变量都是攑֜栈中的。若函数的声明与实现不同Q参数、返回倹{调用方式)Q就会生错误————但 Debug 方式下,栈的讉K通过 EBP 寄存器保存的地址实现Q如果没有发生数l越界之cȝ错误Q或是越?不多"Q,函数通常能正常执行;Release 方式下,优化会省略 EBP 栈基址指针Q这样通过一个全局指针讉K栈就会造成q回地址错误是程序崩溃。C++ 的强cdҎ能查出大多数这L错误Q但如果用了强制cd转换Q就不行了。你可以在 Release 版本中强制加入?Oy- ~译选项来关掉指针省略Q以定是否此类错误。此c错误通常有:<br /><br /> ● MFC 消息响应函数书写错误。正的应ؓ afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM lparam); ON_MESSAGE 宏包含强制类型{换。防止这U错误的Ҏ之一是重定义 ON_MESSAGE 宏,把下列代码加刊Wstdafx.h 中(?include "afxwin.h"之后Q?函数原Ş错误时编译会报错 #undef ON_MESSAGE #define ON_MESSAGE(message, memberFxn) \ { message, 0, 0, 0, AfxSig_lwl, \ (AFX_PMSG)(AFX_PMSGW)(static_cast< LRESULT (AFX_MSG_CALL \ CWnd::*)(WPARAM, LPARAM) > (&memberFxn) }, (2) volatile 型变量:volatile 告诉~译器该变量可能被程序之外的未知方式修改Q如pȝ、其他进E和U程Q。优化程序ؓ了ɽE序性能提高Q常把一些变量放在寄存器中(cM于 register 关键字)Q而其他进E只能对该变量所在的内存q行修改Q而寄存器中的值没变。如果你的程序是多线E的Q或者你发现某个变量的g预期的不W而你信已正的讄了,则很可能遇到q样的问题。这U错误有时会表现为程序在最快优化出错而最优化正常。把你认为可疑的变量加上 volatile 试试。?3) 变量优化Q优化程序会Ҏ变量的用情况优化变量。例如,函数中有一个未被用的变量Q在 Debug 版中它有可能掩盖一个数l越界,而在 Release 版中Q这个变量很可能被优化调Q此时数l越界会破坏栈中有用的数据。当Ӟ实际的情况会比这复杂得多。与此有关的错误有:<br /><br /> ● 非法访问,包括数组界、指针错误等?<br />例如 void fn(void) { int i; i = 1; int a[4]; { int j; j = 1; } a[-1] = 1;//当然错误不会q么明显Q例如下标是变量 a[4] = 1; } j 虽然在数l越界时已出了作用域Q但其空间ƈ未收回,因而 i 和 j ׃掩盖界。而 Release 版由于 i、j q未其很大作用可能会被优化掉Q从而栈被破坏。?. _DEBUG 与 NDEBUG Q当定义了 _DEBUG Ӟassert() 函数会被~译Q而 NDEBUG 时不被编译。除此之外,VC++中还有一pd断言宏。这包括Q ANSI C 断言 void assert(int expression ); C Runtime Lib 断言 _ASSERT( booleanExpression ); _ASSERTE( booleanExpression ); MFC 断言 ASSERT( booleanExpression ); VERIFY( booleanExpression ); ASSERT_VALID( pObject ); ASSERT_KINDOF( classname, pobject ); ATL 断言 ATLASSERT( booleanExpression ); 此外QTRACE() 宏的~译也受 _DEBUG 控制。 所有这些断a都只在 Debug版中才被~译Q而在 Release 版中被忽略。唯一的例外是 VERIFY() 。事实上Q这些宏都是调用了 assert() 函数Q只不过附加了一些与库有关的调试代码。如果你在这些宏中加入了ME序代码Q而不只是布尔表达式(例如赋倹{能改变变量值的函数调用 {)Q那么 Release 版都不会执行q些操作Q从而造成错误。初学者很Ҏ犯这c错误,查找的方法也很简单,因ؓq些宏都已在上面列出Q只要利用 VC++ 的 Find in Files 功能在工E所有文件中扑ֈ用这些宏的地方再一一查即可。另外,有些高手可能q会加入 #ifdef _DEBUG 之类的条件编译,也要注意一下。 顺便值得一提的是 VERIFY() 宏,q个宏允怽程序代码放在布表辑ּ里。这个宏通常用来查 Windows API 的返回倹{有些h可能个原因而滥用 VERIFY() Q事实上q是危险的,因ؓ VERIFY() q反了断a的思想Q不能ɽE序代码和调试代码完全分,最l可能会带来很多ȝ。因此,专家们徏议尽量少用这个宏。?. /GZ 选项Q这个选项会做以下q些事?1) 初始化内存和变量。包括用 0xCC 初始化所有自动变量,0xCD ( Cleared Data ) 初始化堆中分配的内存Q即动态分配的内存Q例如 new Q,0xDD ( Dead Data ) 填充已被释放的堆内存Q例如 delete Q,0xFD( deFencde Data ) 初始化受保护的内存(debug 版在动态分配内存的前后加入保护内存以防止越界访问)Q其中括号中的词是微软徏议的助记词。这样做的好处是q些值都很大Q作为指针是不可能的Q而且 32 位系l中指针很少是奇数|在有些系l中奇数的指针会产生q行旉误)Q作为数g很少遇到Q而且q些g很容易L认,因此q很有利于在 Debug 版中发现 Release 版才会遇到的错误。要特别注意的是Q很多h认ؓ~译器会用? 来初始化变量Q这是错误的Q而且q样很不利于查找错误Q。?2) 通过函数指针调用函数Ӟ会通过查栈指针验证函数调用的匹配性。(防止原Ş不匹配) (3) 函数q回前检查栈指针Q确认未被修攏V(防止界讉K和原形不匚wQ与W二合在一起可大致模拟帧指针省略 FPO Q 通常 /GZ 选项会造成 Debug 版出错而 Release 版正常的现象Q因为 Release 版中未初始化的变量是随机的,q有可能使指针指向一个有效地址而掩盖了非法讉K。 除此之外,/Gm /GF {选项造成错误的情冉|较少Q而且他们的效果显而易见,比较Ҏ发现。 三、怎样"调试" Release 版的E序 遇到 Debug 成功但 Release p|Q显然是一件很沮的事Q而且往往无从下手。如果你看了以上的分析,l合错误的具体表玎ͼ很快扑և了错误,固然很好。但如果一时找不出Q以下给Z一些在q种情况下的{略。?. 前面已经提过QDebug 和 Release 只是一l编译选项的差别,实际上ƈ没有什么定义能区分二者。我们可以修改 Release 版的~译选项来羃错误范围。如上所qͼ可以把 Release 的选项逐个 注:那篇文章到此完了,好像q有一些没了?<br /><br />在VC中当整个工程较大Ӟ软g时常为出现在DEBUG状态下能运行而在RELEASE状态下无法q行的情c由于开发者通常在DEBUG状态下开发YӞ所以这U情冉|常是在我们辛苦工作一两个月后Q满怀信心的准备将软g发行时发生。ؓ了避免无谓的损失Q我们最好进行以下的? 1、时常测试Y件的两种版本。?、不要轻易将问题归结为DEBUG/RELEASE问题Q除非你已经充分对两U版本进行了试。?、预处理的不同,也有可能引vq样的问题。出现问题的一U可能性是在不同版本的~译间定义了不同的预处理标记。请对你的DEBUG版本的Y件试一下以下改动: ?Project Setting(ALT-F7)" 中的C/C++中讄目录(category)?General"Qƈ且改?_DEBUG"定义?NDEBUG". 讄目录?Preprocessor"q且d定义"_DEBUG?Undefined Symbols"输入? 选择Rebuild ALL,重新~译. 如果l过~译的程序生了问题Q请对代码进行如下改动: ASSERT() 改ؓ VERIFY(). 扑և定义?#ifdef _DEBUG"中的代码Q如果在RELEASE版本中需要这些代码请他们移到定义外。 查找TRACE(...)中代码,因ؓq些代码在RELEASE中也不被~译。 所以请认真查那些在RELEASE中需要的代码是否q没有被便宜。?、变量的初始化所带来的不同,在不同的pȝQ或是在DEBUG/RELEASE版本间都存在q样的差异,所以请对变量进行初始化。?、是否在~译时已l有了警?请将警告U别讄??,然后保证在编译时没有警告出现. 6、是否改动了资源文g. 7、此外对RELEASE版本的Y件也可以q行调试Q请做如下改动: ?Project Settings" 中?C++/C " 目下设|?category" 为?General" q且?Debug Info"讄为?Program Database". ?Link"目下选中"Generate Debug Info"查框。?Rebuild All" 如此做法会生的一些限Ӟ 无法获得在MFC DLL中的变量的倹{ 必d该Y件所使用的所有DLL工程都进行改动。 另Q MS BUGQMS的一份技术文档中表明Q在VC5中对于DLL?Maximize Speed"优化选项q未被完全支持,因此q将会引起内存错误ƈDE序崩溃?<img src ="http://www.shnenglu.com/killsound/aggbug/18997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/killsound/" target="_blank">不懂^_^</a> 2007-02-26 16:57 <a href="http://www.shnenglu.com/killsound/archive/2007/02/26/18997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一赯Z个BSTRcd转换问题 http://www.shnenglu.com/killsound/archive/2007/02/26/18989.html不懂^_^不懂^_^Mon, 26 Feb 2007 06:20:00 GMThttp://www.shnenglu.com/killsound/archive/2007/02/26/18989.htmlhttp://www.shnenglu.com/killsound/comments/18989.htmlhttp://www.shnenglu.com/killsound/archive/2007/02/26/18989.html#Feedback0http://www.shnenglu.com/killsound/comments/commentRss/18989.htmlhttp://www.shnenglu.com/killsound/services/trackbacks/18989.html 1. 使用_bstr_t解决内存问题

    COM~程当中一个重要的主题是l护 BSTR cd变量. 在一些情况下(主要是传递或者复制 BSTR cd数据的时?会生一些问?
    * 函数不能接收 BSTR cd的变量参?
    * 复制 BSTR cd数据的时候导致内存泄?

    通常使用 _bstr_t 对象可以解决q些问题, q个对象装了 BSTR 数据cd, 自动q行资源的分配合理, q且提供一个自动的数据cd转换操作.

    注意: 使用强制cd转换 _bstr_t 的方式对于 Unicode 模式链接是不适用? 需要用 Win32 模式链接. 

    此外, q里也有一个内存管理的问题, 使用赋值模式就会生内存泄?
    BSTR tmpBStr;
    m_pObject1->get_ObjectString(&tmpBStr);
    _bstr_t tmpbstr;
    tmpbstr= tmpBStr; //内存泄漏
     SetDlgItemText(IDC_CURPROPVAL, tmpbstr);

    在 tmpbstr 变量初始化的时候发生泄? 函数 SysAllocString 在创建 tmpbstr 变量的时候被自动调用. q个新申L资源以后不会释放, D内存泄漏. 

 2. BSTR 数据cd
 1) BSTR , LPWSTR 和 LPSTR
    LPSTR 是我们日常使用的一个MFC的char*指针的宏定义, LPWSTR 比 LPSTR 多一倍的资源使用, 因ؓ它和汉字一样用双字节表达一个字W? BSTR 则额外多一个信息头部存放数据长?

 2) 如何LPSTR/LPCTSTR转换成ؓBSTR/LPWSTR
    其实MFC/ATL提供了一l宏定义用于转换q些数据cd, 因ؓ需要先使用USES_CONVERSION;? 里面调用了_alloc甌q且自动释放需要的资源, 为此你不必担心前面提到的内存l护问题:
    A2BSTR    OLE2A    T2A    W2A 
    A2COLE    OLE2BSTR T2BSTR W2BSTR 
    A2CT      OLE2CA   T2CA   W2CA 
    A2CW      OLE2CT   T2COLE W2COLE 
    A2OLE     OLE2CW   T2CW   W2CT 
    A2T       OLE2T    T2OLE  W2OLE 
    A2W       OLE2W    T2W    W2T 

    或者你可以使用MSDN里面的一个无法通过索引提到的两个函数实现字W串到BSTR的{?

    //使用 /Gr 或者?Gz ~译开? 或者包含一个 comsupp.lib p?
    #include <comutil.h>
    int main()
    {
       char sz[]="hello";
       _bstr_t b;
       b = _com_util::ConvertStringToBSTR(sz);
       char * p = _com_util::ConvertBSTRToString(b);
       return 1;
    } 


不懂^_^ 2007-02-26 14:20 发表评论
]]>
~写INF文gq行文g安装(转蝲)http://www.shnenglu.com/killsound/archive/2007/01/25/17970.html不懂^_^不懂^_^Thu, 25 Jan 2007 01:08:00 GMThttp://www.shnenglu.com/killsound/archive/2007/01/25/17970.htmlhttp://www.shnenglu.com/killsound/comments/17970.htmlhttp://www.shnenglu.com/killsound/archive/2007/01/25/17970.html#Feedback0http://www.shnenglu.com/killsound/comments/commentRss/17970.htmlhttp://www.shnenglu.com/killsound/services/trackbacks/17970.html阅读全文

不懂^_^ 2007-01-25 09:08 发表评论
]]>
InstallShield内部库函C5 Sd对话框函?/title><link>http://www.shnenglu.com/killsound/archive/2007/01/18/17745.html</link><dc:creator>不懂^_^</dc:creator><author>不懂^_^</author><pubDate>Thu, 18 Jan 2007 03:58:00 GMT</pubDate><guid>http://www.shnenglu.com/killsound/archive/2007/01/18/17745.html</guid><wfw:comment>http://www.shnenglu.com/killsound/comments/17745.html</wfw:comment><comments>http://www.shnenglu.com/killsound/archive/2007/01/18/17745.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/killsound/comments/commentRss/17745.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/killsound/services/trackbacks/17745.html</trackback:ping><description><![CDATA[ <strong> <span id="dgfiList__ctl3_Title">[转蝲]InstallShield内部库函C5 Sd对话框函?/span> <br /> </strong> <span id="dgfiList__ctl3_Body">InstallShield内部库函C5  Sd对话框函?br />    InstallShield提供一些Sd对话框函敎ͼ用户可自定义和显C。Sd对话框用可以创建用戯入的对话框的Ҏ脚本定义函数来创建。然后该对话框根据所作选择q回值给脚本?br />    Sd对话框有一个Cancel按钮Q当它被选中时不q回一个CANCEL倹{而是调用~省的退出处理?br />下面是所有有效的Sd对话框函数的列表Q?br />DialogSetInfo<br />改变׃些内部对话框函数呈现的对话框的显C元素?br />SdAskDestPath<br />呈现一个对话框Q允许最l用h定安装的一个目标位|?br />SdAskOptions<br />创徏一个对话框Q它比标准AskOptions函数更灵zR?br />SdAskOptionsList<br />呈现一个对话框Q允许最l用户选定和撤消选定一个列表中的项目?br />SdBitmap<br />在对话框中显CZ个位图?br />SdComponentDialog<br />昄一个对话框Q允许最l用户选择安装的组件和目标文g夏V?br />SdComponentDialog2<br />昄一个对话框Q允许最l用户选择要安装的文g夏V组件和子部件?br />SdComponentDialogAdv<br />昄一个对话框Q允许最l用户选择安装的组件和目标文g夏V?br />SdComponentMult<br />昄一个对话框Q允许最l用户选择安装的组件和子部件。有关磁盘空间的附加信息也被提供来确定安装的最佳位|?br />SdComponentTree<br />昄一个有树Ş控制控g的对话框Q允许最l用户选择安装的组件和子部件。有关磁盘空间的附加信息也被提供来确定安装的最佳位|?br />SdConfirmNewDir<br />提示用户认文g夹的选择?br />SdConfirmRegistration<br />提示最l用L认输入到由SdRegisterUser或SdRegisterUserEx呈现对话框中的信息?br />SdDisplayTopics<br />昄主题列表?br />SdExceptions<br />昄一个对话框Q通知最l用户遇C个共享、锁定(在用中Q或只读文g?br />SdFinish<br />昄一个对话框Q通知最l用户安装完成ƈ提供一个选项的选择Q如是否要查看信息文件或q行一个应用程序?br />SdFinishEx<br />昄一个对话框Q通知最l用户安装完成?br />SdFinishReboot<br />昄一个对话框Q通知用户安装完成q提供一个重启Windows 和计机选项的选择?br />SdInit<br />准备一个调用Sd对话框函数的安装?br />SdLicense<br />昄一个许可证协议q给最l用户一个接受或拒绝许可证条Ƅ选项?br />SdLoadString<br />q回和一个指定资源ID相联pȝ字符串倹{?br />SdMakeName<br />创徏一个自定义对话框的节名。该节名在向一?.iss文g写或从一?iss文gL使用?iss文g?InstallShield Silent使用?br />SdOptionsButtons<br />昄一个有用户定义按钮的对话框Q提供给最l用户不同选择?br />SdProductName<br />在脚本对话框的特定静态区中插入你的品名?br />SdRegisterUser<br />昄一个可输入用户名和公司名的对话框?br />SdRegisterUserEx<br />昄一个对话框Q最l用户可在里面输入用户姓名、公司名U和应用E序序列受?br />SdSelectFolder<br />呈现一个对话框Q允许最l用户从E序文g夹列表中选择一个文件夹?br />SdSetupType<br />昄一个对话框Q最l用戯选择三种标准安装cd之一Q典型、简易或自定义?br />SdSetupTypeEx<br />昄一个对话框Q允许最l用户选择标准或自定义安装cd?br />SdShowAnyDialog<br />昄一个资源DLL的通用对话框。当用SdShowAnyDialog函数昄一个对话框时你不能从最l用h受Q何输入?br />SdShowDlgEdit1<br />昄一个对话框Q它有一个单行的~辑区和其它静态控件?br />SdShowDlgEdit2<br />昄一个对话框Q有两个单行的编辑区和其它静态控件?br />SdShowDlgEdit3<br />昄一个对话框Q有三个单行的编辑区和其它静态控件?br />SdShowFileMods<br />呈现一个对话框Q预览对文g的可能修改ƈ允许最l用户同意修攏V拒l修Ҏ要求修改写C个文件中?br />SdShowInfoList<br />在一个对话框中显CZ个可滚动的消息列表?br />SdShowMsg<br />在一个小H口中显CZ个消息?br />SdStartCopy<br />呈现一个对话框Q显C已l由最l用h定的选项和设|?br />SdWelcome<br />昄一个通用Ƣ迎?br />SdWelcomeMaint<br />昄一个在l护安装开始时使用的对话框?br />5.1  DialogSetInfo<br />语法QDialogSetInfo (nInfoType, szInfoString, nParameter);<br />说明QDialogSetInfo函数修改下列在InstallShield对话框中昄的元Ӟ<br />昄的图象;<br />得到最l用户选择的复选框的风|<br />指示有效和所需盘I间值的_ֺ?br />    通过调用DialogSetInfo产生的修改对安装的剩余部分保持ؓ有效或直到它们又被随后的对DialogSetInfo的调用修攏V如果你的脚本在调用MSd对话框函数前调用DialogSetInfoQ在 DialogSetInfo的调用前必须先调用SdInit。否则,对DialogSetInfo的调用无效?br />参数Q?br />nInfoType<br />指定要修改的昄特征。在该参C|传递下列预定义的常量之一Q?br />DLG_INFO_USEDECIMALQ缺省时Q显C的指示lg大小、有效磁盘空间和所需盘I间的D四舍五入到最q的KB或MB。下列对话框受该参数影响QComponentDialog, SdComponentDialog, SdComponentDialog2, SdComponentDialogAdv 和SdComponentMult?br />DLG_INFO_KUNITSQ缺省时Q显C的指示lg大小、有效磁盘空间和所需盘I间的gKB为度量。传递该参数同时nParameter讄为FALSE时则以MB为度量显C些倹{下列对话框受该参数影响QSdComponentTree, ComponentDialog, SdComponentDialog, SdComponentDialog2, SdComponentDialogAdv 和SdComponentMult?br />DLG_INFO_ALTIMAGEQ指定一个显C在该对话框中的候选位图。如果nParameter讄为TRUEQszInfoString必须指定在该对话框显C的图象。该参数应用于所有在对话框右上角昄标准安装图象的InstallShield对话框(和图象显C在对话框左边一个大图象的右上角的Welcome, SdWelcome和SdFinish对话框)。更多的信息可查看下面参数nParameter处描q的"当nInfoType是.DLG_INFO_ALTIMAGE"?br />    由SetDisplayEffect讄的显C效果不能应用到交替图象,通常它们昄时没有Q何特D效?<br />DLG_INFO_CHECKSELECTIONQ指定选择Ҏ由nParameter传递的帔R定。注意SdComponentTree不支持改变复选框cd?br />szInfoString<br />当DLG_INFO_ALTIMAGE传递给nInfoTypeӞ该参数指定要昄的候选位囄文g名和一l位囑ֱ性(可选)。如果包括了位图属性,传递给该参数的字符串必d下格式化Q?br /> "位图文g名;透明标志Q?lt;未用>Q?lt;未用>Q透明?<br />位图文g名:<br />指定位图文g名。如果文件名未限定(也就是说Q如果它不包括一个驱动器指示W和路径Q,InstallShield在SUPPORTDIR查找该位图?br />透明标志Q?br />指示是否透明昄位图。当该标志是1Q真Q时Q该位图中所有其颜色是由szInfoString的透明色参数指定的RGB值的部分都透明昄。该参数~省?Q非透明Q?br />未用Q?br />格式行的q些部分都被忽略Q但它们必须被包括。也是_格式行串必须包括四个分号Q三个分号在透明标志和透明色之间?br />透明Ԍ<br />指示透明昄的颜艌Ӏ透明色必ȝ一个RGB值来表示Q也是Q三个数值型值由逗号分隔。如果没有指定|即透明标志讄?Q位图也不会被透明昄?br />    下面的例子将昄MyBitmap.bmp文g的位图,它位于SUPPORTDIR文g夏V位图所有黑色部分(RGBgؓ0Q?Q?Q将被透明昄?br />"MyBitmap.bmp;1;;;0,0,0"<br />注意Q标准位图ؓ57×53。一个候选位囑ֿMU是q个大小。如果位囑֤于这个大,它会在标题区中垂直置中,位图的右边将和对话框的右边对齐。(在Welcome, SdWelcome, ?SdFinish对话框中Q位囄双和它所呈现在的更大的位囄双寚wQ。位囑ַ边将可能扩展到对话框左辏V位图扩展在对话框标题区下的M部分被剪切掉。如果位囑ְ?7×53Q它被正确昄Q但它将不被调整大小或被扩展?br />    当缺省位图被重新装入或nInfoType不是DLG_INFO_ALTIMAGE时该参数被忽?br />nParameter<br />和nInfoType相联pMh指定对话框特性?br />当nInfoType是DLG_INFO_CHECKSELECTIONӞ传递下列预定义帔R之一来指定复选框风格Q?br />CHECKBOXQ指定Windows 3.1风格的复选框?br />CHECKBOX95Q指定标准(Windows 95 风格Q复选框。如果不调用DialogSetInfoQ这是缺省的复选框风格?br />CHECKLINEQ指定复选行风格的复选框?br />CHECKMARKQ指定复选标记风格的复选框?br />当nInfoType是DLG_INFO_ALTIMAGEQ传递下列预定义帔R之一来指定显CZ图:<br />-1Q指定对话框必须昄~省位图?br />TRUEQ指定由szInfoString指示的位囑ֿd随后的对话框中用,如前面在szInfoString下描q的一栗?br />当nInfoType是DLG_INFO_KUNITS 或DLG_INFO_USEDECIMALӞ传递下列预定义帔R之一来指定大如何显C:<br />TRUEQ指定大按照nInfoType指示的显C?br />FALSEQ指定大按照缺省风格显C?br />q回|<br />0  表明函数成功讄了指定的风格?br />< 0  表明函数未能讄该风根{?br />注解Q?br />·为预览调用DialogSetInfo的效果,q行InstallShield范例Q改变对话框的属性(通过单击属性按钮)Q然后检验如SdComponentDialog2?SdComponentMult的对话框的改变?br />·每次你要改变一个对话框的细节方面时都必调用DialogSetInfo?br />你可以用DLG_INFO_ALTIMAGE参数来激z?6艌Ӏ?56色或真彩Ԍ24位)的位图。注意当256色的位图?6色系l中昄或真彩色位图?56色系l中昄时会有颜色失真。徏议你指定一与目标系l的颜色模式兼容的候选图象?br />5.2  SdAskDestPath<br />语法QSdAskDestPath (szTitle, szMsg, svDir, nReserved);<br />说明QSdAskDestPath函数创徏一个对话框Q允许最l用户选择一个候选目标\径。当你单d话框中的览按钮QSelectDir函数被调用来打开一个二ơ对话框使最l用户可以选择一个存在的文gҎ输入一个新的文件夹名?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?选择文g?Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定昄在对话框的文本。该文本被考虑Z个静态控件。在你的消息字符串中使用%P位置Ҏ插入已经由先前的一个对SdProductName的调用指定的产品名称Q如果有Q。ؓ昄对话框的~省指示Q传递一个空字符?"")?br />svDir<br />指定~省选定的目录名。返回由最l用户选定的目录名?br />nReserved<br />l该参数传?。不允许其它倹{?br />q回|<br />NEXT (1)Q指定Next按钮被单凅R?br />BACK (12)Q指定Back按钮被单凅R?br />注解Q?br />·q行在静止方式的安装E序必须创徏在调用SdAskDestPath前不存在的新文g夏V这样可以确保确认对话框不被昄。没有这一步骤Q则需要两个响应文件来处理两种可能情况?br />5.3  SdAskOptions<br />语法QSdAskOptions (szTitle, szMsg1, szMsg2, szId, szComponents, nExclusiveFlag);<br />说明QSdAskOptions 函数创徏一个对话框Q提供安装选项。你可以使用复选框或单选钮作ؓ选择按钮。显C在按钮旁边的信息从一l选项中检索得到。选项的缺省数目是4。必要时你可以增加或减去l中选项的数目?br />    SdAskOptionsq行于由pȝ变量MEDIA指定的当前媒体上。在安装的初始化中,InstallShieldlMEDIA赋缺省媒体名Q?DATA"Q,它和你的文g媒体库(Data1.cabQ相联系。ؓ昄脚本创徏的组Ӟ可按4.6中的相同步骤q行Q?br />  如果你的安装不用一个安装类型的对话框,你必d调用SdAskOptions之前调用ComponentSetupTypeSet来指定一个已l在IDE安装cdH格中定义的安装cd<br />  pȝ变量MEDIA的值在安装初始化过E中被设|ؓ'DATA'。如果你改变该变量的值来指向一个脚本创建组件组Q你必须在调用ComponentTransferData, CreateShellObjects, ?CreateRegistrySet前将g改回'DATA'。注意运行一个基于事件的脚本的安装中QComponentTransferData被自动调用?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?选择lg"Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg1<br />指定昄在对话框的消息。该静态区的ID?01。ؓ昄该对话框的缺省指C,l该参数传递一个空字符?"")?br />szMsg2<br />指定在对话框昄的一个二ơ消息。该静态区的ID?02?br />SzId<br />指定一个候选数值型对话框ID。仅使用以字W串形式表示的数值型IDQ例如,ID 13001 ?13001"Q。你可以拯SdAskOptions对话框资源,对它做有限的修改Q给它一个唯一数值型IDQƈ通过以字W串传递它的IDlszId来调用对话框。参考下面的注解部分。ؓ创徏标准的四选项的SdAskOptions对话框,l该参数传递一个空字符?"")?br />szComponents<br />指定要显C的包含子部件的lg名称。子部g前面有复选框或单选钮。ؓ昄所有顶层组Ӟl该参数传递一个空字符Ԍ""Q?br />SdAskOptions在由pȝ变量MEDIA指定的文件媒体库或脚本创建组件组中查找所需lg?br />nExclusiveFlag<br />指定你要在对话框中显C的按钮cd。在该参C|传递下列预定义帔R之一Q?br />EXCLUSIVEQ指定单选钮?br />NONEXCLUSIVEQ指定复选框?br />  如果你的安装包括必需的可见的lgQ不要调用SdAskOptions来得到安装选项。而是Q以非静止方式调用ComponentDialog, SdComponentDialog, SdComponentDialogAdv, SdComponentMult 或SdAskOptionsList?br />  必需lg可以q么理解Q当zdlgQ在lgH格中被选择的组Ӟ被安装时Q你要添加组件到必须被安装的lg列表中或从该lg列表中删除组件?br />其中控g有:<br />所需lgQ列表框Q:列出zdlg要求的组件?br />lgQ列表框Q:列出所有定义的lg。活动组件有一个复选标讎ͼ所需lg有一个红圈和斜杠?br />dQ按扭)Q将在组件列表框中选定的组件添加到所需lg列表框中?br />删除Q按扭)Q从所需列表框中删除选定的组件?br />q回|<br />NEXT (1)Q表明单MNext按钮?br />BACK (12)Q表明单MBack按钮?br />注解Q?br />·你可以通过使用资源~辑器拷贝SdAskOptions对话框资源(位于_isres.dllQ,Ҏ贝作有限的修改,q给它一个唯一ID来创建多个SdAskOptionscd的对话框。当你调用SdAskOptionsq在参数szId传递对话框的自定义拯Ӟ自定义拷贝被昄。限制对存在的静态文本区作编辑修改和增加静态文本区。不d需要处理程序的控gQ因为它需要改变SdAskOptions的资源脚本?br />5.4  SdAskOptionsList<br />语法QSdAskOptionsList (szTitle, szMsg, szComponents, nStyle);<br />说明QSdAskOptionsList函数创徏一个对话框Q显CZ个自定义安装的组件列表?br />SdAskOptionsListq行在由pȝ变量MEDIA指定的当前媒体上。在安装的初始化中,InstallShieldlMEDIA赋缺省媒体名Q?DATA"Q,它和你的文g媒体库(Data1.cabQ相联系。ؓ昄脚本创徏的组Ӟ?.6中的相同步骤q行?br />pȝ变量MEDIA的值在安装初始化过E中被设|ؓ'DATA'。如果你改变该变量的值来指向一个脚本创建组件组Q你必须在调用ComponentTransferData, CreateShellObjects, ?CreateRegistrySet前将g改回'DATA'。注意运行一个基于事件的脚本的安装中QComponentTransferData被自动调用?br />  如果你的安装不用一个安装类型对话框Q你必须在调用SdAskOptionsList前调用ComponentSetupTypeSet来指定一个已l在IDE安装cdH格中定义的安装cd?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?选择lg"Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定对话框中昄的消息。ؓ昄该对话框的缺省指C,l该参数传递一个空字符Ԍ""Q?br />szComponents<br />指定要显C的包含子部件的lg名称。ؓ昄所有顶层组Ӟl该参数传递一个空字符丌Ӏ?br />SdAskOptionsList在由pȝ变量MEDIA指定的文件媒体库或脚本创建组件组中查找所需的组件?br />nStyle<br />指定最l用L选择是否受限。在该参C|传递下列预定义帔R之一Q?br />EXCLUSIVEQ允许最l用户仅从列表中选择一个项目。如果Q何szComponents'的子部g是所需lgQ则不用EXCLUSIVE模式?br />NONEXCLUSIVEQ允许最l用户从列表中选择多个目Q包括多个非L的选项。两个按钮被昄QSelect All 和Clear All,Q允讔R过单击一个按钮选择所有选项或清除所有选项?br />q回|<br />NEXT (1)Q表明单MNext按钮?br />BACK (12)Q表明单MBack按钮?br />5.5  SdBitmap<br />语法QSdBitmap (szTitle, szMsg, szBitmap);<br />说明QSdBitmap函数在一个对话框中显CZ个位图。位图所允许的最大大是?40个像素点、高275个像素点。仅当你使用一个资源编辑器来修改SdBitmap对话框资源得显C消息的控g成ؓ可见Ӟ你才可以在SdBitmap对话框中昄一个消息,查看下面注解?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?Ƣ迎"Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />l该参数传递一个空字符?"")Q除非你使用一个资源编辑器修改SdBitmap对话框来昄一个消息,查看下面注解?br />szBitmap<br />指定要显C的位图的文件名和一l位囑ֱ性(可选)。如果包括位囑ֱ性,传递给该参数的字符串必d下格式化Q?br /> "位图文g名;透明标志'3-D标志Q背景颜?<br />位图文g?br />指定位图文g名。如果文件名未限定(也就是说Q如果它不包括一个驱动器指示W和路径Q,InstallShield在SUPPORTDIR查找该位图?br />透明标志<br />指示是否透明昄位图。当该标志是1Q真Q时Q该位图所有U色QRGB|255Q?Q?55Q部分都透明昄。该参数的缺省值是0Q非透明Q?br />3-D 标志<br />指示是否要绕着包含位图的静态区的边~增加一?-DҎ。缺省ؓQ(非3DҎQ?br />背景?br />指示作ؓ静态文本区背景的颜艌Ӏ?注意该颜色仅当位囑ְ于它所昄在的静态文本区或透明标志讄?q且位图有透明区域时才会可见。背景色必须以RGBDC,也就是三个由逗号分隔的数值型的倹{?br />  下面的例子将从MyBitmap.bmp文g昄位图Q它位于SUPPORTDIR文g夏V该位图被|于一个黑色背景上。它有一?-DҎ。该位图的Q何U色的部分将被显CZؓ背景?黑色?br />    "MyBitmap.bmp;1;1;0,0,0"<br />q回|<br />NEXT (1)Q表明单MNext按钮?br />BACK (12)Q表明单MBack按钮?br />注解Q?br />·你可以用一个资源编辑器来修改SdBitmap对话框资源,使得一个传递给参数szMsg的消息字W串在SdBitmap对话框中昄?br />·SdBitmap 对话框资源包括在_isres.dll中。该资源包含一个静态文本控Ӟ它接收由参数szMsg传递的字符丌Ӏ然而,该静态文本控件缺省ؓ在SdBitmap对话框中不可查看Q在对话框下Q。SdBitmap也用一个静态文本控件显CZ囑֛象。你可以调整位图图象静态文本控件的大小和移动消息静态文本控件进入对话框来查看?br />改变位图图象静态文本控制的大小可能影响你位囑֛象的昄。位囑֛象必够小来避免当它被SdBitmap在位囑֛象静态文本控制置中时被剪切掉?br />·该函C支持透明位图。如果你以该函数来用一个透明位图Q透明部分被正常昄?br />·SdBitmap不支持图元文件?br />5.6  SdComponentDialog<br />语法QSdComponentDialog (szTitle, szMsg, svDir, szComponents);<br />说明Q用SdComponentDialog函数创徏一个对话框。显C当前媒体上用户可以安装的的lg列表和每个组件将占用的磁盘空间。该函数和SdComponentDialogAdv相同?br />    目标目录可以使用Browse按钮来修改;在其它驱动器上的可用盘I间可以使用Disk Space 按钮来检查?br />SdComponentDialogtq行在由pȝ变量MEDIA指定的当前媒体上。在安装的初始化中,InstallShieldlMEDIA赋缺省媒体名Q?DATA"Q,它和你的文g媒体库(Data1.cabQ相联系。ؓ昄脚本创徏的组Ӟ?.6中的相同步骤q行?br />    如果你的安装不用一个安装类型的对话框,你必d调用SdComponentDialog之前调用ComponentSetupTypeSet来指定一个已l在IDE安装cdH格中定义的安装cd?br />    pȝ变量MEDIA的值在安装初始化过E中被设|ؓ'DATA'。如果你改变该变量的值来指向一个脚本创建组件组Q你必须在调用ComponentTransferData, CreateShellObjects, ?CreateRegistrySet前将g改回'DATA'。注意运行一个基于事件的脚本的安装中QComponentTransferData被自动调用?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?选择lg"Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定对话框中昄的消息。ؓ昄该对话框的缺省指C,l该参数传递一个空字符Ԍ""Q?br />svDir<br />指定~省选定的文件夹名;q回最l用户选择的文件夹名。注意由svDir指定的目标文件夹不会自动赋给TARGETDIR或其它Q何系l变量。如果它要被使用QؓsvDir值提供给安装Q你必须它赋给TARGETDIR或一个脚本定义的变量?br />    我们用户l该参数传递TARGETDIR而不是一个字W串变量。如果你在该参数不传递TARGETDIRQ当最l用户在一个不同驱动器选择一个目标时昄在对话框的所需盘I间不会被重?br />szComponents<br />指定其子部g要被昄的组件名U。ؓ昄所有主lgQ给该参C递一个空字符?"")?br />SdComponentDialog在由pȝ变量MEDIA指定的文件媒体库或脚本创建组件组中查找所需的组件?br />q回|<br />NEXT (1)Q表明单MNext按钮?br />BACK (12)Q表明单MBack按钮?br />注解Q?br />·一个组件在被选定前,其大都昄?。一旦它已经被选定Q它的实际大被昄?br />·若有必要Q组件名被截来允许昄最大可能的lg大小。显C大的必要I间依赖于最大组件大本w(2GBQ、当前用的lg大小选项、和用来在对话框昄lg信息的字体。组件大选项由DialogSetInfo函数讄?br />·一旦显C最大可能大所需的空间被定Q若有必要,所有组件名均自动被截尾以适应剩余I间。这保lg名不会覆盖组件大?br />·注意在这U方法下需要较空间显C大(或没有被选)的组件的名称仍然会被截尾。ؓ了最大化执行q确保组件名完整昄Qɾlg名小于在lg对话中的有效I间?br />·如果由svDir指定的缺省文件夹不存在于最l用Ll,除非最l用h下Browse按钮q按下列步骤从选择文g夹对话框创徏它,否则它不会被创徏。因此,无论何时用户惛_调用ComponentTransferData(必要Ӟ它会创徏文g?前指定一个要使用的缺省文件夹Qؓ了确定该文gҎ否存在,当SdComponentDialogq回旉必须调用ExistDir 。如果不存在Q调用CreatDir在最l用Ll上创徏它?br />·q行在静止方?silent mode )的安装,如果在调用SdComponentDialog前文件夹不存在,必须创徏该新文g夏V这样可以确保确认对话框不被昄。没有这一步,需要两个响应文件来处理两个可能情况?br />·Disk Space按钮的ID?01。该按钮自动昄有效盘I间对话框。如果愿意你可以删除该按?选项。目录静态区需要一个ID?51。列表框ID有一个多选项风格?br />5.7  SdComponentDialog2<br />语法QSdComponentDialog2 (szTitle, szMsg, szDir, szComponents);<br />说明QSdComponentDialog2函数创徏一个对话框Q显CZ个用户可以安装的当前媒体上的lg列表。显C在lgH口中的lg可以有子部g。如果一个组件有子部ӞChange按钮成为有效。单击Change按钮生成选择子部件对话框Q可以作q一步的选择。对每个lg和子部gQ也提供说明。当用户选择或高亮显C组件时Q其说明昄在对话框的说明区下?br />    SdComponentDialog2q行在由pȝ变量MEDIA指定的当前媒体上。在安装的初始化中,InstallShieldlMEDIA赋缺省媒体名Q?DATA"Q,它和你的文g媒体库(Data1.cabQ相联系。ؓ昄脚本创徏的组Ӟ?.6中的相同步骤q行?br />    如果你的安装不用一个安装类型的对话框,你必d调用SdComponentDialog之前调用ComponentSetupTypeSet来指定一个已l在IDE安装cdH格中定义的安装cd?br />    pȝ变量MEDIA的值在安装初始化过E中被设|ؓ'DATA'。如果你改变该变量的值来指向一个脚本创建组件组Q你必须在调用ComponentTransferData, CreateShellObjects, ?CreateRegistrySet前将g改回'DATA'。注意运行一个基于事件的脚本的安装中QComponentTransferData被自动调用?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?选择lg"Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定对话框中昄的消息。ؓ昄该对话框的缺省指C,l该参数传递一个空字符Ԍ""Q?br />szDir<br />指定目标目录的名Uͼ目标位置Q。注意由svDir指定的目标文件夹不会自动赋给TARGETDIR或其它Q何系l变量。如果它要被使用QؓsvDir值提供给安装Q你必须它赋给TARGETDIR或一个脚本定义的变量?br />szComponents<br />指定其子部g要被昄的组件名U。ؓ昄所有主lgQ给该参C递一个空字符?"")?br />    SdComponentDialog2在由pȝ变量MEDIA指定的文件媒体库或脚本创建组件组中查找所需的组件?br />q回|<br />NEXT (1)Q表明单MNext按钮?br />BACK (12)Q表明单MBack按钮?br />注解Q?br />·一个组件在被选定前,其大都昄?。一旦它已经被选定Q它的实际大被昄?<br />·若有必要Q组件名U被截尾来允许显C最大可能的lg大小。显C大的必要I间依赖于最大组件大本w(2GBQ,当前使用的组件大选项Q和用来在对话框昄lg信息的字体。组件大选项由DialogSetInfo函数讄?br />·一旦显C最大可能大所需的空间被定Q若有必要,所有组件名均自动被截尾以适应剩余I间。这保lg名不会覆盖组件大?br />·注意在这U方法下需要较空间显C大(或没有被选)的组件的名称仍然会被截尾。ؓ了最大化执行q确保组件名完整昄Qɾlg名小于在lg对话框中的有效空间?br />·当且仅当被选定的组件有M子部件时Change按钮才ؓ有效。否则,它将变灰?br />·如果一个组件被撤消选定Q它的子部g也必ȝ省ؓ撤消选定。同LQ如果一个组件的所有子部g~省为撤消选定Q则父组件也必须~省为撤消选定。有关组件和子部件的~省选定讄请参考ComponentAddItem函数?br />·当用户选定一个显C在对话框中的组件或子部件时Q缺省选定讄被清除。如果用h消选定一个组Ӟ所有它的子部g也将被撤消选定。如果用h消选定一个组件的所有子部gQ该lg也将被撤消选定?br />5.8  SdComponentDialogAdv<br />语法QSdComponentDialogAdv (szTitle, szMsg, svDir, szComponents);<br />说明Q用SdComponentDialogAdv函数创徏一个对话框。显C当前媒体上用户可以安装的组件列表和每个lg占用的盘I间。该函数和SdComponentDialog相同?br />    目标目录可以使用Browse按钮来修改:同时在其它驱动器上的可用盘I间可以使用Disk Space 按钮来检查?br />SdComponentDialogtAdvq行在由pȝ变量MEDIA指定的当前媒体上。在安装的初始化中,InstallShieldlMEDIA赋缺省媒体名Q?DATA"Q,它和你的文g媒体库(Data1.cabQ相联系。ؓ昄脚本创徏的组Ӟ?.6中的相同步骤q行?br />  如果你的安装不用一个安装类型的对话框,你必d调用SdComponentDialog之前调用ComponentSetupTypeSet来指定一个已l在IDE安装cdH格中定义的安装cd?br />    pȝ变量MEDIA的值在安装初始化过E中被设|ؓ'DATA'。如果你改变该变量的值来指向一个脚本创建组件组Q你必须在调用ComponentTransferData, CreateShellObjects, ?CreateRegistrySet.前将g改回'DATA'。注意运行一个基于事件的脚本的安装中QComponentTransferData被自动调用?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?选择lg"Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定对话框中昄的消息。ؓ昄该对话框的缺省指C,l该参数传递一个空字符Ԍ""Q?br />svDir<br />指定~省选定的文件夹名;q回最l用户选择的文件夹名。注意由svDir指定的目标文件夹不会自动赋给TARGETDIR或其它Q何系l变量。如果它要被使用QؓsvDir值提供给安装Q你必须它赋给TARGETDIR或一个脚本定义的变量?br />    我们用户l该参数传递TARGETDIR而不是一个字W串变量。如果你在该参数不传递TARGETDIRQ当最l用户在一个不同驱动器选择一个目标时昄在对话框的所需盘I间不会被重?br />szComponents<br />指定其子部g要被昄的组件名U。ؓ昄所有主lgQ给该参C递一个空字符?"")?br />SdComponentDialogAdv在由pȝ变量MEDIA指定的文件媒体库或脚本创建组件组中查找所需的组件?br />q回|<br />NEXT (1)Q表明单MNext按钮?br />BACK (12)Q表明单MBack按钮?br />注解Q?br />请参?.7?br />5.9  SdComponentMult<br />语法QSdComponentMult (szTitle, szMsg, szTargetDir, szComponents);<br />说明QSdComponentMult函数创徏一个对话框Q提供给最l用户一个选项来从当前媒体上的一个组件和子部件列表中选择。对话框有两个子H口。如果被选定的组件有子部Ӟ它们在第二个H口中显C。对话框也显C所需的磁盘空_依赖于被选定的组件和子部Ӟ和目标目录的I闲盘I间来在安装q程中提供帮助。组件和/或子部g的说明可以通过单击它的名称在说明区中查看?br />有关lg和子部g的详l情况请参阅7.1?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?选择lg"Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定对话框中昄的消息。ؓ昄该对话框的缺省指C,l该参数传递一个空字符Ԍ""Q?br />szTargetDir<br />指定应用程序安装到的目标文件夹名。注意由svTargetDir指定的目标文件夹不会自动赋给TARGETDIR或其它Q何系l变量。如果它要被使用QؓsvTargetDir值提供给安装Q你必须它赋给TARGETDIR或一个脚本定义的变量?br />szComponents<br />指定其子部g要被昄的组件名U。ؓ昄所有主lgQ给该参C递一个空字符?"")?br />SdComponentMult在由pȝ变量MEDIA指定的文件媒体库或脚本创建组件组中查找所需的组件?br />    太长不能适应选择H口的组件名被从右截尾以适应有效I间?br />q回|<br />NEXT (1)Q表明单MNext按钮?br />BACK (12)Q表明单MBack按钮?br />注解Q?br />请参?.7?br />5.10  SdComponentTree<br />语法QSdComponentTree (szTitle, szMsg, szDir, szComponents, nLevel);<br />说明QSdComponentTree函数昄一个对话框Q它包含下列内容Q?br />一个树形控Ӟ最l用户可以在其中选定在他们系l上需要的lg和不选定在他们系l上不需要的lg?br />选定lg的说明(lg属性说明文本)?br />需要用来执行树形控件中指定的文件操作的盘I间Q和由szDir指定路径的磁盘的有效I间。(所需盘I间的计考虑在szDir指定的磁盘的的大小。)<br />SdComponentTreeq行在由pȝ变量MEDIA指定的当前媒体上。在安装的初始化中,InstallShieldlMEDIA赋缺省媒体名Q?DATA"Q,它和你的文g媒体库(Data1.cabQ相联系。ؓ昄脚本创徏的组Ӟ?.6中的相同步骤q行?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?选择lg"Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定对话框中昄的消息。ؓ昄该对话框的缺省指C,l该参数传递一个空字符Ԍ""Q。szDir<br />指定在计所需和有效磁盘空间中用到的磁盘的路径?br />szComponents<br />指定其子部g要被昄的组件名U。ؓ昄所有主lgQ给该参C递一个空字符?"")?br />nLevel<br />指定当对话框W一ơ被昄时在树Ş控g中打开多少层组件和子部件。(例如QnLevel?Q则对话框首ơ显C时Q第三和更低层的子部件在树Ş控g中被关闭。)<br />q回|<br />NEXT (1)Q表明单MNext按钮?br />BACK (12)Q表明单MBack按钮?br />5.11  SdConfirmNewDir<br />语法QSdConfirmNewDir (szTitle, szDir, nReserved);<br />说明QSdConfirmNewDie函数创徏一个对话框Q显CZ个文件夹名和一个确认的提示。如果最l用户单击Yes按钮Q则一个新文g夹自动由该函数创建?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?认新文件夹"Q?Q给该参C递一个空字符Ԍ""Q?br />szDir<br />指定要确认的目录名称。(通过调用SdAskDestPath来得到该信息Q?br />nReserved<br />l该参数传?。不允许其它倹{?br />q回|<br />YES (1)Q表明单MYes按钮q且目录已经被确认ƈ被创徏?br />NO (0)Q表明单MNo按钮Qƈ且指定的目录不会被创建?br /><0Q表明Yes被选定了但函数未能创徏新目录?br />5.12  SdConfirmRegistration<br />语法QSdConfirmRegistration (szTitle, szName, szCompany, szSerial, nReserved);<br />说明QSdConfirmRegistration函数创徏一个对话框Q显C用户名、公司名U和序列受如果在该对话框的Q何区域输入一个空字符Ԍ""Q,昄的区域将为空?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?注册认可"Q?Q给该参C递一个空字符Ԍ""Q?br />szName<br />指定最l用户姓名?br />szCompany<br />指定公司名称?br />szSerial<br />指定序列受如果该参数包含一个空字符Ԍ""Q,序列号区不在对话框显C?br />nReserved<br />l该参数传?。不允许其它倹{?br />q回|<br />YES (1)Q表明单击Yes按钮?br />NO (0)Q表明单击No按钮?br />注解Q?br />·为得到序列号和最l用L姓名和公司名Q调用SdRegisterUserEx。只要得到姓名和公司名,调用SdRegisterUser?br />5.13  SdDisplayTopics<br />语法QSdDisplayTopics (szTitle, szMsg, listTopics, listDetails, nReserved);<br />说明QSdDisplayTopics 函数创徏一个对话框Q显C基于主题数据(资料Q的信息。对话框提供一个标题然后是标题的主题和说明。你可以修改说明文本的字体风g让它和标题(主题Q文本想区别。消息和主题标题通常是粗体。可使用该对话框昄帮助主题、例子等?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?自定义安装帮?Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定对话框中昄的消息。ؓ昄该对话框的缺省指C,l该参数传递一个空字符Ԍ""Q?br />listTopics<br />指定要显C的包含主题的字W串列表?br />listDetails<br />指定包含每个主题的说明的字符串列表?br />nReserved<br />l该参数传?。不允许其它倹{?br />q回|<br />NEXT (1)Q表明单MNext按钮?br />BACK (12)Q表明单MBack按钮?br />注解Q?br />·消息静态区必须?01为ID。主题标识符ID必须?02-849的范围之内。说明区ID必须?51-899的范围之内?br />·静态说明区的空间由对话框的大小固定。你不能动态改变listDetails列表的空间。如果主题和说明的数目小于静态区的数目,在空白区不显CZQ何内容,但对话框大小不会改变?br />5.14  SdExceptions<br />语法QSdExceptions (nExceptionType, szFilename);<br />说明QSdExceptions函数昄一个对话框Q通知最l用户遇C个共享,锁定Q在使用中)或只ȝ文gq提供适当的选项?br />参数Q?br />nExceptionType<br />指定遇到文g问题的类型。在该参C|传递下列预定义帔R之一Q?br />SHAREDQ一个共享的文gQ其引用计数器已l减??br />READONLYQ遇C个只L件?br />LOCKEDQ遇C个锁定文件?br />szFilename<br />指定遇到问题的文件名?br />q回|<br />ERR_RETRY (4)Q表明选定了Retry按钮?br />ERR_IGNORE (5)Q表明选定了Ignore按钮?br />ERR_YES (6)Q表明选定了Yes按钮?br />ERR_NO (7)Q表明选定了No按钮?br />ERR_PERFORM_AFTER_REBOOT (100)Q表明选定了Reboot按钮?br /><0Q表明对话框不能被显C?br />5.15  SdFinish<br />语法QSdFinish (szTitle, szMsg1, szMsg2, szOpt1, szOpt2, bvOpt1, bvOpt2);<br />说明QSdFinish函数昄一个对话框Q通知最l用户安装已完成q给用户信息或选择。SdFinish对话框显CZ个消息和两个复选框选择选项。例如,你可能想要提供给用户查看README文g或运行应用程序的选择?br />    为在消息中或复选框说明中插入品名Uͼ在szMsg1, szMsg2, szOpt1, 和szOpt2传递的字符串中使用位置?P?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?安装完成"Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg1<br />指定在对话框端昄的消息。ؓ昄通知用户安装完成的缺省指C,l该参数传递一个空字符Ԍ""Q?br />szMsg2<br />指定在对话框底部昄的消息。ؓ昄~省指示Q?单击Finish按钮完成安装"Q,l该参数传递一个空字符Ԍ""Q?br />szOpt1<br />指定昄在第一个复选框旁边的文本。给该参C递一个空字符?"")来隐藏复选框?br />szOpt2<br />指定昄在第二个复选框旁边的文本。给该参C递一个空字符?"")来隐藏复选框?br />bvOpt1<br />q回W一个复选框的选择状态(TRUE或FALSEQ?br />bvOpt2<br />q回W二个复选框的选择状态(TRUE或FALSEQ?br />q回|<br />NEXT (1)Q表明单MFinish按钮?br />注解Q?br />·SdFinish没有选项来终止安装和重启最l用L计算机。当SdFinishq回Ӟ安装l箋执行。当有必要提供给用户重启的选项Ӟ可用调用SdFinishReboot来代ѝ?br />·因ؓSdFinish被设计ؓ宣告安装l束Q所以Back按钮被禁用?br />5.16  SdFinishEx<br />语法QSdFinishEx (szTitle, szMsg1, szMsg2, szOpt1, szOpt2, bvOpt1, bvOpt2);<br />说明QSdFinishEx函数调用SdFinish或SdFinishReboot来显CZ个对话框Q通知最l用户安装已完成q给用户信息或选择。如果系l变量BATCH_INSTALL{于FALSEQ表明安装过E中没有遇到锁定文gQ,SdFinishEx调用SdFinish来显C对话框。如果BATCH_INSTALL{于TRUEQSdFinishEx调用SdFinishReboot来显C对话框?br />    为在消息中或复选框说明中插入品名Uͼ在szMsg1, szMsg2, szOpt1, 和szOpt2传递的字符串中使用位置?P?br />参数Q?br />参数和SdFinish的相同。如果BATCH_INSTALL{于TRUEQ这些参数被忽略q调?SdFinishReboot("","",SYS_BOOTMACHINE,"",0)?br />q回|<br />0Q表明调用了SdFinish?br />NEXT (1)Q表明调用SdFinishRebootq且最l用户不重启计算机?br /><0Q表明调用SdFinishRebootq且最l用户选择重启计算机,但重启失败?br />5.17  SdFinishReboot<br />语法QSdFinishReboot (szTitle, szMsg1, nDefOption, szMsg2, nReserved);<br />说明QSdFinishReboot函数在你的安装结֮告安装完成ƈ提供l用户重启系l的选项。重启系l允怿改Autoexec.bat,Config.sys和一?ini文g使其起作用?br />    SdFinishReboot对话框在静态文本区中显CZ个消息。用参数szMsg1和szMsg2来设|这些区域的倹{ؓ在消息中或复选框说明中插入品名Uͼ在szMsg1和szMsg2传递的字符串中使用位置?P?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?安装完成"Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg1<br />指定在对话框端昄的消息。ؓ昄通知用户安装完成的缺省指C,l该参数传递一个空字符Ԍ""Q?br />nDefOption<br />指定一个缺省单选按钮选项选择。在该参C|传递下列预定义帔R之一Q?br />SYS_BOOTMACHINEQ安装结束时重启计算机?br />0Q不重启计算机?<br />szMsg2<br />指定昄在对话框底部的文本,提供用户要做什么的信息。ؓ昄~省指示Q传递一个空字符Ԍ""Q?br />nReserved<br />l该参数传?。不允许其它倹{?br />q回|<br />WILL_REBOOTQ表明用户选择重启pȝ?br />NEXT (1)Q表明用h有选择重启pȝ或Windows?br /><0Q表明用户选择重启pȝ或WindowsQ但重启p|?br />注解Q?br />·因ؓ当其它InstallShield实例q行ӞInstallShield尽力不重启计算机,所以你必须在允许SdFinishReboot重启Windows或系l前关闭所有其它InstallShield实例。另外,你给用户的消息必要求他们以后若要重启系l,则他们必ȝ保首先关闭所有其它的应用E序?br />·InstallShield自动保锁定?dll?exe文g在下一ơ系l启动时被更新?br />·因ؓSdFinishReboot被设计ؓ宣告安装l束Q所以Back按钮被禁用?br />5.18  SdInit<br />语法QSdInit ( );<br />说明QSdInit函数准备一个调用Sd对话框函数的安装Q装入所需的资源字W串Q还原最化的InstallShieldH口Qƈ指定在Sd对话框中Windows 95风格的复选框?br />参数Q?br />该函数没有参数?br />q回|<br />0Q表明安装ؓ调用Sd对话框函C好初始化?br />1Q表明ؓ调用Sd对话框函敎ͼ安装已经被初始化?br />注解Q?br />·该函数由每个Sd函数自动调用。没有必要显式调用SdInitQ除非你的脚本在调用MSd对话框函数前调用了DialogSetInfo。这U情况下Q你的脚本必d调用DialogSetInfo前调用SdInitQ否则对DialogSetInfo的调用不起Q何作用?br />5.19  SdLicense<br />语法QSdLicense (szTitle, szMsg, szQuestion, szLicenseFile);<br />说明QSdLicense函数昄一个对话框Q包含一个在多行~辑区的许可证协议。许可证协议保存在一个由参数szLicenseFile指定的文本文件中?br />    用户可以上下滚动来阅d议,然后必须选择Yes、No或Enable、Back按钮。因可能是你显C的W一个对话框Q你可能要禁止Back按钮。如果用户选择了YesQ安装将l箋。如果用户选择了No,InstallShield显C退出安装对话框?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?软g许可证协?Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定昄在多行编辑区上方的静态文本区中的消息。ؓ昄~省指示Q传递一个空字符丌Ӏ?br />szQuestion<br />指定昄在多行编辑区下方的静态文本区中的文本。你可能在这儿放|一个问题,用户必须选择Yes ?No来响应它。ؓ昄~省指示Q给该参C递一个空字符?"")?br />szLicenseFile<br />指定包含许可证协议的文本文g名。该文g必须被加到安装文件窗g适当语言文g夹中?br />q回|<br />YES (1)Q表明用户选择了Yes按钮?br />BACK (12)Q表明用户选择了Back按钮?br />注解Q?br />·该函C能返回NOQ因为,如果用户选择了No按钮Q将昄退出安装对话框?br />·你也可以通过输入全限定名Q在引号中,或一个Universal Naming Convention (UNC)路径来指定szLicenseFile?br />·在szLicenseFile中的文本在超q?024个字W的一行后必须包含回车。该文g的文本必M1024字节为间隔读入字W串列表。如果从szLicenseFile的文本不包含回车,单词会在SdLicense对话框中意外地回l?br />5.20  SdLoadString<br />语法QSdLoadString (nID);<br />说明QSdLoadString函数q回与指定的资源ID相联pȝ字符串倹{安装引擎首先在_isuser.dllQ如果该文g存在Q中查找资源Q如果资源没有找刎ͼ安装引擎在_isres.all中查找?br />参数Q?br />nID<br />指定一个在_isuser.dll?_isres.dll中的字符串资源的标识W。一些nID的有效值可以在InstallShield  Professional  文g夹的 Script\Ifx\Include 的子文g夹的 Ifx.h文g中找到?br />q回|<br />非空字符串?br />SdLoadString成功索到字符串倹{?br />I字W串?"")<br />表明SdLoadStringp|?br />5.21  SdMakeName<br />语法QSdMakeName (svSection, szDlg, szUnused, nvDlgName);<br />说明QSdMakeName函数Z个自定义对话框创Z个节名。该节名在写C?iss文g或从中读出时被用,由InstallShiled Silent使用?br />参数Q?br />svSection<br />指定节名QInstallShield使用变量szDlg?nvDlgName来给该变量置一个|。该值由SilentReadData?SilentWriteData.使用?br />szDlg<br />指定自定义对话框的名U?br />szUnused<br />该参C使用Q给它传递一个空字符?"")?br />nvDlgName<br />指定记录SdMakeName被由szDlg命名的对话框调用的次数的计数器。InstallShield自动增加该计数器。ؓ每个自定义对话框使用一个唯一的变量名。(可参阅下面的注解Q?br />q回|  无?br />注解Q?br />·Z节被适当命名Q你必须在每个不同的自定义对话框的第四个参数使用一个唯一的变量名。做到这一点的单方法是在szDlg使用对话框名来命名该变量。例如,当szDlg?MyDlgOne",命名在第四个参数的变量ؓnvMyDlgOneQ当szDlg?MyDlgTwo"Q命名该变量为nvMyDlgTwo?br />5.22  SdOptionsButtons<br />语法QSdOptionsButtons (szTitle, szMsg, listButtons, listDescription);<br />说明QSdOptionsButtons函数昄一个对话框Q包含一到四个位图按钮和一个简短的Ҏ个按钮的文本说明?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?选择lg"Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定昄在对话框的消息。ؓ昄该对话框~省指示Q?请选择你要安装的组?Q,l该参数传递一个空字符Ԍ""Q?br />listButtons<br />指定一个包含一到四个元素的字符串列表。每个元素是一个格式化的指定显C在按钮上的位图的字W串。一个按钮将被用来显C列表中的每个字W串元素。字W串列表元素必须有下列格式:<br /> "@<位图ID>;<位图图标标志>;<透明颜色>"<br />由@W号开始字W串q后随位图ID?lt;位图图标标志>域是1Q真Q或0Q假Q,表明位图被显C时?lt;透明颜色>域指定的颜色是否要透明昄?lt;透明颜色>域指定一个RGB|它是位图的透明颜色。注意分号将ID和图标标志、图标标志和透明颜色分隔?br />更多的信息可参阅下面的注解部分?br />listDescription<br />指定一个包含一到四个字W串元素的字W串列表Q每个相对应于参数listButtons中的一个字W串。每个字W串是一个和它相应按钮一hC的文本说明?br />q回|<br />NEXT (1)Q表明单MNEXT按钮?br />BACK (12)Q表明单MBack按钮?br />101Q对应于listButtons中的W一个字W串元素的按钮被选定?br />102Q对应于listButtons中的W二个字W串元素的按钮被选定?br />103Q对应于listButtons中的W三个字W串元素的按钮被选定?br />104Q对应于listButtons中的W四个字W串元素的按钮被选定?br />注解Q?br />·虽然SdOptionsButtons可以被用ؓ一个安装类型对话框Q但q是推荐使用SdSetupTypeEx对话框来允许最l用户选择一个安装类型,因ؓ它不需要Q何用户化。注意如果你调用SdOptionsButtons来得到最l用L安装cd选择Q你必须然后调用ComponentButtons来ؓ你的安装建立选择的安装类型?br />·InstallShield提供可以被该函数调用的四个_isres.dll中的~省位图。这些位图有?2001?2004的ID和在脚本范例中相应的典型、可UL、简易和自定义安装类型?br />·如果你用该对话框作其它用途或你想要用_isres.dll中提供的cd之外的安装类型,你必d你自q自定义按钮加入到_isuser.dll对话框模板中q且然后在你的安装中包含自定义的_isuser.dll?br />·为防止用h有单M个特定按钮时退出对话框Q在你调用SdOptionsButtons前调用Disable函数来禁止Next按钮?br />5.23  SdProductName<br />语法QSdProductName (szProductName);<br />说明QSdProductName函数使得你的产品名对所有的%P位置多w有效?P位置夹在一些Sd对话框中的静态文本区中找到。另外,一些Sd对话框函敎ͼ如SdFinishQ允怽在作为函数参数的字符串中包含%P?br />参数Q?br />szProductName<br />指定被安装的产品名。该名称取代在Sd对话框的适当静态区出现的Q何品名位置夹(%PQ?br />q回|<br />该函数没有返回倹{?br />5.24  SdRegisterUser<br />语法QSdRegisterUser (szTitle, szMsg, svName, svCompany);<br />说明QSdRegisterUser函数创徏一个对话框Q检索用户姓名和公司名称。如果svName和svCompany都包含空字符ԌInstallShield从注册表中得到用户姓名和公司名U?br />    仅当两个~辑区都存在数据时Next按钮才被ȀzR如果InstallShield可以从系l查扄省姓名和公司名称QNext按钮被自动激zR完成时QSdRegisteruser调用RegDBSetDefaultRoot来将注册表开关键讄lHKEY_CLASSES_ROOT?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?用户信息"Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定昄在对话框的消息。该文本被看作ؓ一个静态控制。ؓ昄该对话框~省指示Q给该参C递一个空字符Ԍ""Q?br />svName<br />q回q戯入的姓名。注意SdRegisterUser昄该参数的初始值由用户q行~辑。如果svName和svCompany都是I字W串Q在目标pȝ注册表中被找到的用户姓名被昄来进行编辑?br />svCompany<br />q回q戯入的公司名称。注意SdRegisterUser昄该参数的初始值由用户q行~辑。如果svName和svCompany都是I字W串Q在目标pȝ注册表中被找到的公司名称被昄来进行编辑?br />q回|<br />NEXT (1)Q表明单MNEXT按钮?br />BACK (12)Q表明单MBack按钮?br />5.25  SdRegisterUserEx<br />语法QSdRegisterUserEx (szTitle, szMsg, svName, svCompany, svSerial);<br />说明QSdRegisterUserEx函数创徏一个对话框Q检索用户姓名、公司名U和序列受如果svName和svCompany都包含空字符ԌInstallShield从注册表得到用户姓名和公司名称?br />    仅当三个~辑区都存在数据时Next按钮才被ȀzR你不能让Q何区域空白?br />完成ӞSdRegisteruser调用RegDBSetDefaultRoot来将注册表开关键讄lHKEY_CLASSES_ROOT?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?用户信息"Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定昄在对话框的消息。该文本被看作ؓ一个静态控件。ؓ昄该对话框~省指示Q给该参C递一个空字符Ԍ""Q?br />svName<br />q回q戯入的姓名。注意SdRegisterUserEx昄该参数的初始值由用户q行~辑。如果svName和svCompany都是I字W串Q在目标pȝ注册表中被找到的用户姓名被昄来进行编辑?br />svCompany<br />q回q戯入的公司名称。注意SdRegisterUserEx昄该参数的初始值由用户q行~辑。如果svName和svCompany都是I字W串Q在目标pȝ注册表中被找到的公司名称被昄来进行编辑?br />svSerial<br />q回用户输入的序列号。你可以使用该信息ƈ把它写入一个文件或者把它显C在一个确认对话框中?br />q回|<br />NEXT (1)Q表明单MNEXT按钮?br />BACK (12)Q表明单MBack按钮?br />5.26  SdSelectFolder<br />语法QSdSelectFolder (szTitle, szMsg, svDefGroup);<br />说明QSdSelectFolder函数昄供选择的程序文件夹。SdSelectFolder允许你提供一个缺省选择。用户也可以输入一个新的文件夹名。SdSelectFolder仅q回被选择的或输入的文件夹名。它不能创徏文g夏V?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?选择E序文g?Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定昄在对话框的消息。该文本被看作ؓ一个静态控件。ؓ昄该对话框~省指示Q给该参C递一个空字符Ԍ""Q?br />svDefGroup<br />q回被选文件夹的名U?br />q回|<br />NEXT (1)Q表明单MNEXT按钮?br />BACK (12)Q表明单MBack按钮?br />注解Q?br />·q行在Windows NT下的一个安装中Q如果在调用SdSelectFolder前调用ProgDefGroupQ由SdSelectFolder昄的程序文件夹Q公用或专用Q将依赖于传递给ProgDefGroupType的参数?br />5.27  SdSetupType<br />语法QSdSetupType (szTitle, szMsg, svDir, nReserved);<br />说明QSdSetupType函数昄一个对话框允许最l用户选择三种标准安装cd之一Q典型、简易或自定义。这些安装选项昄时有标准描述文本。如果你惛_入其它安装类型或改变昄的安装类型名或描qͼ调用SdSetupTypeEx来替代?br />    对话框也昄一个缺省的目标路径。一个Browse按钮装入一个对话框Q允许最l用户通过输入一个新文g夹名或从一个列表中选择存在的文件夹来修改目标\径。如果最l用戯入一个不存在的文件夹名,显CZ个消息框来询问是否要创徏该文件夹。如果最l用户单击YesQ该函数自动创徏指定文g夏V指定文件夹的全限定路径在svDirq回?br />如果最l用户在使用lg对话框来选定和撤消选定与已选安装类型相联系的组件后Q返回到安装cd对话框,那么那些选择丢失。这U情况发生是因ؓSdSetupType函数每次被调用时自动Ҏ选中的安装类型复位缺省组仉项?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?安装cd"Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定昄在对话框的消息。该文本被看作ؓ一个静态控件。ؓ昄该对话框~省指示Q给该参C递一个空字符Ԍ""Q?br />svDir<br />指定一个缺省文件夹名。返回最l用h选的文g夹名?br />nReserved<br />保留为将来用。给该参C??br />q回|<br />TYPICAL (301)Q表明用户选择典型安装?br />COMPACT (302)Q表明用户选择易安装?br />CUSTOM (303)Q表明用户选择自定义安装?br />BACK (12)Q表明单击Back按钮?br />5.28  SdSetupTypeEx<br />语法QSdSetupTypeEx (szTitle, szMsg, szReserved, svSetupType, nReserved);<br />说明QSdSetupTypeEx函数昄一个对话框Q当你指定除典型、简易和自定义之外的安装cdӞ允许最l用户选择安装cd?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?安装cd"Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定昄在对话框的消息。ؓ昄该对话框~省指示Q给该参C递一个空字符Ԍ""Q?br />szReserved<br />l该参数传递一个空字符?"")。不允许其它倹{?br />svSetupType<br />指定一个缺省安装类型和q回由最l用户选择的安装类型。ؓ使在列表中的W一ơ安装ؓ~省选择Q给该参C递一个空字符?"")。在该参数返回的字符串将和在IDE中指定的安装cd名相匚w?br />nReserved<br />l该参数传?。不允许其它倹{?br />q回|<br />0Q表明SdSetupTypeEx成功?br />BACK (12)Q表明单MBack按钮?br />5.29  SdShowAnyDialog<br />语法QSdShowAnyDialog (szTitle, szID, nID, nReserved);<br />说明QSdShowAnyDialog函数昄一个自定义或改q型对话框。该函数仅推荐给高用户使用?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?Ƣ迎"Q?Q给该参C递一个空字符Ԍ""Q?br />szID<br />指定标识对话框的标识W字W串。如果该参数包含一个空字符?"")QSdShowAnyDialog使用nID的倹{?br />nID<br />指定标识对话框的数值型倹{如果szID包含一个空字符?"")Q该参数被忽略?br />nReserved<br />l该参数传?。不允许其它倹{?br />q回|<br />NEXT (1)Q表明单MNext按钮?br />BACK (12)Q表明单MBack按钮?br />注解Q?br />·Z使用SdShowAnyDialog函数Q你必须知道你希望显C的_isres.dll中的改进型对话框或_isuser.dll中的自定义对话框的ID?br />·如果对话框只有静态控Ӟ你不需要修改SdShowAnyDialog脚本文g。但如果你的对话框有其它控gQؓ了处理用L反馈Q你必须修改Sdsadlg.rul文gQ位于你的InstallShieldE序文g夹中的Script/Srt文g?<br />5.30  SdShowDlgEdit1<br />语法QSdShowDlgEdit1 (szTitle, szMsg, szField1, svEdit1);<br />说明QSdShowDlgEdit1函数创徏一个通用对话框,昄一个消息和一个单行编辑区。你可以对话框指定一个标题?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?~辑数据"Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定昄在对话框的消息。ؓ在该消息包含由先前调用SdProductName讄的品名Uͼ在该消息的Q何地Ҏ入位|夹%P。当消息被显C时Q?P׃品名UCѝ?br />szField1<br />指定昄在编辑区左边的域名。缺省的域名??Q?Qؓ昄~省名称Q给该参C递一个空字符?"")。可以被昄的字W数最大约?0。实际的最大g赖于域名中每个字W的l合宽度。如果域名超出有效空_则当对话框被昄时它从双截尾?br />svEdit1<br />指定~辑区的初始|当对话框被关闭时Q返回编辑区的倹{?br />q回|<br />NEXT (1)Q表明单MNext按钮?br />BACK (12)Q表明单MBack按钮?br />5.31  SdShowDlgEdit2<br />语法QSdShowDlgEdit2 (szTitle, szMsg, szField1, szField2, svEdit1, svEdit2);<br />说明QSdShowDlgEdit2函数创徏一个通用对话框,昄一个消息和两个单行~辑区。你可以对话框指定一个标题?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?~辑数据"Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定昄在对话框的消息。ؓ在该消息包含由先前调用SdProductName讄的品名Uͼ在该消息的Q何地Ҏ入位|夹%P。当消息被显C时Q?P׃品名UCѝ?br />szField1<br />指定昄在第一个编辑区左边的域名。缺省的域名??Q?Qؓ昄~省名称Q给该参C递一个空字符?"")。可以被昄的字W数最大约?0。实际的最大g赖于域名中每个字W的l合宽度。如果域名超出有效空_则当对话框被昄时它从双截尾?br />szField2<br />为第二个~辑区指定域名。缺省ؓ"?Q??br />svEdit1<br />指定W一个编辑区的初始|当对话框被关闭时Q返回第一个编辑区的倹{?br />svEdit2<br />指定W二个编辑区的初始|当对话框被关闭时Q返回第二个~辑区的倹{?br />q回|<br />NEXT (1)Q表明单MNext按钮?br />BACK (12)Q表明单MBack按钮?br />5.32  SdShowDlgEdit3<br />语法QSdShowDlgEdit3 (szTitle, szMsg, szField1, szField2, szField3, svEdit1, svEdit2, svEdit3);<br />说明QSdShowDlgEdit2函数创徏一个通用对话框,昄一个消息和三个单行~辑区。你可以对话框指定一个标题?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?~辑数据"Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定昄在对话框的消息。ؓ在该消息包含由先前调用SdProductName讄的品名Uͼ在该消息的Q何地Ҏ入位|夹%P。当消息被显C时Q?P׃品名UCѝ?br />szField1<br />指定昄在第一个编辑区左边的域名。缺省的域名??Q?Qؓ昄~省名称Q给该参C递一个空字符?"")。可以被昄的字W数最大约?0。实际的最大g赖于域名中每个字W的l合宽度。如果域名超出有效空_则当对话框被昄时它从双截尾?br />szField2<br />为第二个~辑区指定域名。缺省ؓ"?Q??br />szField3<br />为第二个~辑区指定域名。缺省ؓ"?Q??br />svEdit1<br />指定W一个编辑区的初始|当对话框被关闭时Q返回第一个编辑区的倹{?br />svEdit2<br />指定W二个编辑区的初始|当对话框被关闭时Q返回第二个~辑区的倹{?br />svEdit3<br />指定W三个编辑区的初始|当对话框被关闭时Q返回第三个~辑区的倹{?br />q回|<br />NEXT (1)Q表明单MNext按钮?br />BACK (12)Q表明单MBack按钮?br />5.33  SdShowFileMods<br />语法QSdShowFileMods (szTitle, szMsg, szTargetFile, szAltFile, listChanges, nvSelection);<br />说明QSdShowFileMods函数创徏一个对话框Q显CZ惌对一个文件进行的修改。下面这些选择是有效的Q?br />修改目标文g?br />修改替代文gQ它是目标文件的拯Q但非联合修攏V?br />不作M修改。SdShowFileMods不对文g作修攏V你必须使用适当的文件函数把那些修改写入你的脚本?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?修改文g"Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定昄在对话框的消息。ؓ昄该对话框的缺省指C,l该参数传递一个空字符?"")?br />szTargetFile<br />指定要修改的文g名。它和W一个单选按钮一hC?br />szAltFile<br />如果最l用户决定要作修改,指定该文件的替代名。这和W二个单选按钮一hC。ؓ使用sztargetFile指定的扩展名?bak的文件名Q给该参C递一个空字符Ԍ""Q?br />listChanges<br />指定字符串列表名Q它包含Ҏ件所作修改的列表。该列表位于一个多行编辑区Q允许最l用户选择要实现的修改?br />nvSelection<br />q回最l用户选择的按钮的IDQ?br />101Q?"让安装修?lt;szTargetFile>文g?<br />102Q?"保存?lt;szAltFile>所要求的修攏V?<br />103Q?"不作M修改?<br />q回|<br />NEXT (1)Q表明单MNext按钮?br />BACK (12)Q表明单MBack按钮?br />5.34  SdShowInfoList<br />语法QSdShowInfoList (szTitle, szMsg, listID);<br />说明QSdShowInfoList函数创徏一个对话框Q显CZ个可滚动的消息列表?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?信息"Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定昄在信息框上方一行的消息。如果消息长于一行,被从右截尾。如果消息包含一个换行符(\n)Q换行符后的文本不被昄。ؓ昄~省消息Q?Text"Q,l该参数传递一个空字符?"")?br />listID<br />指定昄在对话框的消息列表。所有显C在对话框的消息为只诅R?br />q回|<br />NEXT (1)Q表明单MNext按钮?br />BACK (12)Q表明单MBack按钮?br />注解Q?br />·多行~辑区必Mؓ只读?br />·SdShowInfoList可以昄大约多达57200个字W的列表?br />5.35  SdShowMsg<br />语法QSdShowMsg (szMsg, bShow);<br />说明QSdShowMsg函数打开或关闭一个小的非模态窗口,昄由szMsg指定的消息。当bShow为TRUEQ窗口被打开Q消息显C在H口中,q且l箋脚本中下一个语句的处理。注意SdShowMsgH口被置于安装窗口的中央。当bShow为FALSEӞszMsg被忽略ƈ且关闭SdShowMsgH口?br />参数Q?br />szMsg<br />指定昄在窗口的消息。ؓ昄~省消息("安装正查扑ַ安装的组?)Q给该参C递一个空字符?"")。当bShow为FALSE时该参数被忽略?br />bShow<br />指定是否要打开或关闭窗口。在该参C|传递下列预定义帔R之一Q?br />TRUEQ如果窗口没有打开则打开它?br />FALSEQ如果窗口打开了则关闭它?br />q回|<br />q回值Mؓ0?br />注解Q?br />·SdShowMsg函数提供了一个简单方法得脚本进El的同时Q可以将一个显CZ富资料的消息保留在屏q上?br />·当SdShowMsgH口是打开的,随后的对SdShowMsgQ第二个参数为TRUEQ的调用被忽略。ؓ改变消息Q你必须首先以第二个参数为FALSE调用SdShowMsg来关闭窗口,然后以第二个参数为TRUEQszMsg为新的消息再ơ调用SdShowMsg?br />·SdShowMsgH口水^调整大小来在一行上昄szMsg的倹{如果消息的长度过H口的最大宽度,消息被截以适应H口?br />·SdShowMsg被设计ؓ单行昄消息。不要在szMag中嵌入换行符(\n)?br />5.36 SdStartCopy<br />语法QSdStartCopy (szTitle, szMsg, listData);<br />说明QSdStartCopy函数创徏一个多行编辑区Q显C安装过E中所作的讄和选择。ؓ按需改变讄Q用户可以单d话框的Back按钮来返回到以前的对话框。在索用L选择后,开始文件传输处理之前调用SdStartCopy?br />    使用一个字W串列表来收集安装过E中得到的信息。然后你可以该字符串列表传递给SdStartCopy的参数listData。SdStartCopy显C列表q允许用户在l箋文g传输处理之前认q些信息是正的?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?开始拷贝文?Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定昄在多行编辑区上方的静态文本区的消息。ؓ昄该对话框的缺省指C,l该参数传递一个空字符?"")?br />listData<br />指定从最l用h索得的信息字W串列表。SdStartCopy会自动将每个元素攄到多行编辑区。如果列表ؓI,该多行编辑区被隐藏q且只有静态文本区为可见?br />q回|<br />NEXT (1)Q表明用户选定了Next按钮?br />BACK (12)Q表明用户选定了Back按钮?br />5.37  SdWelcome<br />语法QSdWelcome (szTitle, szMsg);<br />说明QSdWelcome函数昄一个对话框Q欢q最l用戗?br />参数Q?br />szTitle<br />指定昄在对话框标题部分的文本。ؓ昄~省标题Q?Ƣ迎"Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定昄在欢q对话框中的消息。ؓ在该消息中包含先前调用SdProductName而设|的产品名称Q在该消息的L位置插入一个位|夹%P。当该消息被昄Ӟ%P被品名UCѝؓ昄~省Ƣ迎消息Q?Ƣ迎q入%P安装E序。该E序在你的计算Z安装%P"Q,l该参数传递一个空字符?"")?br />q回|<br />NEXT (1)Q表明单MNext按钮?br />5.38  SdWelcomeMaint<br />语法QSdWelcomeMaint (szTitle, szMsg, nType);<br />说明QSdWelcomeMaint函数昄一个对话框 Q在一个维护型安装Q也是Q一个已l被q行的安装的重运行)的开始时使用。该对话框包含修攏V修复、删除选项按钮?br />参数Q?br />szTitle<br />指定对话框标题。ؓ昄~省标题Q?Ƣ迎"Q?Q给该参C递一个空字符Ԍ""Q?br />szMsg<br />指定昄在对话框的消息。ؓ昄该对话框的缺省指C,l该参数传递一个空字符?"")?br />nType<br />指定哪个选项按钮为缺省选择。你必须在该参数位置传递下列预定义帔R之一Q在对话框中正显C:<br />MODIFYQ修Ҏ钮ؓ~省选择?br />REPAIRQ修复按钮ؓ~省选择?br />REMOVEALLQ删除按钮ؓ~省选择?br />q回|<br />MODIFY (301)Q表明当单击Next按钮后修Ҏ钮被选定?br />REPAIR (302)Q表明当单击Next按钮后修复按钮被选定?br />REMOVEALL (303)Q表明当单击Next按钮后删除按钮被选定?br /></span> <img src ="http://www.shnenglu.com/killsound/aggbug/17745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/killsound/" target="_blank">不懂^_^</a> 2007-01-18 11:58 <a href="http://www.shnenglu.com/killsound/archive/2007/01/18/17745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>~译VC++时出现的LINK2001的错误及解决http://www.shnenglu.com/killsound/archive/2007/01/09/17465.html不懂^_^不懂^_^Tue, 09 Jan 2007 09:53:00 GMThttp://www.shnenglu.com/killsound/archive/2007/01/09/17465.htmlhttp://www.shnenglu.com/killsound/comments/17465.htmlhttp://www.shnenglu.com/killsound/archive/2007/01/09/17465.html#Feedback2http://www.shnenglu.com/killsound/comments/commentRss/17465.htmlhttp://www.shnenglu.com/killsound/services/trackbacks/17465.html学习VCQ+时经怼遇到链接错误LNK2001Q该错误非常讨厌Q因为对?
~程者来_最好改的错误莫q于~译错误Q而一般说来发生连接错误时Q?
~译都已通过。生连接错误的原因非常多,其LNK2001错误Q常怋Z
明其所以然。如果不深入地学习和理解VCQ+Q要x正连接错误LNK2001?
常困难?
初学者在学习VCQ+的过E中Q遇到的LNK2001错误的错误消息主要ؓQ?
unresolved external symbol “symbol”(不确定的外部“符号”)?
如果q接E序不能在所有的库和目标文g内找到所引用的函数、变量或
标签Q将产生此错误消息。一般来_发生错误的原因有两个Q一是所引用
的函数、变量不存在、拼写不正确或者用错误;其次可能使用了不同版?
的连接库?
以下是可能生LNK2001错误的原因:
一Q由于编码错误导致的LNK2001?
1Q不相匹配的E序代码或模块定义(.DEFQ文件能DLNK2001。例?
如果在CQ+ 源文件内声明了一变量“var1”,却试囑֜另一文g内以变量
“VAR1”访问该变量,发生该错误?
2Q如果用的内联函数是在.CPP文g内定义的Q而不是在头文件内?
义将DLNK2001错误?
3Q调用函数时如果所用的参数cd同函数声明时的类型不W将会?
LNK2001?
4Q试图从基类的构造函数或析构函数中调用虚拟函数时会DLNK2001?
5Q要注意函数和变量的可公用性,只有全局变量、函数是可公用的?
静态函数和静态变量具有相同的使用范围限制。当试图从文件外部访?
M没有在该文g内声明的静态变量时导致编译错误或LNK2001?
函数内声明的变量Q局部变量) 只能在该函数的范围内使用?
CQ+ 的全局帔R只有静态连接性能。这不同于CQ如果试囑֜CQ+?
多个文g内用全局变量也会产生LNK2001错误。一U解决的Ҏ是需要时?
头文件中加入该常量的初始化代码,q在.CPP文g中包含该头文Ӟ另一U?
Ҏ是用时l该变量赋以常数?
二.׃~译和链接的讄而造成的LNK2001
1Q如果编译时使用的是/NODQ?NODEFAULTLIBQ选项Q程序所需要的q行
库和MFC库在q接时由~译器写入目标文件模块, 但除非在文g中明包?
q些库名Q否则这些库不会被链接进工程文g。在q种情况下?NOD导
致错误LNK2001?
2Q如果没有ؓwWinMainCRTStartup讑֮E序入口Q在使用Unicode和MFC
时将得到“unresolved external on _WinMain@16”的LNK2001错误信息?
3Q?MD选项~译?既然所有的q行库都被保留在动态链接库之内Q?
源文件中对“func”的引用Q在目标文g里即对“__imp__func?的引用?
如果试图使用静态库LIBC.LIB或LIBCMT.LIBq行q接Q将在__imp__func上发
生LNK2001Q如果不使用/MD选项~译Q在使用MSVCxx.LIBq接时也会发生LNK2001?
4Q?ML选项~译Ӟ如用LIBCMT.LIB链接会在_errno上发生LNK2001?
5Q当~译调试版的应用E序Ӟ如果采用发行版模态库q行q接也会?
生LNK2001Q同P使用调试版模态库q接发行版应用程序时也会产生相同?
问题?
6Q不同版本的库和~译器的混合使用也能产生问题Q因为新版的库里?
能包含早先的版本没有的符号和说明?
7Q在不同的模块用内联和非内联的~译选项能够DLNK2001。如?
创徏CQ+库时打开了函数内联(/Ob1?Ob2Q,但是在描q该函数的相应头
文g里却关闭了函数内联(没有inline关键字)Q这时将得到该错误信息?
为避免该问题的发生,应该在相应的头文件中用inline关键字标志内联函数?
8Q不正确?SUBSYSTEM?ENTRY讄也能DLNK2001?
其实Q生LNK2001的原因还有很多,以上的原因只是一部分而已Q对?
学者来说这些就够理解一阵子了。但是,分析错误原因的目的是Z避免?
误的发生。LNK2001错误虽然比较困难Q但是只要注意到了上q问题,q是?
够避免和予以解决的?/font>

不懂^_^ 2007-01-09 17:53 发表评论
]]>
VS2003/VS2005 常用快捷?/title><link>http://www.shnenglu.com/killsound/archive/2007/01/05/17345.html</link><dc:creator>不懂^_^</dc:creator><author>不懂^_^</author><pubDate>Fri, 05 Jan 2007 11:19:00 GMT</pubDate><guid>http://www.shnenglu.com/killsound/archive/2007/01/05/17345.html</guid><wfw:comment>http://www.shnenglu.com/killsound/comments/17345.html</wfw:comment><comments>http://www.shnenglu.com/killsound/archive/2007/01/05/17345.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/killsound/comments/commentRss/17345.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/killsound/services/trackbacks/17345.html</trackback:ping><description><![CDATA[ <p> <font color="#ff9966">VS2003/VS2005 常用快捷?/font> </p> <p>Visual Studio 2003/Visual Studio 2005常用快捷?快捷方式)</p> <p>调试快捷?/p> <p>F6: 生成解决Ҏ<br />Ctrl+F6: 生成当前目<br />F7: 查看代码<br />Shift+F7: 查看H体设计?br />F5: 启动调试<br />Ctrl+F5: 开始执?不调?<br />Shift+F5: 停止调试<br />Ctrl+Shift+F5: 重启调试<br />F9: 切换断点<br />Ctrl+F9: 启用/停止断点<br />Ctrl+Shift+F9: 删除全部断点<br />F10: 逐过E?br />Ctrl+F10: q行到光标处<br />F11: 逐语?/p> <p>~辑快捷?/p> <p>Shift+Alt+Enter: 切换全屏~辑<br />Ctrl+B,T / Ctrl+K,K: 切换书签开?br />Ctrl+B,N / Ctrl+K,N: UdC一书签<br />Ctrl+B,P: UdC一书签<br />Ctrl+B,C: 清除全部标签</p> <p>Ctrl+I: 渐进式搜?br />Ctrl+Shift+I: 反向渐进式搜?br />Ctrl+F: 查找<br />Ctrl+Shift+F: 在文件中查找<br />F3: 查找下一?br />Shift+F3: 查找上一?br />Ctrl+H: 替换<br />Ctrl+Shift+H: 在文件中替换<br />Alt+F12: 查找W号(列出所有查扄?<br />Ctrl+Shift+V: 剪脓板@?/p> <p>Ctrl+左右头? 一ơ可以移动一个单?br />Ctrl+上下头? 滚动代码屏幕Q但不移动光标位|?br />Ctrl+Shift+L: 删除当前?br />Ctrl+M,M: 隐藏或展开当前嵌套的折叠状?br />Ctrl+M,L: 所有过E设|ؓ相同的隐藏或展开状?br />Ctrl+M,P: 停止大纲昄<br />Ctrl+E,S: 查看I白<br />Ctrl+E,W: 自动换行<br />Ctrl+G: 转到指定?br />Shift+Alt+头? 选择矩Ş文本<br />Alt+鼠标左按? 选择矩Ş文本<br />Ctrl+Shift+U: 全部变ؓ大写<br />Ctrl+U: 全部变ؓ写</p> <p>代码快捷?/p> <p>Ctrl+J / Ctrl+K,L: 列出成员<br />Ctrl+Shift+I格?/ Ctrl+K,P: 参数信息<br />Ctrl+K,I: 快速信?br />Ctrl+E,C / Ctrl+K,C: 注释选定内容<br />Ctrl+E,U / Ctrl+K,U: 取消选定注释内容</p> <p>Ctrl+K,M: 生成Ҏ存根<br />Ctrl+K,X: 插入代码D?br />Ctrl+K,S: 插入外侧代码</p> <p>F12: 转到所调用q程或变量的定义</p> <p>H口快捷?/p> <p>Ctrl+W,W: 览器窗?br />Ctrl+W,S: 解决Ҏ理?br />Ctrl+W,C: c视?br />Ctrl+W,E: 错误列表<br />Ctrl+W,O: 输出视图<br />Ctrl+W,P: 属性窗?br />Ctrl+W,T: d列表<br />Ctrl+W,X: 工具?br />Ctrl+W,B: 书签H口<br />Ctrl+W,U: 文档大纲</p> <p>Ctrl+D,B: 断点H口<br />Ctrl+D,I: xH口<br />Ctrl+Tab: zdH体切换<br />Ctrl+Shift+N: 新徏目<br />Ctrl+Shift+O: 打开目<br />Ctrl+Shift+S: 全部保存<br />Shift+Alt+C: 新徏c?br />Ctrl+Shift+A: 新徏?/p> <p> <br /> </p> <img src ="http://www.shnenglu.com/killsound/aggbug/17345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/killsound/" target="_blank">不懂^_^</a> 2007-01-05 19:19 <a href="http://www.shnenglu.com/killsound/archive/2007/01/05/17345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.iioki.cn" target="_blank">91þþƷ91þɫ</a>| <a href="http://www.liopenfactory.com.cn" target="_blank">þþþavëƬ</a>| <a href="http://www.x705.cn" target="_blank">þþþþþƷο</a>| <a href="http://www.symfony.net.cn" target="_blank">ۺҹҹþ</a>| <a href="http://www.jisuvpn.cn" target="_blank">ݹƷþþþ</a>| <a href="http://www.cqzmz.cn" target="_blank">Ļ˾þ</a>| <a href="http://www.dgcry.cn" target="_blank">þҹɫtvվ</a>| <a href="http://www.suoguai.cn" target="_blank">ŷһþþƷ޾Ʒþþþ</a>| <a href="http://www.banburi.cn" target="_blank">Ʒݾþþþø</a>| <a href="http://www.win42.cn" target="_blank">99þɫĻ</a>| <a href="http://www.zhangyiping.cn" target="_blank">Ʒþþþþù</a>| <a href="http://www.hgysc.cn" target="_blank">ݺۺϾþۺ88</a>| <a href="http://www.pcb0.cn" target="_blank">wwwþ</a>| <a href="http://www.ssc695.cn" target="_blank">99þþƷѿ</a>| <a href="http://www.cfgcurn.cn" target="_blank">þþƷav鶹ɫ</a>| <a href="http://www.fzdhqp.cn" target="_blank">ݺɫþþһ</a>| <a href="http://www.lzcoxag.cn" target="_blank">þþݾþþ</a>| <a href="http://www.apple-tree.com.cn" target="_blank">ĻþþƷ</a>| <a href="http://www.bjxcst.cn" target="_blank">þþƷwww</a>| <a href="http://www.engil.cn" target="_blank">ݹƷþþþ</a>| <a href="http://www.batlive.cn" target="_blank">ɫۺϾþþþר</a>| <a href="http://www.xs258.cn" target="_blank">޾ƷŮþ777777</a>| <a href="http://www.wooblog.cn" target="_blank">þþƷѹƬС</a>| <a href="http://www.ttyv.cn" target="_blank">þþƷһ</a>| <a href="http://www.chaikuo.cn" target="_blank">þøŮ߳MBA</a>| <a href="http://www.syyinuo.cn" target="_blank">þþ99Ʒһ</a>| <a href="http://www.chcrw.cn" target="_blank">þþþžоƷ</a>| <a href="http://www.lc351.cn" target="_blank">þһ </a>| <a href="http://www.ahlmnet.cn" target="_blank">Ʒvaþþþþþ</a>| <a href="http://www.dnsdna.cn" target="_blank">þˬˬƬAV </a>| <a href="http://www.omaw.cn" target="_blank">ƷһþþƷ</a>| <a href="http://www.omwang.cn" target="_blank">޹Ʒ˾þ</a>| <a href="http://www.zhaodongjie.cn" target="_blank">ŷսþþþþþ</a>| <a href="http://www.ithaiyang.com.cn" target="_blank">þӰ</a>| <a href="http://www.gwuq.cn" target="_blank">þþþAVרվ </a>| <a href="http://www.aigoua.cn" target="_blank">ó˾þAvѸ</a>| <a href="http://www.aiucv.cn" target="_blank">þһҹ</a>| <a href="http://www.izyph.cn" target="_blank">þŮcc98cm</a>| <a href="http://www.baiyaiyungroup.com.cn" target="_blank">þۺ88</a>| <a href="http://www.bethesdagroup.cn" target="_blank">Ʒþþþþù</a>| <a href="http://www.guangzb.cn" target="_blank">޺ݺۺϾþþþ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>