目录

1 NSIS简介

2 VNISEdit简介

3 使用VNISEdit向导制作安装脚本

3.1 选择 [文件]–>[新建脚本:向导]

3.2 进入到 NSIS 脚本向导 共9步

3.2.1 脚本向导9-1

3.2.2 填写应用程序基本信息9-2

3.2.3 安装程序语言 9-3

3.2.4 设置应用程序的目录和授权信息 9-4

3.2.5 选择应用程序文件和依赖的库 9-5

3.2.6 设置应用程序图标信息 9-6

3.2.7 设置安装完成后自动运行程序 9-7

3.2.8 解除安装 9-8

3.2.9 保存并编译脚本 9-9

4 编译脚本

5 修改脚本,增加定制功能

5.1 安装NsProcess插件

5.1.1 NsProcess插件下载地址

5.1.2 NsProcess插件安装

5.2 使用NsProcess插件在安装或卸载程序时判断指定程序是否在运行

5.3 开机自启

5.3.1 在安装脚本中编写开机自启函数

5.3.2 在安装脚本的完成页面属性中添加 checkbox 选择是否开机自启选择项

 5.3.3 在Function .onInit和un.onInit中分别调用删除开机自启,清除注册表残留信息

6 示例脚本下载

6.1 开发环境

6.2 功能介绍

6.3 下载地址


1 NSIS简介

        NSIS 是“Nullsoft 脚本安装系统”(Nullsoft Scriptable Installation System)的缩写,它是是一个专业开源的制作 windows 安装程序的工具,它的特点:脚本简洁高效;系统开销小;当然进行安装、卸载、设置系统设置、解压文件等等更不在话下,几乎可以做所有的事情。

        下载地址:https://nsis.sourceforge.io/Download

        它的脚本向导将帮助您只需点击几下即可创建标准安装程序。

2 VNISEdit简介

        VNISEdit是NSIS的最佳编辑器,它对使用NSIS创建设置程序的专家和初学者非常有用。

        下载地址:https://hmne.sourceforge.net/

        它的脚本向导将帮助您只需点击几下即可创建标准安装程序。

3 使用VNISEdit向导制作安装脚本

3.1 选择 [文件]–>[新建脚本:向导]

3.2 进入到 NSIS 脚本向导 共9步

3.2.1 脚本向导9-1

        按照向导引导进行制作

3.2.2 填写应用程序基本信息9-2

        其中必填的是程序名称和版本,其他没有的话是可以不填的。

3.2.3 安装程序语言 9-3

        安装程序(而非安装后程序)图标可以自己设置。安装程序文件指的是安装包的文件名(可以修改为自己想要的名字)。安装程序语言,至少需要选择一种语言,也可以选择多种语言。

3.2.4 设置应用程序的目录和授权信息 9-4

        这里的第一行非常重要,决定了你的程序一堆文件默认装在哪里,默认地址最好选择 $PROGRAMFILES*你的程序名文件夹*,不存在时将被创建,这里的 $PROGRAMFILES 每台电脑都不一样,但是都是系统识别的位置, $是一个转义符, $PROGRAMFILES代表程序安装目录,除此之外还有其他地址代号,代表不同的意思。

        给大家列举一些常用的地址代号

$PROFRAMFILES # 代表系统安装目录,在此目录下安装的程序能够被360软件管家、Windows“卸载或更改程序”等检测到存在

$SMPROGRAMS # 代表开始菜单目录,一般放置软件快捷方式,Win10不能在开始菜单放置卸载和帮助文档的快捷方式,这是Win10的规定,如果设置了是会被自动删除的

$INSTDIR # 代表这一步中设定的“应用程序默认目录”,也就是安装目录,如果用户更改安装目录,它将指向用户指定的目录(可以设置不允许用户改变安装目录)

        第二行许可证协议可以放置协议,可以设置三种同意的方式的一种。如果你不需要协议,可以通过删代码来实现,请参照后面的内容。 需要注意的是,中文的协议会乱码,最好使用英文协议或者改变编码形式。自定义协议文件效果。

3.2.5 选择应用程序文件和依赖的库 9-5

        继续指定应用程序文件,在这里我们添加程序所在的整个目录:

3.2.6 设置应用程序图标信息 9-6

3.2.7 设置安装完成后自动运行程序 9-7

        实际上它会给用户一个勾选框,征求用户的意见。

        如果你的程序是带参数运行的,那么,可以加入参数(就是在 cmd 运行时的给定的参数),自述文件就是 ReadMe.txt 之类的文件,如果你在程序目录下写了自述文件,会打开它,同样也会征求用户意见。

3.2.8 解除安装 9-8

3.2.9 保存并编译脚本 9-9

        设置一个脚本名称后进行编译:        

        VNISEdit 生成的脚本

; Script generated by the HM NIS Edit Script Wizard.

; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "CameraDemo"
!define PRODUCT_VERSION "1.0.1"
!define PRODUCT_PUBLISHER "My company, Inc."
!define PRODUCT_WEB_SITE "http://www.mycompany.com"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\CameraDemo.exe"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"

; MUI 1.67 compatible ------
!include "MUI.nsh"

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!insertmacro MUI_PAGE_LICENSE "c:\path\to\licence\YourSoftwareLicence.txt"
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!define MUI_FINISHPAGE_RUN "$INSTDIR\CameraDemo.exe"
!insertmacro MUI_PAGE_FINISH

; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES

; Language files
!insertmacro MUI_LANGUAGE "SimpChinese"

; MUI end ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "CameraDemo_Setup.exe"
InstallDir "$PROGRAMFILES\CameraDemo"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
ShowInstDetails show
ShowUnInstDetails show

Section "MainSection" SEC01
  SetOutPath "$INSTDIR"
  SetOverwrite try
  File "CameraAPI.dll"
  File "CameraAPI.h"
  File "CameraAPI.lib"
  File "CameraDemo.exe"
  CreateDirectory "$SMPROGRAMS\CameraDemo"
  CreateShortCut "$SMPROGRAMS\CameraDemo\CameraDemo.lnk" "$INSTDIR\CameraDemo.exe"
  CreateShortCut "$DESKTOP\CameraDemo.lnk" "$INSTDIR\CameraDemo.exe"
  File "mxImageTool.dll"
  File "mxImageTool.h"
  File "mxImageTool.lib"
SectionEnd

Section -AdditionalIcons
  WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
  CreateShortCut "$SMPROGRAMS\CameraDemo\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
  CreateShortCut "$SMPROGRAMS\CameraDemo\Uninstall.lnk" "$INSTDIR\uninst.exe"
SectionEnd

Section -Post
  WriteUninstaller "$INSTDIR\uninst.exe"
  WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\CameraDemo.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\CameraDemo.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
SectionEnd

Function un.onUninstSuccess
  HideWindow
  MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地从你的计算机移除。"
FunctionEnd

Function un.onInit
  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "你确实要完全移除 $(^Name) ,其及所有的组件?" IDYES +2
  Abort
FunctionEnd

Section Uninstall
  Delete "$INSTDIR\${PRODUCT_NAME}.url"
  Delete "$INSTDIR\uninst.exe"
  Delete "$INSTDIR\mxImageTool.lib"
  Delete "$INSTDIR\mxImageTool.h"
  Delete "$INSTDIR\mxImageTool.dll"
  Delete "$INSTDIR\CameraDemo.exe"
  Delete "$INSTDIR\CameraAPI.lib"
  Delete "$INSTDIR\CameraAPI.h"
  Delete "$INSTDIR\CameraAPI.dll"

  Delete "$SMPROGRAMS\CameraDemo\Uninstall.lnk"
  Delete "$SMPROGRAMS\CameraDemo\Website.lnk"
  Delete "$DESKTOP\CameraDemo.lnk"
  Delete "$SMPROGRAMS\CameraDemo\CameraDemo.lnk"

  RMDir "$SMPROGRAMS\CameraDemo"
  RMDir "$INSTDIR"

  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
  SetAutoClose true
SectionEnd

4 编译脚本

        编译会有如下错误,这是因为我们没有提供对应路径的授权文件。上面也有提供:如果我们不需要授权协议,可以通过删红框代码来实现。

        屏蔽授权协议后,则可以编译。

        编译成功后,在CameraDemo.exe程序目录下会增加一个CameraDemo_Setup.exe文件。点击CameraDemo_Setup.exe文件可进行安装。

5 修改脚本,增加定制功能

5.1 安装NsProcess插件

5.1.1 NsProcess插件下载地址

        https://nsis.sourceforge.io/NsProcess_plugin

5.1.2 NsProcess插件安装

        解压下载的NsProcess.zip。

  • 将Include目录下的nsProcess.nsh拷贝到NSIS安装目录的Include下,如C:\Program Files (x86)\NSIS\Include\

  • 将Plugin目前下的nsProcess.dll拷贝到NSIS安装目录的Plugin\x86-ansi下,如C:\Program Files (x86)\NSIS\Plugins\x86-ansi下

  • 将Plugin目前下的nsProcessW.dll改名为nsProcess.dll拷贝到NSIS安装目录的Plugin\x86-unicode下,如C:\Program Files (x86)\NSIS\Plugins\x86-unicode下

5.2 使用NsProcess插件在安装或卸载程序时判断指定程序是否在运行

        在安装脚本中引入nsProcess头文件

!include "nsProcess.nsh"

        在安装脚本中编写Macro,用于判断安装或卸载程序时指定程序是否在运行

;编写Macro,用于判断安装或卸载程序时指定程序是否在运行
!macro FindProcess    
    StrCpy $1 "CameraDemo.exe"
    nsProcess::_FindProcess "$1"
    Pop $R0
    ${If} $R0 = 0
          MessageBox MB_OK|MB_ICONSTOP "程序检测到 ${PRODUCT_NAME} 正在运行,请关闭 ${PRODUCT_NAME} 重新开始!" IDOK
          Abort
    ${EndIf}
!macroend

;编写Macro,用于判断安装或卸载程序时指定程序是否在运行,并提示是否强制关闭继续安装
!macro FindProcessAndKill    
    StrCpy $1 "CameraDemo.exe"
    nsProcess::_FindProcess "$1"
    Pop $R0
    ${If} $R0 = 0
          MessageBox MB_OKCANCEL|MB_ICONQUESTION   \
                     "安装程序检测到 ${PRODUCT_NAME} 正在运行。$\r$\n$\r$\n点击 “确定” 强制关闭${PRODUCT_NAME},继续安装。$\r$\n$\r$\n点击 “取消” 退出安装程序。" \
                     /SD IDOK IDOK label_ok IDCANCEL label_cancel
          label_ok:
                   nsProcess::_KillProcess "CameraDemo.exe"
                   Goto end
          label_cancel:
                   Abort
    ${EndIf}
    end:
!macroend

         在Function .onInit和un.onInit中分别调用该Macro

Function .onInit
   ;检查指定程序是否在运行
   !insertmacro FindProcess
FunctionEnd

Function un.onInit
  ;检查指定程序是否在运行
  !insertmacro FindProcess
  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "你确实要完全移除 $(^Name) ,其及所有的组件?" IDYES +2
  Abort
FunctionEnd

5.3 开机自启

5.3.1 在安装脚本中编写开机自启函数

Function AutoBoot
    WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "CameraDemo.exe" "CameraDemo.exe"
FunctionEnd

5.3.2 在安装脚本的完成页面属性中添加 checkbox 选择是否开机自启选择项

!define MUI_FINISHPAGE_SHOWREADME
!define MUI_FINISHPAGE_SHOWREADME_Function AutoBoot
!define MUI_FINISHPAGE_SHOWREADME_TEXT "开机自启"

 5.3.3 在Function .onInit和un.onInit中分别调用删除开机自启,清除注册表残留信息

Function .onInit
   ;检查指定程序是否在运行
   !insertmacro FindProcess
   ;删除可能上次遗留的开机自启的注册表信息
   DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "CameraDemo.exe"
FunctionEnd

Function un.onInit
  ;检查指定程序是否在运行
  !insertmacro FindProcess
  ;删除开机自启的注册表信息
  DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "CameraDemo.exe"
  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "你确实要完全移除 $(^Name) ,其及所有的组件?" IDYES +2
  Abort
FunctionEnd

6 示例脚本下载

6.1 开发环境

  • NSIS 3.10

  • HM NIS Edit 2.0.3

  • NsProcess 1.6

  • Windows 10 Pro x64

6.2 功能介绍

        包含NSIS、HM NIS Edit和NsProcess安装包,以及示例脚本,示例脚本演示了基于NSIS如何制作一个安装包,如何在安装或卸载程序时判断指定程序是否在运行,如何让指定程序开机自启等功能。

6.3 下载地址

        开发环境:

  • NSIS 3.10

  • HM NIS Edit 2.0.3

  • NsProcess 1.6

  • Windows 10 Pro x64

        下载地址:NSIS安装包及示例脚本

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐