杉宫竹苑工作室

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

NSIS 安装程序大致体例【新手研究】

[复制链接]
发表于 2022-7-25 15:18:30 | 显示全部楼层 |阅读模式

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

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

x

NSIS 大体布局如下:
预设参数(包括外部压缩器选择、编译选项、宏定义以及文件包含等)
普通安装设置
自定义函数
安装程序区域内容
安装程序回调函数及其相关函数定义
卸载程序区域内容
卸载程序回调函数及其相关函数定义


  1. ; study.nsi
  2. ;
  3. ; 以下脚本用以生成 study.exe 文件
  4. ; 它包含有授权协议
  5. ;
  6. ; 安装时若发现应用程序正在运行,安装程序会提示并替用户关闭应用程序
  7. ; 安装成功后会自动运行应用程序
  8. ;
  9. ; 启用新的 Modern UI 的宏指令语法,原先的部分指令将被禁止以防止重复
  10. ; 我会尽量展示如何基本指令的用法。当然宏指令也会与一些基本指令发生重
  11. ; 复定义的情况,不过 NSIS 照样能编译成功.
  12. ; 其中的一些路径、文件你可以根据需要更改
  13. ; 启用外部压缩工具(这里我们不用,原因看第 10 步)
  14. ;!define HAVE_UPX
  15. ; 若启用了外部压缩工具,这进行可执行文件头的压缩
  16. !ifdef HAVE_UPX
  17. ; 用 UPX 压缩可执行文件头(用其他的相关工具也行)
  18. !packhdr tmp.dat "E:UPX\upx --best tmp.dat"
  19. !endif
  20. ; 编译选项
  21. ; 设置覆盖标记
  22. SetOverwrite on
  23. ; 设置压缩选项
  24. SetCompress auto
  25. ; 选择压缩方式
  26. SetCompressor bzip2
  27. ; 设置数据块优化
  28. SetDatablockOptimize on
  29. ; 设置数据写入时间
  30. SetDateSave on
  31. ; 相关数据预设
  32. ; 软件的名字,后面的${NAME}调用这个名字
  33. !define NAME "NSIS"
  34. !define NAME_FULL "全方位掌握 NSIS 的使用"
  35. !verbose 3
  36. ; 包含窗口消息定义文件
  37. !include "${NSISDIR}\Examples\WinMessages.nsh"
  38. ; 包含新界面的宏指令文件
  39. !include "${NSISDIR}\Examples\Modern UI\ModernUI.nsh"
  40. ; 包含标牌位图宏指令文件
  41. !include "${NSISDIR}\Examples\branding.nsh"
  42. !verbose 4
  43. !define CURRENTPAGE $9
  44. !define TEMP1 $R0
  45. !define TEMP2 $R1
  46. ; 插入安装界面宏定义(这里我禁用了,启用也没问题。编译照样通过。后面我都定义过了)
  47. ;!insertmacro MUI_INTERFACE "modern2.exe" "adni18-installer-C-no48xp.ico" "adni18-uninstall-C-no48xp.ico" "modern.bmp" "smooth"
  48. ; 安装程序设置
  49. ; 输出文件
  50. OutFile "F:\study.exe"
  51. ; 安装程序名称
  52. Name /LANG=2052 "NSIS"
  53. ; 替换对话框样式
  54. ChangeUI all "${NSISDIR}\Contrib\UIs\modern2.exe"
  55. ; 启用 WindowsXP 的视觉样式
  56. XPstyle on
  57. ;设置字体
  58. SetFont 宋体 9
  59. ; 标题名称
  60. Caption /LANG=2052 "全方位掌握 NSIS 的使用"
  61. ; 标牌的内容
  62. BrandingText /LANG=2052 /TRIMCENTER "Shao Hao"
  63. ; 安装程序图标
  64. Icon "F:\12\QCDIcon.ico"
  65. ; 安装程序显示标题
  66. WindowIcon on
  67. ; 添加标牌位图(放在顶部用 TOP 参数。后面接高度)
  68. AddBrandingImage LEFT 105
  69. ; 设定渐变背景
  70. BGGradient off
  71. ; 设置安静安装模式
  72. ;SilentInstall normal
  73. ; 设置安静卸载模式
  74. ;SilentUnInstall normal
  75. ; 执行 CRC 检查(最好用 on 打开。关闭是因为还要修改安装程序,看第 10 步)
  76. CRCCheck off
  77. ; 加载相应的语言文件
  78. LoadLanguageFile "${NSISDIR}\Contrib\Language files\SimpChinese.nlf"
  79. ; 替换各个对话框标题的文字
  80. SubCaption /LANG=2052 0 "授权协议"
  81. SubCaption /LANG=2052 1 "安装选项"
  82. SubCaption /LANG=2052 2 "安装目录"
  83. SubCaption /LANG=2052 3 "正在安装"
  84. SubCaption /LANG=2052 4 "完成安装"
  85. ; 替换默认按钮的文字
  86. MiscButtonText /LANG=2052 "< 上一步" "下一步 >" "取消" "关闭"
  87. ; 替换“安装”按钮的文字
  88. ;InstallButtonText /LANG=2052 "安装"
  89. ; 替换当文件无法被写入时的警告窗的文字
  90. FileErrorText /LANG=2052 "无法写入文件$\r$\n$0$\r$\n请确认文件属性不是只读且未被使用中!"
  91. ; 默认的安装目录
  92. InstallDir "$PROGRAMFILES\QCD 3"
  93. ; 如果可能的化从注册表中监测安装路径
  94. InstallDirRegKey HKLM \
  95. "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" \
  96. "UninstallString"
  97. ; 授权协议页面
  98. LicenseText /LANG=2052 "NSIS 是免费软件。安装前请先阅读以下协议条款" "我同意"
  99. ; 使用授权协议文本
  100. LicenseData /LANG=2052 "F:\12\License.txt"
  101. ; 设置授权协议页面的背景色
  102. ;LicenseBkColor 000000
  103. ; 选择要按安装的组件
  104. ComponentText /LANG=2052 "现在将安装 ${NAME_FULL}到您的计算机:" "请选择安装类型" "或选择您希望安装的组件"
  105. InstType "完全安装(都在了)"
  106. InstType "典型安装"
  107. InstType /LANG=2052 /CUSTOMSTRING=自定义?
  108. ;InstType /LANG=2052 /NOCUSTOM
  109. ;InstType /COMPONENTSONLYONCUSTOM
  110. CheckBitmap "${NSISDIR}\Contrib\Icons\modern.bmp"
  111. ; 替换显示磁盘空间信息的文字
  112. SpaceTexts /LANG=2052 "所需空间:" "可用空间:"
  113. ; 提示用户输入目录的文本
  114. ; DirShow hide
  115. ; 替换显示选择安装目录的文字
  116. DirText /LANG=2052 "请选择 ${NAME} 的安装路径:" "选择目录用以安装 ${NAME}:" "浏览..."
  117. ; 是否允许安装在根目录下
  118. AllowRootDirInstall false
  119. ; 安装信息的颜色
  120. ;InstallColors 000000 FFFFFF
  121. ; 安装进度条显示方式
  122. InstProgressFlags smooth colored
  123. ; 完成后自动关闭安装程序
  124. AutoCloseWindow true
  125. ; 显示“显示详细细节”对话框
  126. ShowInstDetails hide
  127. ; 替换“显示细节”按钮的文字
  128. DetailsButtonText /LANG=2052 "显示细节"
  129. ; 替换“完成”按钮的文字
  130. CompletedText /LANG=2052 "已完成"
  131. ; 卸载程序设置
  132. ; 替换卸载程序的文字
  133. UninstallText /LANG=2052 "现在将从你的系统中卸载 ${NAME}:" "卸载目录:"
  134. ; 卸载程序图标
  135. UninstallIcon "F:\12\UnQCDIcon.ico"
  136. ; 替换卸载程序标题的文字
  137. UninstallCaption /LANG=2052 "卸载 ${NAME}"
  138. ; 替换卸载程序每页按钮的文字
  139. UninstallSubCaption /LANG=2052 0 ":确认"
  140. UninstallSubCaption /LANG=2052 1 ":正在删除文件"
  141. UninstallSubCaption /LANG=2052 2 ":完成"
  142. ; 卸载程序显示方式
  143. ShowUninstDetails hide
  144. ; 替换“卸载”按钮的文字
  145. UninstallButtonText /LANG=2052 "卸载"
  146. ; 安装程序内容及其相关的回调函数
  147. ; 安装程序内容
  148. Section /e "!主要程序(必须安装)" SecCore
  149. SectionIn 1 2 RO
  150. ; 设置输出路径,每次使用都会改变
  151. SetOutPath $INSTDIR
  152. ; 循环包含目录下全部内容
  153. File /r "F:\12\1\*.*"
  154. ; 只包含一个文件
  155. File "F:\12\gf.gif"
  156. ; 处理动态连接库文件
  157. IfFileExists "$INSTDIR\1.dll" 0 NoFile1
  158. ; 取消组件注册
  159. UnRegDll "$INSTDIR\1.dll"
  160. Delete "$INSTDIR\1.dll"
  161. NoFile1:
  162. File "F:\12\1.dll"
  163. ; 注册组件
  164. RegDLL "$INSTDIR\QCDIconMgr.dll"
  165. ; 写入软件注册键值
  166. WriteRegStr HKLM "Software\NSIS\NSIS" "" "$INSTDIR"
  167. ; 为 Windows 卸载程序写入键值
  168. WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "DisplayName" "NSIS(只用于移除)"
  169. WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "UninstallString" '"$INSTDIR\uninst.exe"'
  170. ; 写入生成卸载程序(可多次使用)
  171. WriteUninstaller "$INSTDIR\uninst.exe"
  172. SectionEnd
  173. Section /e "扩展(可选)" SecUpdate
  174. SectionIn 1
  175. SetOutPath "$INSTDIR\Plugins"
  176. File "F:\12\qcdplus\Plugins\2.dll"
  177. File /r "F:\12\qcdplus\Plugins\3"
  178. SectionEnd
  179. SubSection /e "选项" SecOptions
  180. Section /e "创建桌面图标" SecDesktopShortCut
  181. SectionIn 1 2
  182. SetOutPath "$INSTDIR\Plugins"
  183. CreateShortCut "$DESKTOP\NSIS.lnk" "$INSTDIR\gf.gif"
  184. WriteUninstaller "$INSTDIR\uninst.exe"
  185. SectionEnd
  186. Section /e "创建快速启动栏图标" SecQuickbarShortCut
  187. SectionIn 1 2
  188. SetOutPath "$INSTDIR\Plugins"
  189. CreateShortCut "$QUICKLAUNCH\NSIS.lnk" "$INSTDIR\gf.gif"
  190. WriteUninstaller "$INSTDIR\uninst.exe"
  191. SectionEnd
  192. Section /e "创建 NSIS 程序组" SecShortCutGroup
  193. SectionIn 1 2
  194. SetOutPath "$INSTDIR\Plugins"
  195. CreateDirectory "$SMPROGRAMS\NSIS"
  196. CreateShortCut "$SMPROGRAMS\QCD Player\gf.lnk" "$INSTDIR\gf.gif"
  197. WriteUninstaller "$INSTDIR\uninst.exe"
  198. SectionEnd
  199. SubSectionEnd
  200. Section "-Run"; 运行?
  201. ExecWait '"$INSTDIR\2.exe" -p'
  202. WriteINIStr "$INSTDIR\NSIS.ini" "2" "Language" "Chinese"
  203. Exec "$INSTDIR\2.exe"
  204. ExecShell open "$INSTDIR\汉化说明.htm"
  205. SectionEnd
  206. Section ""
  207. ;Invisible section to display the Finish header
  208. !insertmacro MUI_FINISHHEADER SetHeader
  209. SectionEnd
  210. ; 安装程序初始化设置
  211. Function .onInit
  212. ; 发现有程序正在运行时提示退出后继续运行
  213. loop:
  214. FindWindow $R0 "NSIS"
  215. IntCmp $R0 0 done
  216. MessageBox MB_OKCANCEL \
  217. "NSIS 正在运行。$\n点击“确定”按钮会关闭 NSIS 然后继续安装,点击“取消”按钮将退出安装程序" \
  218. IDOK NoAbort
  219. Abort
  220. NoAbort:
  221. SendMessage $R0 1029 0 0
  222. ; 稍等后继续检测直至检测不到或用户选择取消
  223. Sleep 444
  224. Goto loop
  225. done:
  226. ; 显示 Logo 画面
  227. SetOutPath $TEMP
  228. File /oname=qcd_logo.bmp "F:\12\logo.bmp"
  229. File /oname=magiclime.exe "${NSISDIR}\Bin\magiclime.exe"
  230. ExecWait '"$TEMP\magiclime.exe" qcd_logo.bmp'
  231. Delete "$TEMP\magiclime.exe"
  232. Delete "$TEMP\qcd_logo.bmp"
  233. ; 初始化标牌位图
  234. !insertmacro BI_INIT $R0
  235. FunctionEnd
  236. ; 安装程序主界面的相关文本
  237. Function SetHeader
  238. !insertmacro MUI_HEADER_INIT
  239. !insertmacro MUI_HEADER_START 1
  240. !insertmacro MUI_HEADER_TEXT 2052 "授权协议" "安装 ${NAME} 之前,请认真阅读一下授权条款."
  241. !insertmacro MUI_HEADER_STOP 1
  242. !insertmacro MUI_HEADER_START 2
  243. !insertmacro MUI_HEADER_TEXT 2052 "选择组件" "请选择你要安装的组件."
  244. !insertmacro MUI_HEADER_STOP 2
  245. !insertmacro MUI_HEADER_START 3
  246. !insertmacro MUI_HEADER_TEXT 2052 "选择安装位置" "为 ${NAME} 选择一个安装目录."
  247. !insertmacro MUI_HEADER_STOP 3
  248. !insertmacro MUI_HEADER_START 4
  249. !insertmacro MUI_HEADER_TEXT 2052 "安装" "${NAME} 已经安装,请等待."
  250. !insertmacro MUI_HEADER_STOP 4
  251. !insertmacro MUI_HEADER_START 5
  252. !insertmacro MUI_HEADER_TEXT 2052 "完成" "安装顺利完成."
  253. !insertmacro MUI_HEADER_STOP 5
  254. !insertmacro MUI_HEADER_END
  255. FunctionEnd
  256. ; 初始化安装程序对话框的显示文本
  257. Function .onInitDialog
  258. !insertmacro MUI_INNERDIALOG_INIT
  259. !insertmacro MUI_INNERDIALOG_START 1
  260. !insertmacro MUI_INNERDIALOG_TEXT 2052 1040 "如果你同意协议中的所有条款,选择“我同样”继续安装,如果你选择了“取消”,安装程序将终止,只有接受条款才能安装 ${NAME}."
  261. !insertmacro MUI_INNERDIALOG_STOP 1
  262. !insertmacro MUI_INNERDIALOG_START 2
  263. !insertmacro MUI_INNERDIALOG_TEXT 2052 1042 "描述"
  264. !insertmacro MUI_INNERDIALOG_TEXT 2052 1043 "移动你的鼠标到组件上,便可以见到相关的描述."
  265. !insertmacro MUI_INNERDIALOG_STOP 2
  266. !insertmacro MUI_INNERDIALOG_START 3
  267. !insertmacro MUI_INNERDIALOG_TEXT 2052 1041 "目标文件夹"
  268. !insertmacro MUI_INNERDIALOG_STOP 3
  269. !insertmacro MUI_INNERDIALOG_END
  270. FunctionEnd
  271. ; 转到下页面时的处理
  272. Function .onNextPage
  273. !insertmacro MUI_NEXTPAGE_OUTER
  274. !insertmacro MUI_NEXTPAGE SetHeader
  275. ; 标牌位图设置
  276. !insertmacro BI_NEXT
  277. FunctionEnd
  278. ; 转到上一页面时的处理
  279. Function .onPrevPage
  280. !insertmacro MUI_PREVPAGE
  281. ; 标牌位图设置
  282. !insertmacro BI_PREV
  283. FunctionEnd
  284. ; 鼠标移到指定组件时的显示处理
  285. Function .onMouseOverSection
  286. ; 用宏指令设置安装自己的注释文本
  287. !insertmacro MUI_DESCRIPTION_INIT
  288. !insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecCore} "安装主应用程序"
  289. !insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecUpdate} "安装 NSIS 的更新或新增插件"
  290. !insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecOptions} "选择 NSIS 的其他安装选项,例如:创建快捷方式和应用程序组的"
  291. !insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecDesktopShortCut} "在用户的桌面上创建 NSIS 的快捷方式"
  292. !insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecQuickbarShortCut} "在用户的快速栏里创建 NSIS 快捷方式"
  293. !insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecShortCutGroup} "在用户的开始菜单的程序中创建 NSIS 的快捷方式组"
  294. !insertmacro MUI_DESCRIPTION_END
  295. FunctionEnd
  296. ; 安装成功完成后的设置
  297. Function .onInstSuccess
  298. ; 自己加吧:)
  299. FunctionEnd
  300. ; 放弃安装时警告窗口的显示信息
  301. Function .onUserAbort
  302. !insertmacro MUI_ABORTWARNING 2052 "你确定要推出 ${NAME} 的安装吗?"
  303. !insertmacro MUI_ABORTWARNING_END
  304. FunctionEnd
  305. ; 安装程序标牌位图列表
  306. !insertmacro BI_LIST
  307. !insertmacro BI_LIST_ADD "F:\12\Brand1.bmp" /RESIZETOFIT
  308. !insertmacro BI_LIST_ADD "F:\12\Brand2.bmp" /RESIZETOFIT
  309. !insertmacro BI_LIST_ADD "F:\12\Brand3.bmp" /RESIZETOFIT
  310. !insertmacro BI_LIST_END
  311. ; 卸载程序及其相关回调函数
  312. ; 卸载程序内容
  313. Section "Uninstall"
  314. ExecWait '"$INSTDIR\12.exe" /un'
  315. ; 循环删除文件直至删除文件夹
  316. RMDir /r "$SMPROGRAMS\NSIS"
  317. UnRegDLL "$INSTDIR\2.dll"
  318. Delete "$INSTDIR\QCDIconMgr.dll"
  319. Delete "$INSTDIR\*.*"
  320. DeleteRegKey HKLM "Software\NSIS"
  321. DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS"
  322. MessageBox MB_YESNO|MB_ICONQUESTION \
  323. "是否连插件目录也要删除?$\n(若您要保留这些文件,请点击下面的“否”按钮)" \
  324. IDNO NoDelete
  325. ; 全删光!!!
  326. RMDir /r "$INSTDIR"
  327. NoDelete:
  328. SectionEnd
  329. ; 定义卸载程序标牌位图
  330. !define BI_UNINSTALL
  331. !include "${NSISDIR}\Examples\branding.nsh"
  332. ; 初始化卸载程序对话框的设置
  333. Function un.onInit
  334. ; 初始化标牌位图
  335. !insertmacro BI_INIT $R0
  336. FunctionEnd
  337. ; 卸载程序主界面的相关文本
  338. Function un.SetHeader
  339. !insertmacro MUI_HEADER_INIT
  340. !insertmacro MUI_HEADER_START 1
  341. !insertmacro MUI_HEADER_TEXT 2052 "卸载 ${NAME}" "${NAME_FULL} 将从你的系统里移除."
  342. !insertmacro MUI_HEADER_STOP 1
  343. !insertmacro MUI_HEADER_START 2
  344. !insertmacro MUI_HEADER_TEXT 2052 "卸载" "${NAME} 正在被卸载,请等待."
  345. !insertmacro MUI_HEADER_STOP 2
  346. !insertmacro MUI_HEADER_START 3
  347. !insertmacro MUI_HEADER_TEXT 2052 "完成" "${NAME_FULL} 已从你的系统中移除."
  348. !insertmacro MUI_HEADER_STOP 3
  349. !insertmacro MUI_HEADER_END
  350. FunctionEnd
  351. ; 初始化卸载程序对话框时的处理
  352. Function un.onInitDialog
  353. ; 自己加:)
  354. FunctionEnd
  355. ; 卸载程序转到下一页时的处理
  356. Function un.onNextPage
  357. !insertmacro MUI_NEXTPAGE_OUTER
  358. !insertmacro MUI_NEXTPAGE un.SetHeader
  359. ; 标牌位图设置
  360. !insertmacro BI_NEXT
  361. FunctionEnd
  362. ; 卸载程序完成时的处理
  363. Function un.onUninstSuccess
  364. ; 再加^_^
  365. FunctionEnd
  366. ; 放弃卸载程序时的处理
  367. Function un.onUserAbort
  368. FunctionEnd
  369. ; 卸载程序标牌位图列表
  370. !insertmacro BI_LIST
  371. !insertmacro BI_LIST_ADD "F:\12\UnBrand1.bmp" /RESIZETOFIT
  372. !insertmacro BI_LIST_ADD "F:\12\UnBrand2.bmp" /RESIZETOFIT
  373. !insertmacro BI_LIST_END
  374. ; 结束

复制代码


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 19:18 , Processed in 0.178217 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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