杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2408|回复: 0

NSIS 脚本示例

[复制链接]
发表于 2015-1-23 17:59:29 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
作者: 少昊
源地址:http://teach.hanzify.org/article/333-1067356800.html

NSIS 确实是一个不错的安装程序制作软件。新版本 2.0a7 真正实现了中文支持和支持 WinXP 的安装对话框。

不过要用它实现漂亮的安装界面和完美的安装功能就必须好好的写脚本。

而 NSIS 的脚本指令是在是太多了,有时候觉得好像又回到了学习 C 语言的年代。他丰富而起强大的功能甚至
可以编译出一些小而使用的软件(例如查找窗口句柄,然后...)

好了,不多说。我在这里着重介绍关于 NSIS 的一些使用问题以及新界面安装程序的制作过程,中间会附上一个
示例脚本。

这里只说单语言的简体中文

1. NSIS的运行问题

2.0a7 的 NSIS 安装在长文件名的目录中好像会有问题(Win2k 和 WinXP 下,Win98 下好像没问题)。你若是将
NSIS 安装在类似于“E:\System\Installer\NSIS 的目录中”(其中的“Installer”是超过了 8 个字符的长文
件名),运行 makensisw 或是直接在命令提示符中使用 makensis 可能会非法操作。

解决的办法是:
在命令提示符下使用如下指令:

cd E:\System\Instal~1\NSIS

进入 NSIS 安装目录后使用命令行:

makensis /CD /X"Compressor bzip2" "f:\1.nsi"

你可以在脚本文件中使用了“SetCompressor bzip2”指令,这样就可以去掉“/X"Compressor bzip2"”参数。
使用 makensisw 的朋友我就不多说了,你可以从我上面的分析中得到点启发。自己设置一下它的运行参数吧!

不过 makensisw 也有 Bug,若用 makensisw 编译时发现脚本错误,程序就立马非法操作。

2. 关于脚本的整体布局

说 NSIS 有些象高级语言的语法一点没错。NSIS 的语法非常注重先后顺序(我曾经为了一个指令的先后顺序来
回 Ctrl+C & Ctrl+V 了 N 次)。

例如象它的帮助文件中提到的“SetFont”指令必须在“AddBrandingImage”指令之前等。我在这里要说的而是
关于如何正确的对脚本进行整体布局,使其能更加合理、高效的被使用,这样才有利于日后的安装程序更新

你可以用我后面的示例脚本为模板制作自己的 NSIS 脚本。

大体布局如下:

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

预设参数(包括外部压缩器选择、编译选项、宏定义以及文件包含等)

普通安装设置

自定义函数

安装程序区域内容

安装程序回调函数及其相关函数定义

卸载程序区域内容

卸载程序回调函数及其相关函数定义

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

3. 关于安装程序 Logo 画面的说明:

先前版本的 NSIS 使用 splash.exe 制作 logo画面,但若您使用 2.0a7,

我建议您使用(好像也只能使用)magiclime.exe,它在 Win2k 和 WinXP

下显示 logo画面时会有淡入淡出的效果。超 Cool....

4. 关于标牌位图(即显示在安装程序对话框中的自定义位图)的说明:

2.0a7 提供了宏指令用于在安装程序的对话框中显示标牌位图。当然你也可以用标准的 NSIS 指令。

5. 关于使用新的 Modern UI 界面的说明:

2.0a7 同样提供了宏指令使你可以使用全新的安装界面:

首先你需要安装 NSIS v2.0a7 简体中文补丁(汉化新世纪有下载):

然后打开安装目录下的 Examples\Modern UI\ModernUI.nsh 文件,将从

!macro MUI_INTERFACE UI ICON UNICON CHECKS PROGRESSBAR

到第一个

!macroend

之间的注释符(即分号)删除(若没有这步究省了)。保存。

接下来就可以在你自己的脚本中使用形式对话框了,并且支持 WinXP 的新的视觉效果样式。

6. 以下是我的示例脚本:
  1. ////////////////////////////////////////////////////////////////////////////
  2. ; study.nsi
  3. ;
  4. ; 以下脚本用以生成 study.exe 文件
  5. ; 它包含有授权协议
  6. ;
  7. ; 安装时若发现应用程序正在运行,安装程序会提示并替用户关闭应用程序
  8. ; 安装成功后会自动运行应用程序
  9. ;
  10. ; 启用新的 Modern UI 的宏指令语法,原先的部分指令将被禁止以防止重复
  11. ; 我会尽量展示如何基本指令的用法。当然宏指令也会与一些基本指令发生重
  12. ; 复定义的情况,不过 NSIS 照样能编译成功.
  13. ; 其中的一些路径、文件你可以根据需要更改

  14. ; 启用外部压缩工具(这里我们不用,原因看第 10 步)
  15. ;!define HAVE_UPX


  16. ; 若启用了外部压缩工具,这进行可执行文件头的压缩
  17. !ifdef HAVE_UPX
  18. ; 用 UPX 压缩可执行文件头(用其他的相关工具也行)
  19. !packhdr tmp.dat "E:UPX\upx --best tmp.dat"
  20. !endif


  21. ; 编译选项
  22. ; 设置覆盖标记
  23. SetOverwrite on
  24. ; 设置压缩选项
  25. SetCompress auto
  26. ; 选择压缩方式
  27. SetCompressor bzip2
  28. ; 设置数据块优化
  29. SetDatablockOptimize on
  30. ; 设置数据写入时间
  31. SetDateSave on


  32. ; 相关数据预设
  33. ; 软件的名字,后面的${NAME}调用这个名字
  34. !define NAME "NSIS"
  35. !define NAME_FULL "全方位掌握 NSIS 的使用"
  36. !verbose 3
  37. ; 包含窗口消息定义文件
  38. !include "${NSISDIR}\Examples\WinMessages.nsh"
  39. ; 包含新界面的宏指令文件
  40. !include "${NSISDIR}\Examples\Modern UI\ModernUI.nsh"
  41. ; 包含标牌位图宏指令文件
  42. !include "${NSISDIR}\Examples\branding.nsh"
  43. !verbose 4
  44. !define CURRENTPAGE $9
  45. !define TEMP1 $R0
  46. !define TEMP2 $R1
  47. ; 插入安装界面宏定义(这里我禁用了,启用也没问题。编译照样通过。后面我都定义过了)
  48. ;!insertmacro MUI_INTERFACE "modern2.exe" "adni18-installer-C-no48xp.ico" "adni18-uninstall-C-no48xp.ico" "modern.bmp" "smooth"

  49. ; 安装程序设置
  50. ; 输出文件
  51. OutFile "F:\study.exe"
  52. ; 安装程序名称
  53. Name /LANG=2052 "NSIS"
  54. ; 替换对话框样式
  55. ChangeUI all "${NSISDIR}\Contrib\UIs\modern2.exe"
  56. ; 启用 WindowsXP 的视觉样式
  57. XPStyle on
  58. ;设置字体
  59. SetFont 宋体 9
  60. ; 标题名称
  61. Caption /LANG=2052 "全方位掌握 NSIS 的使用"
  62. ; 标牌的内容
  63. BrandingText /LANG=2052 /TRIMCENTER "Shao Hao"
  64. ; 安装程序图标
  65. Icon "F:\12\QCDIcon.ico"
  66. ; 安装程序显示标题
  67. WindowIcon  on
  68. ; 添加标牌位图(放在顶部用 TOP 参数。后面接高度)
  69. AddBrandingImage LEFT 105
  70. ; 设定渐变背景
  71. BGGradient off
  72. ; 设置安静安装模式
  73. ;SilentInstall normal
  74. ; 设置安静卸载模式
  75. ;SilentUnInstall normal
  76. ; 执行 CRC 检查(最好用 on 打开。关闭是因为还要修改安装程序,看第 10 步)
  77. CRCCheck off
  78. ; 加载相应的语言文件
  79. LoadLanguageFile "${NSISDIR}\Contrib\Language files\SimpChinese.nlf"
  80. ; 替换各个对话框标题的文字
  81. SubCaption /LANG=2052 0 "授权协议"
  82. SubCaption /LANG=2052 1 "安装选项"
  83. SubCaption /LANG=2052 2 "安装目录"
  84. SubCaption /LANG=2052 3 "正在安装"
  85. SubCaption /LANG=2052 4 "完成安装"
  86. ; 替换默认按钮的文字
  87. MiscButtonText /LANG=2052 "< 上一步" "下一步 >" "取消" "关闭"
  88. ; 替换“安装”按钮的文字
  89. ;InstallButtonText /LANG=2052 "安装"
  90. ; 替换当文件无法被写入时的警告窗的文字
  91. FileErrorText /LANG=2052 "无法写入文件$\r$\n$0$\r$\n请确认文件属性不是只读且未被使用中!"
  92. ; 默认的安装目录
  93. InstallDir "$PROGRAMFILES\QCD 3"
  94. ; 如果可能的化从注册表中监测安装路径
  95. InstallDirRegKey HKLM \
  96.                 "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" \
  97.                 "UninstallString"
  98. ; 授权协议页面
  99. LicenseText /LANG=2052 "NSIS 是免费软件。安装前请先阅读以下协议条款" "我同意"
  100. ; 使用授权协议文本
  101. LicenseData /LANG=2052 "F:\12\License.txt"
  102. ; 设置授权协议页面的背景色
  103. ;LicenseBkColor 000000
  104. ; 选择要按安装的组件
  105. ComponentText /LANG=2052 "现在将安装 ${NAME_FULL}到您的计算机:" "请选择安装类型" "或选择您希望安装的组件"
  106. InstType "完全安装(都在了)"
  107. InstType "典型安装"
  108. InstType /LANG=2052  /CUSTOMSTRING=自定义
  109. ;InstType /LANG=2052 /NOCUSTOM
  110. ;InstType /COMPONENTSONLYONCUSTOM
  111. CheckBitmap "${NSISDIR}\Contrib\Icons\modern.bmp"
  112. ; 替换显示磁盘空间信息的文字
  113. SpaceTexts /LANG=2052 "所需空间:" "可用空间:"
  114. ; 提示用户输入目录的文本
  115. ; DirShow hide
  116. ; 替换显示选择安装目录的文字
  117. DirText /LANG=2052 "请选择 ${NAME} 的安装路径:" "选择目录用以安装 ${NAME}:" "浏览..."
  118. ; 是否允许安装在根目录下
  119. AllowRootDirInstall false
  120. ; 安装信息的颜色
  121. ;InstallColors 000000 FFFFFF
  122. ; 安装进度条显示方式
  123. InstProgressFlags smooth colored
  124. ; 完成后自动关闭安装程序
  125. AutoCloseWindow true
  126. ; 显示“显示详细细节”对话框
  127. ShowInstDetails hide
  128. ; 替换“显示细节”按钮的文字
  129. DetailsButtonText /LANG=2052 "显示细节"
  130. ; 替换“完成”按钮的文字
  131. CompletedText /LANG=2052 "已完成"

  132. ; 卸载程序设置
  133. ; 替换卸载程序的文字
  134. UninstallText /LANG=2052 "现在将从你的系统中卸载 ${NAME}:" "卸载目录:"
  135. ; 卸载程序图标
  136. UninstallIcon "F:\12\UnQCDIcon.ico"
  137. ; 替换卸载程序标题的文字
  138. UninstallCaption /LANG=2052 "卸载 ${NAME}"
  139. ; 替换卸载程序每页按钮的文字
  140. UninstallSubCaption /LANG=2052 0 ":确认"
  141. UninstallSubCaption /LANG=2052 1 ":正在删除文件"
  142. UninstallSubCaption /LANG=2052 2 ":完成"
  143. ; 卸载程序显示方式
  144. ShowUninstDetails hide
  145. ; 替换“卸载”按钮的文字
  146. UninstallButtonText /LANG=2052 "卸载"


  147. ; 安装程序内容及其相关的回调函数
  148. ; 安装程序内容
  149. Section /e "!主要程序(必须安装)" SecCore
  150. SectionIn 1 2 RO
  151. ; 设置输出路径,每次使用都会改变
  152. SetOutPath $INSTDIR
  153. ; 循环包含目录下全部内容
  154. File /r "F:\12\1\*.*"
  155. ; 只包含一个文件
  156. File "F:\12\gf.gif"
  157. ; 处理动态连接库文件
  158. IfFileExists "$INSTDIR\1.dll" 0 NoFile1
  159. ; 取消组件注册
  160. UnRegDll "$INSTDIR\1.dll"
  161. Delete "$INSTDIR\1.dll"
  162. NoFile1:
  163. File "F:\12\1.dll"
  164. ; 注册组件
  165. RegDLL "$INSTDIR\QCDIconMgr.dll"
  166. ; 写入软件注册键值
  167. WriteRegStr HKLM "Software\NSIS\NSIS" "" "$INSTDIR"
  168. ; 为 Windows 卸载程序写入键值
  169. WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "DisplayName" "NSIS(只用于移除)"
  170. WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "UninstallString" "$INSTDIR\uninst.exe"
  171. ; 写入生成卸载程序(可多次使用)
  172. WriteUninstaller "$INSTDIR\uninst.exe"
  173. SectionEnd
  174. Section /e "扩展(可选)" SecUpdate
  175. SectionIn 1
  176. SetOutPath "$INSTDIR\Plugins"
  177. File "F:\12\qcdplus\Plugins\2.dll"
  178. File /r "F:\12\qcdplus\Plugins\3"
  179. SectionEnd
  180. SubSection /e "选项" SecOptions
  181. Section /e "创建桌面图标" SecDesktopShortCut
  182.    SectionIn 1 2
  183.    SetOutPath "$INSTDIR\Plugins"
  184.    CreateShortCut "$DESKTOP\NSIS.lnk" "$INSTDIR\gf.gif"
  185.    WriteUninstaller "$INSTDIR\uninst.exe"
  186. SectionEnd
  187. Section /e "创建快速启动栏图标" SecQuickbarShortCut
  188.    SectionIn 1 2
  189.    SetOutPath "$INSTDIR\Plugins"
  190.    CreateShortCut "$QUICKLAUNCH\NSIS.lnk" "$INSTDIR\gf.gif"
  191.    WriteUninstaller "$INSTDIR\uninst.exe"
  192. SectionEnd
  193. Section /e "创建 NSIS 程序组" SecShortCutGroup
  194.    SectionIn 1 2
  195.    SetOutPath "$INSTDIR\Plugins"
  196.    CreateDirectory "$SMPROGRAMS\NSIS"
  197.    CreateShortCut "$SMPROGRAMS\QCD Player\gf.lnk" "$INSTDIR\gf.gif"
  198.    WriteUninstaller "$INSTDIR\uninst.exe"
  199. SectionEnd
  200. SubSectionEnd
  201. Section "-Run"; 运行
  202. ExecWait "$INSTDIR\2.exe" -p
  203. WriteINIStr "$INSTDIR\NSIS.ini" "2" "Language" "Chinese"
  204. Exec "$INSTDIR\2.exe"
  205. ExecShell open "$INSTDIR\汉化说明.htm"
  206. SectionEnd
  207. Section ""
  208. ;Invisible section to display the Finish header
  209. !insertmacro MUI_FINISHHEADER SetHeader
  210. SectionEnd

  211. ; 安装程序初始化设置
  212. Function .onInit
  213. ; 发现有程序正在运行时提示退出后继续运行
  214. loop:
  215. FindWindow $R0 "NSIS"
  216. IntCmp $R0 0 done
  217.    MessageBox MB_OKCANCEL \
  218.               "NSIS 正在运行。$\n点击“确定”按钮会关闭 NSIS 然后继续安装,点击“取消”按钮将退出安装程序" \
  219.               IDOK NoAbort
  220.    Abort
  221. NoAbort:
  222.    SendMessage $R0 1029 0 0
  223. ; 稍等后继续检测直至检测不到或用户选择取消
  224.    Sleep 444
  225.    Goto loop
  226. done:
  227. ; 显示 Logo 画面
  228. SetOutPath $TEMP
  229. File /oname=qcd_logo.bmp "F:\12\logo.bmp"
  230. File /oname=magiclime.exe "${NSISDIR}\Bin\magiclime.exe"
  231. ExecWait "$TEMP\magiclime.exe" qcd_logo.bmp
  232. Delete "$TEMP\magiclime.exe"
  233. Delete "$TEMP\qcd_logo.bmp"
  234. ; 初始化标牌位图
  235. !insertmacro BI_INIT $R0
  236. FunctionEnd
  237. ; 安装程序主界面的相关文本
  238. Function SetHeader
  239. !insertmacro MUI_HEADER_INIT
  240.    !insertmacro MUI_HEADER_START 1
  241.       !insertmacro MUI_HEADER_TEXT 2052 "授权协议" "安装 ${NAME} 之前,请认真阅读一下授权条款."
  242.    !insertmacro MUI_HEADER_STOP 1
  243.    !insertmacro MUI_HEADER_START 2
  244.      !insertmacro MUI_HEADER_TEXT 2052 "选择组件" "请选择你要安装的组件."
  245.    !insertmacro MUI_HEADER_STOP 2
  246.    !insertmacro MUI_HEADER_START 3
  247.      !insertmacro MUI_HEADER_TEXT 2052 "选择安装位置" "为 ${NAME} 选择一个安装目录."
  248.    !insertmacro MUI_HEADER_STOP 3
  249.    !insertmacro MUI_HEADER_START 4
  250.      !insertmacro MUI_HEADER_TEXT 2052 "安装" "${NAME} 已经安装,请等待."
  251.    !insertmacro MUI_HEADER_STOP 4
  252.    !insertmacro MUI_HEADER_START 5
  253.      !insertmacro MUI_HEADER_TEXT 2052 "完成" "安装顺利完成."
  254.    !insertmacro MUI_HEADER_STOP 5
  255. !insertmacro MUI_HEADER_END
  256. FunctionEnd
  257. ; 初始化安装程序对话框的显示文本
  258. Function .onInitDialog
  259. !insertmacro MUI_INNERDIALOG_INIT
  260.    !insertmacro MUI_INNERDIALOG_START 1
  261.      !insertmacro MUI_INNERDIALOG_TEXT 2052 1040 "如果你同意协议中的所有条款,选择“我同样”继续安装,如果你选择了“取消”,安装程序将终止,只有接受条款才能安装 ${NAME}."
  262.    !insertmacro MUI_INNERDIALOG_STOP 1
  263.    !insertmacro MUI_INNERDIALOG_START 2
  264.      !insertmacro MUI_INNERDIALOG_TEXT 2052 1042 "描述"
  265.      !insertmacro MUI_INNERDIALOG_TEXT 2052 1043 "移动你的鼠标到组件上,便可以见到相关的描述."
  266.    !insertmacro MUI_INNERDIALOG_STOP 2
  267.    !insertmacro MUI_INNERDIALOG_START 3
  268.      !insertmacro MUI_INNERDIALOG_TEXT 2052 1041 "目标文件夹"
  269.      !insertmacro MUI_INNERDIALOG_STOP 3
  270. !insertmacro MUI_INNERDIALOG_END
  271. FunctionEnd
  272. ; 转到下页面时的处理
  273. Function .onNextPage
  274. !insertmacro MUI_NEXTPAGE_OUTER
  275. !insertmacro MUI_NEXTPAGE SetHeader  
  276. ; 标牌位图设置
  277. !insertmacro BI_NEXT
  278. FunctionEnd
  279. ; 转到上一页面时的处理
  280. Function .onPrevPage
  281. !insertmacro MUI_PREVPAGE
  282. ; 标牌位图设置
  283. !insertmacro BI_PREV
  284. FunctionEnd
  285. ; 鼠标移到指定组件时的显示处理
  286. Function .&#111nMouseOverSection
  287. ; 用宏指令设置安装自己的注释文本
  288. !insertmacro MUI_DESCRIPTION_INIT
  289.    !insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecCore} "安装主应用程序"
  290.    !insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecUpdate} "安装 NSIS 的更新或新增插件"
  291.    !insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecOptions} "选择 NSIS 的其他安装选项,例如:创建快捷方式和应用程序组的"
  292.    !insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecDesktopShortCut} "在用户的桌面上创建 NSIS 的快捷方式"
  293.    !insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecQuickbarShortCut} "在用户的快速栏里创建 NSIS 快捷方式"
  294.    !insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecShortCutGroup} "在用户的开始菜单的程序中创建 NSIS 的快捷方式组"
  295. !insertmacro MUI_DESCRIPTION_END
  296. FunctionEnd
  297. ; 安装成功完成后的设置
  298. Function .onInstSuccess
  299. ; 自己加吧:)
  300. FunctionEnd
  301. ; 放弃安装时警告窗口的显示信息
  302. Function .onUserAbort
  303. !insertmacro MUI_ABORTWARNING 2052 "你确定要推出 ${NAME} 的安装吗?"
  304. !insertmacro MUI_ABORTWARNING_END
  305. FunctionEnd
  306. ; 安装程序标牌位图列表
  307. !insertmacro BI_LIST
  308. !insertmacro BI_LIST_ADD "F:\12\Brand1.bmp" /RESIZETOFIT
  309. !insertmacro BI_LIST_ADD "F:\12\Brand2.bmp" /RESIZETOFIT
  310. !insertmacro BI_LIST_ADD "F:\12\Brand3.bmp" /RESIZETOFIT
  311. !insertmacro BI_LIST_END


  312. ; 卸载程序及其相关回调函数
  313. ; 卸载程序内容
  314. Section "Uninstall"
  315. ExecWait "$INSTDIR\12.exe" /un
  316. ; 循环删除文件直至删除文件夹
  317. RMDir /r "$SMPROGRAMS\NSIS"
  318. UnRegDLL "$INSTDIR\2.dll"
  319. Delete "$INSTDIR\QCDIconMgr.dll"
  320. Delete "$INSTDIR\*.*"
  321. DeleteRegKey HKLM "Software\NSIS"
  322. DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS"
  323. MessageBox MB_YESNO|MB_ICONQUESTION \
  324.             "是否连插件目录也要删除?$\n(若您要保留这些文件,请点击下面的“否”按钮)" \
  325.             IDNO NoDelete
  326. ; 全删光!!!
  327. RMDir /r "$INSTDIR"
  328. NoDelete:
  329. SectionEnd

  330. ; 定义卸载程序标牌位图
  331. !define BI_UNINSTALL
  332. !include "${NSISDIR}\Examples\branding.nsh"
  333. ; 初始化卸载程序对话框的设置
  334. Function un.onInit
  335. ; 初始化标牌位图
  336. !insertmacro BI_INIT $R0
  337. FunctionEnd
  338. ; 卸载程序主界面的相关文本
  339. Function un.SetHeader
  340. !insertmacro MUI_HEADER_INIT
  341.    !insertmacro MUI_HEADER_START 1
  342.      !insertmacro MUI_HEADER_TEXT 2052 "卸载 ${NAME}" "${NAME_FULL} 将从你的系统里移除."
  343.    !insertmacro MUI_HEADER_STOP 1
  344.    !insertmacro MUI_HEADER_START 2
  345.      !insertmacro MUI_HEADER_TEXT 2052 "卸载" "${NAME} 正在被卸载,请等待."
  346.    !insertmacro MUI_HEADER_STOP 2
  347.    !insertmacro MUI_HEADER_START 3
  348.      !insertmacro MUI_HEADER_TEXT 2052 "完成" "${NAME_FULL} 已从你的系统中移除."
  349.    !insertmacro MUI_HEADER_STOP 3
  350. !insertmacro MUI_HEADER_END
  351. FunctionEnd
  352. ; 初始化卸载程序对话框时的处理
  353. Function un.onInitDialog
  354. ; 自己加:)
  355. FunctionEnd
  356. ; 卸载程序转到下一页时的处理
  357. Function un.onNextPage
  358. !insertmacro MUI_NEXTPAGE_OUTER
  359. !insertmacro MUI_NEXTPAGE un.SetHeader
  360. ; 标牌位图设置
  361. !insertmacro BI_NEXT
  362. FunctionEnd
  363. ; 卸载程序完成时的处理
  364. Function un.onUninstSuccess
  365. ; 再加^_^
  366. FunctionEnd
  367. ; 放弃卸载程序时的处理
  368. Function un.onUserAbort
  369. FunctionEnd
  370. ; 卸载程序标牌位图列表
  371. !insertmacro BI_LIST
  372. !insertmacro BI_LIST_ADD "F:\12\UnBrand1.bmp" /RESIZETOFIT
  373. !insertmacro BI_LIST_ADD "F:\12\UnBrand2.bmp" /RESIZETOFIT
  374. !insertmacro BI_LIST_END


  375. ; 结束
  376. /////////////////////////////////////////////////////////////////////////////
复制代码


7.注意两个标牌位图列表宏指令必须放置到函数的后面,就像我编写的那样,安装程序的标牌位
图列表放置到到所有安装程序回调函数的后面;卸载程序的标牌位图列表放置到所有卸载程序回
调函数的后面。
关键是要注意整体布局(这样才不会看迷糊),当然若编译不能通过,就要进行合适的调整。
8. 使用指令:
makensis /CD f:\study.nsi"
进行编译(这个示例脚本我没试过-_-,若编译无法通过只好自己动手研究研究了。我放出来只是用于参考学习)
9. 还没完—— NSIS 对多语言的支持还是不够完美(注意:是完美——有点鸡蛋里挑骨头的味道)。
我们继续:
用 ExeScope (其他的资源编辑器也行,别说你没有)打开生成的 study.exe 文件,找到对话框资源的 105 项
目。你会发现有一块很明显的用以显示标牌位图的控件。因为 NSIS 在插件此控件时是使其保持于授权协议文件
控件等高的,所以当使用用 modern2.exe 对话框模板时会与对话框顶部多出 45 的距离——不罗嗦了,总之根据
需要搞得好看就行(别过火!)。
顺便提一下,NSIS 安装目中的 Contrib\UIs 子目录下提供了多种对话框模板,你可以自行选用(就是用
ChangeUI 指令或用宏指令),甚至根据需要用资源编辑器修改模板资源。
接着修改:找到 111 项,把里面的资源汉化掉(新的界面居然没有对此对话框的多语言支持!这个对话框只有在
大容量的安装程序执行时才显示)。
用 ExeScope 更新后,再用 Hex WorkShop 打开我问可怜的试验品——study.exe,查找字符串
“unpacking data: ”(没引号的,你别瞎加。找不到别怪我 $_$)。找到后处理一下,用“正在解压缩数据:”
替换(正好 8 个字符 Yeah!)。
10. 现在我要说为什么不启用 UPX 压缩以及关闭 CRC 检测:
用 UPX 压缩可执行文件头或启用 CRC 检测(起用的话就是打开了自校验),我们的 ExeScope 就无用武之地了。但关于CRC校验又有些特别:使用者可以在命令行提示符下使用 /NCRC 开关参数执行安装程序,例如:若安装程序得文件名为“setup.exe”,那么就在命令行提示符下键入“setup.exe /NCRC”就可跳过 CRC 校验执行安装程序(但如果你将CRCCheck指令的参数设置为force的话,就什么办法也没了),但这样对使用者而言比较麻烦。
至此全部完工。

若有任何语法难点,请参阅 NSIS 的帮助文件(有了中文版的应该方便些吧!)。内有上千字的详细说明(可能更多,我也没统计过)。还有一些指令我没有用上,因为那些不太可能用的上。
这个示例脚本已能作出较佳的安装程序界面,大家看看我为 QCD v3.40B35 做的安装界面。




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-3 13:43 , Processed in 0.116016 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表