iniwf

风是温柔的,雨是伤心的,云是快乐的,月是多情的,爱是迷失的,恋是醉人的,情是难忘的,天是长久的,地是永恒的

NSIS 常用小问题合集

转自http://dreams8.com/thread-682-1-1.html

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

答: !define MUI_ABORTWARNING  把这句去掉就可以了....


问: 如图所示的地方,现在显示的是“setup 将安装...”,除了用自定义字串来修改这个地方以外,如何把这个setup搞成其他的?比如“安装程序现在将...”

答: DirText "安装程序将安装 $(^NameDA) 在下列文件夹。要安装到不同文件夹,单击 [浏览(B)] 并选择其他的文件夹。 $_CLICK"
附图: 1.gif


问: 如何定义欢迎页面的标题字体大小。如下图所示,图三红色框内的标题字体。

答: 使用以下脚本
  1.     !define MUI_PAGE_CUSTOMFUNCTION_SHOW ChageFONT
  2.     !insertmacro MUI_PAGE_WELCOME

  3.     Function ChageFONT
  4.      GetDlgItem $0 $MUI_HWND 1201
  5.      createFont $1 "Tahoma" "11" "700"
  6.      SendMessage $0 ${WM_SETFONT} $1 0
  7.     FunctionEnd
复制代码
附图: 2.gif


问: 添加版本号
  1.   VIProductVersion "1.2.3.4"
  2.   VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "Test Application"
  3.   VIAddVersionKey /LANG=${LANG_ENGLISH} "Comments" "A test comment"
  4.   VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "Fake company"
  5.   VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalTrademarks" "Test Application is a trademark of Fake company"
  6.   VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "?Fake company"
  7.   VIAddVersionKey /LANG=${LANG_ENGLISH} "FileDescription" "Test Application"
  8.   VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "1.2.3"
复制代码
在脚本中加入上面的代码,则为 NSIS 生成的 exe 添加版本信息。
问题就是,能否让属性中语言显示为“中文(中国)”?如附图1

答: 中文 ID 是 2052。 把 ${LANG_ENGLISH} 改为 2052。

问: 用 2052 之后确实变成“中文(中国)”了。但其他内容仍旧是乱码,不知有什么办法可以解决吗?如附图2

答: 版本信息设置语句,放在 !insertmacro MUI_LANGUAGE 的后面,NSIS 要注重次序的。如果使用古典界面,放在 LoadLanguageFile "${NSISDIR}\Contrib\Language files\SimpChinese.nlf" 的后面。
附图: 3.gif 4.gif


问: 如何禁止显示如附图中的 banner 。

答: 图示的效果是因为安装程序初始化的时候,也就是 .onInit 函数里需要用到某个文件的时候安装程序需要搜索整个数据区块来把它解压出来,当安装程序比较大的时候搜索比较费时,这个时候才显示解压百分比。一般都是用 ReserveFile 来避开这种搜索。
比如 Function .onInit 里有
  1.   InitPluginsDir
  2.   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 既可避免。
附图: 5.gif

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

答:
  1. ExecWait "RunDll32 advpack.dll,LaunchINFSection skins.inf,DefaultInstall"
复制代码
问: 关联文件图标后,图标没变化。

答: 刷新图标用,
  1. System::Call 'shell32.dll::SHChangeNotify(l, l, i, i) v (0x08000000, 0, 0, 0)'
复制代码
问: 我用NSIS做好了一个安装程序,因为数据较多,一共有400多M,用的LZMA压缩方式,做好后的安装程序约200M,但是我发现在运行这个安装程序时会在系统TEMP目录产生一个同安装后的全部内容同样大的临时文件(一边运行一边加大,最后到400多M去了),如果我做的程序小倒没什么,可是这个程序有400多M,除了要写入安装的数据外还要同样大小的空间放临时文件,这样子也实在是太花不来,
我想请问:有什么办法能让其在安装时不使用这么多的临时空间吗?安装的脚本是用HM NIS Edit的向导生成的。

答: 这是因为 NSIS 在用 LZMA 时采用了固实压缩,何谓固实压缩,其实就是把所有文件统一起来压缩,所以这样压出来的文件更加的小,同时也带来了一个问题,安装解压的时候,在临时文件夹中生成一个临时文件,随着安装的进程逐渐增大,到最后,需要临时文件会变成跟原安装程序一样大,也就是说,需要原安装程序 2 倍的空间才可以安装这个程序,所以对于安装大量文件时,这是不适合的。
NSIS 2.07 版本之前 LZMA 算法是固实压缩的,没有非固实的选项,如果需要这样做,只有下载非固实压缩的编译器,但是 2.07 后的 NSIS 的 LZMA 压缩已经改为默认非固实压缩了,所以这个问题同时也不再存在。如果在制作少量文件的安装时,仍然想取用固实压缩可以加入 /SOLID 参数。像这样: SetCompressor /SOLID lzma


问: 能不能在 Section 区段中实现读取INI文件状态来安装。
如图所示,若选中单选框1则安装1中定义的文件。若不选中则不安装。若选中单选框2则安装2定义的文件。若不选则不安装。

答: 使用以下代码,
  1.   !include LogicLib.nsh
  2.   Section -post
  3.     SetOutPath $INSTDIR
  4.     !insertmacro MUI_INSTALLOPTIONS_READ $INI_VALUE "info.ini" "Field 2" "State"
  5.     ${If} $INI_VALUE = 1
  6.       File /a ".\file\fileA.exe"
  7.       File /a ".\file\fileB.exe"
  8.     ${EndIf}
  9.     !insertmacro MUI_INSTALLOPTIONS_READ $INI_VALUE "info.ini" "Field 3" "State"
  10.     ${If} $INI_VALUE = 1
  11.       File /a ".\file\fileA.exe"
  12.     ${EndIf}
  13.   SectionEnd
复制代码
或者使用以下代码,
  1.   !include LogicLib.nsh
  2.   Section -post
  3.     SetOutPath $INSTDIR
  4.     !insertmacro MUI_INSTALLOPTIONS_READ $INI_VALUE "info.ini" "Field 2" "State"
  5.     ${If} $INI_VALUE = 1
  6.       ;选中时执行的代码
  7.       File /a ".\file\fileA.exe"
  8.       File /a ".\file\fileB.exe"
  9.     ${Else}
  10.       ;不选中时执行的代码
  11.       File /a ".\file\fileA.exe"
  12.     ${EndIf}
  13.   SectionEnd
复制代码
附图: 6.gif


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

答: NSIS 中设定工作目录使用 SetOutPath,例如在运行程序的代码 ExecWait "$INSTDIR\test2.exe" 前放入 SetOutPath $INSTDIR,那么 $INSTDIR 将会成为当前的工作目录,建立快捷方式也会把工作目录设为 $INSTDIR。
卸载之前运行某程序只需要把运行指令放到 Function un.onInit 里就行


问: 记得以前看到有帖子介绍过可在NSIS中调用.inf文件安装附加驱动程序,具体实现代码如下形式:
ExecWait "RunDll32 advpack.dll,LaunchINFSection drivers.inf,DefaultInstall"
偶在打包一小东东时使用了这一方法,但遇到的问题时,如果在卸载区段里设置能自动卸载安装过的驱动程序呢?

答: 能否卸载需要看 INF 文件里面是否有卸载的区段,例如使用 NSIS 卸载 Windows Messenger 可以这样:
ExecWait "RunDll32 advpack.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 定义不同的资源。给个示例:
  1.   Caption "$(CAPTION)"
  2.   LangString CAPTION ${1033} "DreamMail Installation"
  3.   LangString CAPTION ${2052} "DreamMail 安装向导"
  4.   LangString CAPTION ${1028} "DreamMail
复制代码

posted on 2009-03-19 23:42 iniwf 阅读(450) 评论(0)  编辑 收藏 引用 所属分类: 软件打包


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿(2)

随笔分类

随笔档案

收藏夹

IT技术

积分与排名

最新评论

阅读排行榜

评论排行榜