NSIS常见问题集锦.docx

上传人:b****4 文档编号:6740394 上传时间:2023-05-10 格式:DOCX 页数:7 大小:21.01KB
下载 相关 举报
NSIS常见问题集锦.docx_第1页
第1页 / 共7页
NSIS常见问题集锦.docx_第2页
第2页 / 共7页
NSIS常见问题集锦.docx_第3页
第3页 / 共7页
NSIS常见问题集锦.docx_第4页
第4页 / 共7页
NSIS常见问题集锦.docx_第5页
第5页 / 共7页
NSIS常见问题集锦.docx_第6页
第6页 / 共7页
NSIS常见问题集锦.docx_第7页
第7页 / 共7页
亲,该文档总共7页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

NSIS常见问题集锦.docx

《NSIS常见问题集锦.docx》由会员分享,可在线阅读,更多相关《NSIS常见问题集锦.docx(7页珍藏版)》请在冰点文库上搜索。

NSIS常见问题集锦.docx

NSIS常见问题集锦

NSIS常见问题集锦

问:

在安装过程中按“取消”的话,会弹出是否终止安装的确认窗口,请问怎样设置可以让这个窗口不要出现,按“取消”就直接退出呢?

  答:

!

defineMUI_ABORTWARNING把这句去掉就可以了。

  问:

如何将显示的“setup将安装...”中的“setup”去掉,除了用自定义字串来修改这个地方以外,如何把这个setup搞成其他的?

比如“安装程序现在将...”  答:

DirText"安装程序将安装$(^NameDA)在下列文件夹。

要安装到不同文件夹,单击[浏览(B)]并选择其他的文件夹。

$_CLICK"  问:

如何定义欢迎页面的标题字体大小。

  答:

使用以下脚本

程序代码!

defineMUI_PAGE_CUSTOMFUNCTION_SHOWChageFONT

!

insertmacroMUI_PAGE_WELCOMEFunctionChageFONT

GetDlgItem$0$MUI_HWND1201

createFont$1"Tahoma""11""700"

SendMessage$0${WM_SETFONT}$10  问:

添加版本号

引用内容VIProductVersion"1.2.3.4"

VIAddVersionKey/LANG=${LANG_ENGLISH}"ProductName""TestApplication"

VIAddVersionKey/LANG=${LANG_ENGLISH}"Comments""Atestcomment"

VIAddVersionKey/LANG=${LANG_ENGLISH}"CompanyName""Fakecompany"

VIAddVersionKey/LANG=${LANG_ENGLISH}"LegalTrademarks""TestApplicationisatrademarkofFakecompany"

VIAddVersionKey/LANG=${LANG_ENGLISH}"LegalCopyright""?

Fakecompany"

VIAddVersionKey/LANG=${LANG_ENGLISH}"FileDescription""TestApplication"

VIAddVersionKey/LANG=${LANG_ENGLISH}"FileVersion""1.2.3"

  在脚本中加入上面的代码,则为NSIS生成的exe添加版本信息。

问题就是,能否让属性中语言显示为“中文(中国)”?

  答:

中文ID是2052。

把${LANG_ENGLISH}改为2052。

  问:

用2052之后确实变成“中文(中国)”了。

但其他内容仍旧是乱码,不知有什么办法可以解决吗?

  答:

版本信息设置语句,放在!

insertmacroMUI_LANGUAGE的后面,NSIS要注重次序的。

如果使用古典界面,放在LoadLanguageFile"${NSISDIR}\Contrib\Languagefiles\SimpChinese.nlf"的后面。

  问:

如何禁止显示banner。

  答:

图示的效果是因为安装程序初始化的时候,也就是.onInit函数里需要用到某个文件的时候安装程序需要搜索整个数据区块来把它解压出来,当安装程序比较大的时候搜索比较费时,这个时候才显示解压百分比。

一般都是用ReserveFile来避开这种搜索。

比如Function.onInit里有:

程序代码InitPluginsDir

File"/oname=$PLUGINSDIR\io.ini"".\io.ini"

  或者其他类似的话,安装程序就需要搜索并解压这个文件。

一般在脚本头部加:

程序代码ReserveFile".\io.ini"

  这样io.ini就保存在数据区块的尾部,安装程序初始化的时候就不用搜索整个数据区块了,相当于加快了安装程序的启动速度。

  问:

根据以上方法使用了,确实不会再出现初始化的对话框了,但是在自定义的InstallOptions页显示前,程序还是会停顿一段时间,请问这是为何?

如何避免?

  答:

某些控件比较消耗时间的,比如显示ICON、位图等,如果InstallOptions里含有这些控件可能会停顿。

如果InstallOptions是第一个页面的话还要把InstallOptions.dll加入到ReserveFile参数里。

再或者就是进入InstallOptions的时候含有比较复杂的指令,比如循环等。

一般在加入ReserveFile${NSISDIR}\Plugins\InstallOptions.dll既可避免。

  问:

如何运行一个安装文件.inf  答:

ExecWait"RunDll32advpack.dll,LaunchINFSectionskins.inf,DefaultInstall"  问:

关联文件图标后,图标没变化。

  答:

刷新图标用,System:

:

Callshell32.dll:

:

SHChangeNotify(l,l,i,i)v(0x08000000,0,0,0)  问:

我用NSIS做好了一个安装程序,因为数据较多,一共有400多M,用的LZMA压缩方式,做好后的安装程序约200M,但是我发现在运行这个安装程序时会在系统TEMP目录产生一个同安装后的全部内容同样大的临时文件(一边运行一边加大,最后到400多M去了),如果我做的程序小倒没什么,可是这个程序有400多M,除了要写入安装的数据外还要同样大小的空间放临时文件,这样子也实在是太花不来,我想请问:

有什么办法能让其在安装时不使用这么多的临时空间吗?

安装的脚本是用HMNISEdit的向导生成的。

  答:

这是因为NSIS在用LZMA时采用了固实压缩,何谓固实压缩,其实就是把所有文件统一起来压缩,所以这样压出来的文件更加的小,同时也带来了一个问题,安装解压的时候,在临时文件夹中生成一个临时文件,随着安装的进程逐渐增大,到最后,需要临时文件会变成跟原安装程序一样大,也就是说,需要原安装程序2倍的空间才可以安装这个程序,所以对于安装大量文件时,这是不适合的。

  NSIS2.07版本之前LZMA算法是固实压缩的,没有非固实的选项,如果需要这样做,只有下载非固实压缩的编译器,但是2.07后的NSIS的LZMA压缩已经改为默认非固实压缩了,所以这个问题同时也不再存在。

如果在制作少量文件的安装时,仍然想取用固实压缩可以加入/SOLID参数。

  像这样:

SetCompressor/SOLIDlzma  问:

能不能在Section区段中实现读取INI文件状态来安装。

若选中单选框1则安装1中定义的文件。

若不选中则不安装。

若选中单选框2则安装2定义的文件。

若不选则不安装。

  答:

使用以下代码

程序代码!

includeLogicLib.nsh

Section-post

SetOutPath$INSTDIR

!

insertmacroMUI_INSTALLOPTIONS_READ$INI_VALUE"info.ini""Field2""State"

${If}$INI_VALUE=1

File/a".\file\fileA.exe"

File/a".\file\fileB.exe"

${EndIf}

!

insertmacroMUI_INSTALLOPTIONS_READ$INI_VALUE"info.ini""Field3""State"

${If}$INI_VALUE=1

File/a".\file\fileA.exe"

${EndIf}

SectionEnd  或者使用以下代码

程序代码!

includeLogicLib.nsh

Section-post

SetOutPath$INSTDIR

!

insertmacroMUI_INSTALLOPTIONS_READ$INI_VALUE"info.ini""Field2""State"

${If}$INI_VALUE=1

;选中时执行的代码

File/a".\file\fileA.exe"

File/a".\file\fileB.exe"

${Else}

;不选中时执行的代码

File/a".\file\fileA.exe"

${EndIf}

SectionEnd  问:

在NSIS中如何设置工作目录,例如一些文件的快捷方式,还有安装完一个软件后运行一个程序,而这个程序需要检测当前工作目录下的某个文件,这时候设置工作目录尤为重要,否则程序不能正常运行。

  答:

NSIS中设定工作目录使用SetOutPath,例如在运行程序的代码ExecWait"$INSTDIR\test2.exe"前放入SetOutPath$INSTDIR,那么$INSTDIR将会成为当前的工作目录,建立快捷方式也会把工作目录设为$INSTDIR。

卸载之前运行某程序只需要把运行指令放到Functionun.onInit里就行  问:

记得以前看到有帖子介绍过可在NSIS中调用.inf文件安装附加驱动程序,具体实现代码如下形式:

引用内容ExecWait"RunDll32advpack.dll,LaunchINFSectiondrivers.inf,DefaultInstall"

  偶在打包一小东东时使用了这一方法,但遇到的问题时,如果在卸载区段里设置能自动卸载安装过的驱动程序呢?

  答:

能否卸载需要看INF文件里面是否有卸载的区段,例如使用NSIS卸载WindowsMessenger可以这样:

程序代码ExecWait"RunDll32advpack.dll,LaunchINFSection$windir\INF\msmsgs.inf,BLC.Remove"

  关于BLC.Remove的来源,可以打开msmsgs.inf文件后,能找到名称为BLC.Remove的区段,该区段用于卸载。

区段的名称是编写者自己定制的。

不同的inf文件,区段名也可能不同。

其他的*.inf文件也可以按照此类做法。

问:

(问题如下)

  1、我做了一个可同时在简繁英下执行的安装程序。

但有个很大的困惑。

刚开始时做的是简体中文版,在简中下当然没问题,但在英/繁下,创建的中文程序组名和写注册表时显示的是乱码。

于是想到写一个三者皆适合的安装程序。

  我的做法是这样的,在涉及到创建中文程序组和写注册表时,加入一个判断,如果英文或繁体,则分别创建英文文件名和big5内码文件名。

但在繁体winxp和英文win2k下测试后,发现根本无法正常创建程序组,也无法正常生成uninstall.exe文件。

而写入注册表的中文字符,也不能在繁体系统的注册表中正常显示,而是乱码。

  请教高手,这种多语言环境下该怎么处理,才能正常显示呢?

总不能全部都给创建成英文的吧?

  2、另外有个小问题,如何让nsis做的安装程序不显示具体的安装文件名,而只显示“正在复制文件……”?

 象foobar那样,可惜foobar也有个显示详细情况的按钮,我想在复制文件过程中完全不显示和提示被复制的文件情况。

答:

(解答如下)

  1、最简单的处理办法就是给需要处理的资源进行一个定义,然后使用LangString定义不同的资源。

给个示例:

程序代码Caption"$(CAPTION)"

LangStringCAPTION${1033}"DreamMailInstallation"

LangStringCAPTION${2052}"DreamMail安装向导"

LangStringCAPTION${1028}"DreamMail杆翾旧"

  2、可以使用DetailPrint,示例,

程序代码DetailPrint"正在复制文件..."  问:

NSIS对于安装卸载的ICO图标大小有什么要求?

编译的时候出现以下错误提示:

引用内容Errorfindingiconresources:

installer,uninstallericonsizemismatch-seetheIconinstructionsdocumentationformoreinformation--failing!

  答:

只要保证安装图标与卸载图标大小相同即可。

  问:

如何屏蔽如下图中的安装程序校验。

  答:

CRCCheck on|off|force指定安装前安装程序是否对自身执行一个CRC。

注意,如果用户使用了/NCRC命令行参数,且你没有指定force参数时,不会执行CRC,这样有可能导致用户安装一个损坏的安装程序。

  安装程序CRC校验是默认打开的。

可以在脚本中用CRCCheckoff来默认禁止安装程序的CRC校验。

不过这样做正如解释上说的可能安装会出现问题。

作汉化的最好加上校验,免得安装程序的问题变成你汉化质量的问题。

  问:

在安装的时候不是可以选择多种语言么?

但是我怎样实现当选择英文时就装英文版,选择中文时就装中文版?

  答:

使用以下脚本:

程序代码StrCmp$LANGUAGE${LANG_SIMPCHINESE}0+3

File"你需要安装的中文文件"

Gotolbl_finish

File"你需要安装的英文文件"

lbl_finish:

  问:

组件A组件B组件C均为可选,A可单独安装,B或者C被选择的时候A必须被选择。

  答:

以下代码:

程序代码Section"组件A"aaa

 detailprint"A"

SectionEndSection"组件B"bbb

 detailprint"B"

SectionEndSection"组件C"ccc

 detailprint"C"

SectionEndFunction.onSelChange

 SectionGetFlags${bbb}$0

 SectionGetFlags${ccc}$1

 IntOp$0$0&1

 IntOp$1$1&1

 IntCmp$010+2

  SectionSetFlags${aaa}1

 IntCmp$110+2

  SectionSetFlags${aaa}1

FunctionEnd  解释:

SectionGetFlags表示获取某区段的flags状态(就是是否被勾选,选中返回值为1,反之为0)。

SectionGetFlags${bbb}$0表示获取序号为${bbb}的区段的Flags状态并把返回值输出到变量$0,C区段相同。

接着就是StrCmp,解释同上楼。

SectionSetFlags${aaa}1表示设置序号为${aaa}区段的Flags状态为1,即勾选。

  问:

怎么让“许可协议”页面的标题栏,如程序中的“MutliPages演示”修改为“MutliPages演示:

许可协议”。

  答:

首先创建一个函数,如下。

程序代码FunctionLicensePagePre

SendMessage$HWNDPARENT${WM_SETTEXT}0"STR:

我爱你"

FunctionEnd

  然后在协议页面句子

程序代码!

insertmacroMUI_PAGE_LICENSE"c:

\path\to\licence\YourSoftwareLicence.txt"

  之前加入如下语句

程序代码!

defineMUI_PAGE_CUSTOMFUNCTION_PRELicensePagePre  问:

比如,我把a.exe用nsis包装好,安装到c:

\helloLib\a.exe,完成后,想把c:

\helloLib\添加到系统环境变量的path里头,这样,在任何地方输入a.exe可执行。

如何将路径添加到系统环境变量中?

  答:

以下代码实现:

程序代码ReadRegStr$0HKLM"SYSTEM\CurrentControlSet\Control\SessionManager\Environment""Path"

WriteRegExpandStrHKLM"SYSTEM\CurrentControlSet\Control\SessionManager\Environment""Path""$0;C:

\hellolib"

  另类方法一:

写注册表,如

程序代码[HKEY_CLASSES_ROOT\Applications\a.exe\shell\open\command]

@="yourpath\a.exe"

  另类方法二:

程序代码[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\a.exe]

@="c:

\helloLib\a.exe"  问:

在NSIS中如何才能做到根据对于注册表键值的判断决定是否写入字串,如果判断出某个key存在,则写入相应的字串,如果不存在,则不写入字串。

例如:

我先要判断“HKLMSOFTWARE\nsis”这个key存不存在。

如果存在则写入字串“DispName:

nsis”,应该是用“WriteRegStrHKLM"SOFTWARE\nsis""DispName""nsis"”。

如果不存在这个key,则不写入注册表,继续下面的安装。

  答:

以下代码实现:

程序代码ReadRegStr$0HKLMSOFTWARE\nsis""

 IfErrors0+2

 Goto+2

WriteRegStrHKLM"SOFTWARE\nsis""DispName""nsis"  问:

如何制作安装包的时候需要调用系统函数来检测当前安装包运行的操作系统的内码页。

  答:

以下代码显示系统语言:

程序代码System:

:

Call"Kernel32:

:

GetSystemDefaultLangID(v..)i.s"

Pop$0

IntOp$0$0&0xFFFF

MessageBoxMB_OK$0  问:

如何用NSIS注册字体?

  答:

以下代码:

程序代码!

includeWinMessages.nsh

Section"MainSection"SEC01

File/oname=$FONTS\tahoma.ttftahoma.ttf

Push"$FONTS\tahoma.ttf"

System:

:

Call"Gdi32:

:

AddFontResource(ts)i.s"

Pop$0

IntCmp$000+2+2

MessageBoxMB_OK"注册字体失败"

SendMessage${HWND_BROADcast}${WM_FONTCHANGE}00

SectionEnd  问:

如何用NSIS安装输入法。

  答:

以下代码:

程序代码SetOutPath$SYSDIR

FileWBIME.ime

Push"五笔输入法"

Push"$SYSDIR\WBIME.ime"

System:

:

Call"Imm32:

:

ImmInstallIME(ts,ts)i.s"

System:

:

Call"Imm32:

:

ImmIsIME(is)i.s"

Pop$0

IntCmp$010+3+3

MessageBoxMB_OK"输入法安装成功"

Goto+2

MessageBoxMB_OK"输入法安装失败"

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2