架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 119|回复: 4

NSIS(一)制作一个简单的安装程序

[复制链接]
发表于 2024-1-28 09:42:28 | 显示全部楼层 |阅读模式
需求:使用 Winform 开发了一款应用程序,想制作一个安装程序来安装并执行这个应用程序,显示产品比较正式一些。

NSIS 介绍

NSIS(Nullsoft Scriptable Install System)是一个专业的开源系统,用于创建 Windows 安装程序。它被设计得尽可能小和灵活,因此非常适合互联网分发。

作为用户对产品的第一次体验,稳定可靠的安装程序是成功软件的重要组成部分。使用 NSIS,您可以创建这样的安装程序,它能够执行安装软件所需的所有操作。

NSIS 是基于脚本的,允许您创建逻辑来处理最复杂的安装任务。许多插件和脚本已经可用:您可以创建 Web 安装程序、与 Windows 和其他软件组件通信、安装或更新共享组件等等。


NSIS 下载:

https://nsis.sourceforge.io/Download
https://prdownloads.sourceforge.net/nsis/nsis-3.09-setup.exe

NSIS 插件:https://nsis.sourceforge.io/Category:Plugins

HM NIS EDIT 下载:

https://hmne.sourceforge.net/
http://prdownloads.sourceforge.net/hmne/nisedit2.0.3.exe

HM NIS EDIT:免费的 NSIS 编辑器/IDE:HM NIS Edit 是Nullsoft 脚本安装系统(NSIS)   的最佳编辑器/IDE 。对于使用 NSIS 创建安装程序的专家和初学者来说,它非常有用。其脚本向导将帮助您只需单击几下即可创建标准安装程序,其 InstallOptions 设计器将帮助您通过友好的拖放界面创建自己的自定义页面。

下载安装

下载 NSIS 和 HM NIS EDIT 软件,先安装 NSIS,再安装 HM NIS EDIT,如下图:

QQ截图20240127192847.jpg QQ截图20240127192950.jpg

制作安装包

新建 Winform 应用,使用 IDE 工具新建一个 .net framework 4.7.2 的 Winform 应用(略),编译后使用 NSIS 制作安装包。

打开 HM NIS EDIT 工具,选择“文件”->“新建脚本:向导”,如下图:

QQ截图20240127200726.jpg QQ截图20240127201101.jpg

根据自己实际情况自定义应用程序信息,如下图:

QQ截图20240127201214.jpg

安装程序语言取消勾选“英语”,选择“中文简体”,如下图:

QQ截图20240128091552.jpg

设置授权文件路径,如下图:

QQ截图20240128091736.jpg

指定应用程序文件,删除已有的配置,然后,添加我们的应用程序目录,如下图:

QQ截图20240128091913.jpg QQ截图20240128091930.jpg QQ截图20240128092000.jpg QQ截图20240128092009.jpg


点击下一步,如下图:

QQ截图20240128092119.jpg

程序、参数、自述请根据自己情况填写,如下图:

QQ截图20240128092219.jpg

卸载程序配置,如下图:

QQ截图20240128092233.jpg

最后一步,保存为 test.nsi 脚本,方便下次编译,如下图:

QQ截图20240128092340.jpg

编译脚本,生成安装包,如下图:

QQ截图20240128092746.jpg

附上 test.nsi 代码:

(完)





上一篇:【译】探索 .Net Reactive 响应式扩展中的主题
下一篇:NSIS(二)互斥量保证只有一个安装程序运行
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2024-1-28 10:09:14 | 显示全部楼层

函数意义
Section最基础的函数,表示一个部门,用来代表一个需要安装的组件,Section中的内容是整个程序除了卸载以外最后执行的部分,但是编译时会第一个检查,如果程序中没有任何Section或Function,将会终止编译,Section内的代码块需要缩进2空格
Function执行的函数,同样需要缩进,它的函数名会被识别,如果识别为特殊名称,将会在特定情况下进行,下面还会讲解
SectionEnd表示部门结束,不缩进于Section内部
FunctionEnd表示函数结束,同上
SetCompressor设置压缩算法,后面可用的参数就是向导中的压缩算法,固实的用/SOLID作为前缀,例:固实lzma算法记作/SOLID lzma
SetCompressor设置压缩分卷大小,后接一个数字,通常不写是没关系的
OutFile决定编译好的安装包的路径(是指未来的安装包的路径,而不是放在哪个文件夹)
Name设置产品的名称,通常是向导第一步中写的应用程序名称+应用版本
InstallDir表示默认的安装路径,即向导第四步第一行填入的内容,决定了$INSTDIR的值
ShowInstDetails表示是否显示安装细节,参数不是简单的true和false,而是show,hide和nevershow,分别表示自动显示细节、用户按键显示细节、不允许看到安装细节
ShowUnInstDetails表示是否显示卸载细节,参数同上
BrandingText显示安装包下沿的信息,即向导第一步最后一行自定义文本,可以接受两个参数,一个是要显示的文字,还有可选参数是/TRIM,可以决定文字对齐方向(LEFT,RIGHT或者CENTER,默认为LEFT,必须写作/TRIMLEFT、/TRIMRIGHT或/TRIMCENTER,中间没有任何分隔)
SetOutPath只能写在Section中第一行,决定了所属Section表示的组件的安装位置,不同于InstallDir,SetOutPath可以让不同的组件安装在总安装目录的不同子目录下,建议设置为$INSTDIR\组件名称的文件夹(或者如果组件互相依赖,可以另行调整组件路径)
SetOverWrite只能写在Section中,用来设置已安装时是否覆盖,参数可以设置为始终覆盖(on),始终不覆盖(off),较新时覆盖(ifnewer),文件内容不同时覆盖(ifdiff)和尝试覆盖(try),对应向导第五步>编辑目录项目
File只能写在Section中,表示该Section包含并打包的文件,/r转义参数代表包含子目录的文件和文件夹,对应的向导步骤同上;/x参数用来排除文件,可以写/x “*.ico” “xxx\*”,分别表示排除ico文件和排除xxx子目录下的所有文件,对应向导第五步
CreateDictionary创建一个文件夹,后面加上的是文件夹的完整路径或相对路径
CreateShortcut创建一个快捷方式,第一个是快捷方式的路径(后缀.lnk),第二个是快捷方式指向文件的路径,对应向导第六步下面部分
WriteUninstaller创建解除安装程序,后面接卸载程序的路径名
WriteRegStr写入注册表,这一般不需要进行更改,按照向导生成的就行了
Delete通常在卸载Section中,删除单个文件,后接删除的文件的路径,由于删除的是单个文件,所以不能加/r
RMDir通常在卸载Section中,删除目录和目录下的所有文件,后接删除的目录的路径,前面一般需要手动加上转义/r,向导没给你加,不加会卸载残留,最好每个子目录写一次这个指令,都要加上/r,最后移除总目录RMDir “$INSTDIR”
DeleteRegKey删除注册表信息,一般按照向导生成就行了
SetAutoClose只能写在Section中,表示安装完成之后是否自动跳到完成界面,参数为true和false
AutoCloseWindow似乎并没有什么作用,功能看似和上一个是相同的,但是可以写在Section以外,参数同上
Messagebox消息框,只能写在Section或Function中,参数有很多,包括显示信息、显示警告、问yes no,问okcancelretry等,VNISEdit中输入Messagebox可以获得全部参数列表,后面再接消息框显示的内容
Abort阻塞,等待用户回答
HideWindow隐藏窗口,通常用于卸载Section中,卸载程序先删除自己,再删除其他文件(没错,程序还在运行),删除了之后要自动关掉窗口


码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2024-1-28 11:07:28 | 显示全部楼层
回调函数

安装时的回调函数

.onGUIInit
.onInit
.onGUIEnd
.onRebootFailed
.onSelChange
.onUserAbort
.onVerifyInstDir

卸载时的回调函数

un.onGUIInit
un.onInit
un.onUninstFailed
un.onUninstSuccess
un.onGUIEnd
un.onRebootFailed
un.onSelChange
un.onUserAbort


详解如下:

onGUIInit:
该回调将会在第一个页面被载入并且显示安装程序对话框前被调用,允许你来调整用户界面。

onInit:
该回调将会在当安装程序接近完成初始化时调用。如果 .onInit 函数调用了 Abort,则安装程序立即退出。

onInstFailed:
该回调函数当在安装失败后用户点击“取消”按钮时被调用(如果安装程序不能释放任何文件,或安装脚本使用了 Abort 命令)。

onInstSuccess:
该回调当安装成功且正当安装窗口关闭前(如果 AutoCloseWindow 或 SetAutoClose 被设为 false 时可能在用户点击“关闭”之后)调用。

onGUIEnd:
该回调正当安装程序窗口关闭之后被调用。需要时用来释放任何与用户界面有关的插件。

onMouseOverSection:
该回调只要鼠标在树形区段选择框上移动时就被调用。这可以使你给每个区段设置一个样本描述。鼠标停留所在的当前区段 ID 已被临时的保存,为 $0。

onRebootFailed:
该回调函数当 Reboot 指令失败时被调用。WriteUninstaller, plug-ins, File 和 WriteRegBin 不能用于该回调函数。

onSelChange:
当在组件选择页面选项被改变时被调用。常用于使用 SectionSetFlags 和 SectionGetFlags。

onUserAbort:
该回调当用户点击“取消”按钮且安装尚未失败时被调用。如果该函数调用 Abort,则安装将不退出。

onVerifyInstDir:
该回调对于你的安装程序来说可以允许代为控制安装路径是否有效。每次用户更改安装路径的时候这段代码都会被调用一次。如果该函数调用 Abort,则 $INSTDIR 的路径被认为无效。

un.GUIInit:
该回调将会在第一个页面被载入并且显示卸载程序对话框前被调用,允许你来调整卸载程序的界面。

un.onInit:
该回调将会在当卸载程序接近完成初始化时调用。如果 un.onInit 函数使用了 Abort ,则卸载程序立即退出。注意如果需要时该函数可以验证和/或修改 $INSTDIR。

un.onUninstFailed:
该回调函数当在卸载失败后用户点击“取消”按钮时被调用(如果使用了 Abort 命令或其它失败的命令)。

un.onUninstSuccess:
该回调当卸载成功且正当卸载程序窗口关闭前(如果 SetAutoClose 被设为 false 时可能在用户点击“关闭”之后)调用。

un.onGUIEnd:
该回调正当卸载程序窗口关闭之后被调用。需要时用来释放任何与用户界面有关的插件。

un.onRebootFailed:
该回调函数当 Reboot 指令失败时被调用。 WriteUninstaller , plug-ins , File 和 WriteRegBin 不能用于该回调函数。

un.onUserAbort:
该回调当用户点击“取消”按钮且卸载尚未失败时被调用。如果该函数调用 Abort ,则卸载程序将不退出。

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2024-1-28 12:07:23 | 显示全部楼层
Call must be used with function names starting with "un." in the uninstall section.
Usage: Call function_name | [:label_name]


NSIS 有命名条件 - 从卸载程序调用的函数必须有“un”名称中的前缀。

解决方案如下:

参考:

https://nsis.sourceforge.io/Sharing_functions_between_Installer_and_Uninstaller
https://nsis.sourceforge.io/Macro_vs_Function

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2024-1-28 15:10:07 | 显示全部楼层
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-2-23 14:02

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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