NSIS入门:
官网
https://nsis.sourceforge.io/Main_Page
NSIS有默认的Page
license - 授权许可页面
components - 组建选择页面(每个section就是一个组建)
directory - 安装目录选择页面
instfiles - 安装页面,跑进度条的,执行安装过程的页面
uninstConfirm - 卸载确认页面,提示卸载目录所在位置
以上这些页面都不需要引用其他nsh文件,没有欢迎页面,没有安装完成页面,如果要欢迎页面和安装完成页面,需要引用MUI,即modern ui
!include MUI2.nsh
;定义基础信息
Name "产品名称"
OutFile "myprogram-setup.exe" ;生成的安装包文件的名字
Icon ".\myprogram\debug\res\defaultIcon.ico" ;//生成的安装包文件的图标
BrandingText "产品名或着别的" ;安装界面下面一行文字,不写的话默认是Nullsoft Install system v3.03
InstallDir "$PROGRAMFILES\myprogram" ;设置默认安装目录
;欢迎页面定义
!define MUI_WELCOMEFINISHPAGE_BITMAP ".\myprogram\debug\res\defaultIcon.bmp" ;欢迎页面左侧图片,尽量使用150x57差不多比例的bmp图片,可以使用其他分辨率,比例不一样缩放不好看,如果定义了还是看不到记得要加一行代码!insertmacro MUI_LANGUAGE "SimpChinese"
!define MUI_WELCOMEPAGE_TITLE "欢迎语,"
!define MUI_WELCOMEPAGE_TITLE_3LINES
!define MUI_WELCOMEPAGE_TEXT "欢迎语下面一点的字,可以写长点"
;卸载页面
!define MUI_UNWELCOMEFINISHPAGE_BITMAP ".\myprogram\debug\res\defaultIcon.bmp" ;卸载欢迎页面左边的图片
!define MUI_FINISHPAGE_RUN "$INSTDIR\${PRODUCT_NAME}.exe" ;定义安装完成后运行的程序路径
!insertmacro MUI_PAGE_WELCOME ;modern ui的欢迎页面
!insertmacro MUI_PAGE_LICENSE ".\license.txt" ;授权许可页面,及许可证书的路径
;!insertmacro MUI_PAGE_COMPONENTS ;组建页面,就是下面定义的一个个section,除un.开头的,如果只有一个组建,或者所有组建都需要安装,可以不要
!insertmacro MUI_PAGE_DIRECTORY ;安装目录选择,可以设置默认安装目录
!insertmacro MUI_PAGE_STARTMENU Application $0 ;启动菜单,字面意思,只是列举了所有启动程序,列表下面有一个复选框(不要创建快捷方式),如果选择了,Application下面!insertmacro MUI_STARTMENU_WRITE_BEGIN Application下面的代码会执行,否者不会!insertmacro MUI_STARTMENU_WRITE_BEGIN Application要放到section中
!insertmacro MUI_PAGE_INSTFILES ;安装页面,主要跑进度条,File命令和其他执行过程中的操作
!insertmacro MUI_PAGE_FINISH ;安装完成页面,可以定义是否运行程序 !define MUI_FINISHPAGE_RUN "$INSTDIR\${PRODUCT_NAME}.exe" ;定义安装完成后运行的程序路径
!insertmacro MUI_UNPAGE_WELCOME ;卸载的欢迎界面,可以定义左侧图片
!insertmacro MUI_UNPAGE_CONFIRM ;卸载确认界面,显示安装路径,也就是unist.exe所在路径,执行了WriteUninstaller才会生成unist.exe,要在section中执行
!insertmacro MUI_UNPAGE_INSTFILES ;卸载页面,主要跑进度条,删除文件注册表
!insertmacro MUI_UNPAGE_FINISH ;卸载完成页面
!insertmacro MUI_LANGUAGE "English" ;添加语言,可以只添加简体中文,必须添加一个,不然欢迎页面左侧不显示设定的图片
!insertmacro MUI_LANGUAGE "SimpChinese"
Function .onInit
;判断程序是否正在运行,需要FindProcDLL.dll https://nsis.sourceforge.io/FindProcDLL_plug-in
;放在nsis安装目录的plug-in里面,里面有ansi、unicode目录,根据编码放到指定目录
FindProcDLL::FindProc "${PRODUCT_NAME}.exe"
Pop $R0
IntCmp $R0 1 0 no_run
MessageBox MB_ICONSTOP "安装程序检测到$(^Name)正在运行,请退出程序后重试"
Quit
no_run:
FunctionEnd
Function un.onInit
;弹个提示,询问用户是否要卸载
MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "你确实要完全移除$(^Name),其及所有的组件?" IDYES +2
Abort
;判断程序是否正在运行
FindProcDLL::FindProc "${PRODUCT_NAME}.exe"
Pop $R0
IntCmp $R0 1 0 no_run
MessageBox MB_ICONSTOP "安装程序检测到$(^Name)正在运行,请退出程序后重试"
Quit
no_run:
FunctionEnd
Section "supercoaching"
;设置输出目录,可以多次设定
SetOutPath $INSTDIR
File ".\mmyprogram\Debug\*.exe"
File ".\mmyprogram\Debug\*.dll"
File ".\mmyprogram\Debug\*.ini"
File /r ".\mmyprogram\Debug\res"
;生成卸载程序,执行un.部分的section
WriteUninstaller "$INSTDIR\unist.exe"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}.lnk" "$INSTDIR\${PRODUCT_NAME}.exe"
;Application只是一个名称,须跟MUI_PAGE_STARTMENU后参数一致,选择了创建快捷方式就会执行下面内容否则不执行
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\${PRODUCT_NAME}.exe"
;CopyFiles "$DESKTOP\${PRODUCT_NAME}.lnk" "$SMPROGRAMS\"
!insertmacro MUI_STARTMENU_WRITE_END
SectionEnd
;卸载将会执行的部分
Section "un.supercoaching"
RMDir /r $INSTDIR
Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
Delete "$SMPROGRAMS\${PRODUCT_NAME}.lnk"
SectionEnd
nsis打包出来的安装包可以运行在32位系统和64位系统,所以该安装包程序是32位程序,32位程序访问注册表和目录会有wow64的重定向
nsis读写64位注册表
SetRegView 64
执行该命令后就可以读写64位注册表
Function .onInit
SetRegView 64
ReadRegStr $INSTDIR HKLM Software\NSIS ""
SetRegView 32
FunctionEnd
nsis访问64位目录,wow64重定向的目录一般是程序目录和动态库目录,安装包程序一般情况下不应该随意访问。
nsis的include目录有一个x64.nsh,里面实现了wow64重定向的开启和关闭
!include x64.nsh
${DisableX64FSRedirection}
File "myfiles\64\file.dll" ; Install 64-bit file on 64-bit Windows
${EnableX64FSRedirection}
nsis插件: