一 NSIS工具的使用
- 启动NIS Edit。
- 在“文件”菜单中“新建脚本:向导”=>下一步”。
- 设置应用程序信息,如软件名称、版本、出版人等,当然最一个网站可以留空,如果设置了,则安装包会生成一个对应网址的“Internet 快捷方式”。
- 设置程序选项,如安装包图标、安装程序文件、安装包语言[这里选“SimpChinese”]、用户图形界面及压缩方式等,可以选用默认值,也可以点击对应项目的按钮或下拉菜单更改设置。
- 设置安装目录及授权信息,然后后“下一步”,其中授权文件可不填写,如果你需要对你打包的软件提供用户使用文档,可自行创建文件然后将文件目录填入。
- 选定程序文件,即我们要打包的文件,可以使用默认的“Mainsection”,也可以根据需要进行更改或新建组别,如果组比较多时,你也可以设置是否“允许用户选择要安装的组件”。
- 完毕后进行“添加文件”操作,选定我们要打包的文件,点击确定,然后执行下一步操作。
- 设置开始菜单中文件夹名称及快捷方式,一般使用默认值, 然后“下一步”。
- 指定安装后要运行的程序,同上用默认值并设置相关运行参数及描述,或不想在安装运行任何程序,则留空即可。
- .这步是有关卸载程序的相关信息,如卸载时的提示、卸载的图标等。
- 点击下一步后,跳到完成向导界面,勾选“保存脚本”和“转换文件路径到相关路径”。
- 点击完成后,自定义保存路径和保存文件名。
13.找到保存的文件,双击打开。
14.打开以后,点击编译运行,生成可执行文件。
二 后台运行操作
在如图位置加入如下代码设置对XXX.exe后台运行操作
Function .onInstSuccess
ExecShell "open" "$INSTDIR\ICCKey.exe"
ExecShell "open" "$INSTDIR\PkiApiService.exe"
FunctionEnd
三 卸载结束后台进程操作
首先执行结束后台进程需要确保NSIS安装目录下的Plugins目录下存在下图两个库。
然后在卸载函数里添加下图代码。
;删除进程
FindProcDLL::FindProc "ICCKey.exe"
Push "icckey.exe"
KillProcDLL::KillProc
FindProcDLL::FindProc "PkiApiService.exe"
Push "PkiApiService.exe"
KillProcDLL::KillProc
第二种卸载程序或者安装程序时杀死进程的方法(可以一次性杀死多个进程)
NSIS使用exec调用windows指令去杀死进程,好处在于可以杀死多个进程,十分方便。
nsExec::Exec "taskkill /im ICCKey.exe /f"
安装时杀死进程:
卸载时杀死进程:
在卸载的时候,加上RMDir /r “$INSTDIR”,可以卸载整个安装目录。
RMDir /r "$INSTDIR"
关于exec在NSIS中的使用
ExecWait 调用BAT
BAT不带参数时:
SetOutPath '$INSTDIR' ExecWait '$INSTDIR/A.bat'
BAT需要参数时,要把带参数的命令写入另外一个新的BAT中,执行新BAT(B.bat)
新BAT(B.bat):
CALL A.bat install
NSIS 脚本:
SetOutPath '$INSTDIR' ExecWait '$INSTDIR/B.bat'
ExecShell
等同 Windows API ShellExecute
C 代码:
ShellExecute(NULL, "open", "file.txt", "/x", "D:\docs", SW_SHOW);
NSIS 脚本:
SetOutPath D:\docs
ExecShell open file.txt /x SW_SHOW
ExecCmd
ExecCmd::exec [/NOUNLOAD /ASYNC] [/TEST] [/TIMEOUT=xxx] application_to_run stdin_string
执行控制台应用程序。
异步
不等待进程退出。如果您想获得退出代码,请使用“等待”呼叫。(/NOUNLOAD是强制性的!)
四 开机自启动操作
对于制作好的安装包,有些时候可能需要在安装完成界面上添加一个可勾选的开机自启动的选项,下面是具体的细节。
1.在安装完成界面设置添加如下代码,务必要添加在 " !insertmacro MUIPAGEFINISH "之前。
!define MUI_FINISHPAGE_SHOWREADME
!define MUI_FINISHPAGE_SHOWREADME_Function AutoBoot
!define MUI_FINISHPAGE_SHOWREADME_TEXT "开机自动启动"
!insertmacro MUI_PAGE_FINISH
2.在Section后区段的后面添加Function部分(在Section之后,是为了避免产生未知的错误)把上面的PKI5.0替换成你要打包程序名就行了,主要是把信息写入系统注册表,代码如下:
Function AutoBoot
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "ICCKey"'"$INSTDIR\ICCKey.exe"'
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "PkiApiService"'"$INSTDIR\PkiApiService.exe"'
FunctionEnd
3.前两步已经可以实现开机自启动了。这最后一步,需要在卸载和初始化区段里面把注册表信息删除。原因是让用户在卸载程序和覆盖安装程序后,不会受到刚开始安装程序的写入系统注册表的影响。 在Function .onInit里面添加如下代码:
;删除开机自启
Function un.onInit
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Run\ICCKey"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Run\PkiApiService"
!insertmacro MUI_UNGETLANGUAGE
MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "你确实要完全移除 $(^Name) ,其及所有的组件?" IDYES +2
Abort
FunctionEnd
在Section Uninstall里面添加如下代码:
;删除开机自启
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Run\ICCKey"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Run\PkiApiService"
五 带注册码
使用时需要借助一个PassDialog.dll这个插件去做注册码生成输入框。
然后编写如图代码。
;安装密码
!define Password "123"
;密码输入页面
Page Custom PasswordPageShow PasswordPageLeave
Function PasswordPageShow
!insertmacro MUI_HEADER_TEXT "输入密码" "安装程序需要一个正确的安装密码才能继续。"
PassDialog::InitDialog /NOUNLOAD Password /HEADINGTEXT "请输入密码。" /GROUPTEXT "密码输入框"
Pop $R0 # Page HWND
SendMessage $R1 ${EM_SETPASSWORDCHAR} 178 0
PassDialog::Show
FunctionEnd
;验证密码
Function PasswordPageLeave
;从堆栈取出密码
Pop $R0
;密码错误
StrCmp $R0 '${Password}' +3
MessageBox MB_OK|MB_ICONEXCLAMATION "密码输入错误!请输入正确的安装密码!"
Abort
;密码正确
MessageBox MB_OK|MB_ICONEXCLAMATION "密码正确!"
;Abort
FunctionEnd
六 安装许可证协议
NSIS代码部分:
; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!define MUI_LICENSEPAGE_CHECKBOX
!insertmacro MUI_PAGE_LICENSE "..\安装条款.txt"
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!define MUI_FINISHPAGE_RUN "$INSTDIR\ICCKey.exe"
!insertmacro MUI_PAGE_FINISH
; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES
七 个性化设置
1.修改logo以及内侧图(左边图片)
!define MUI_ABORTWARNING
!define MUI_ICON "..\vv_setupicon.ico"
!define MUI_UNICON "..\vv_setupicon.ico"
!define MUI_WELCOMEFINISHPAGE_BITMAP "..\setbg.bmp"
此处需要注意的是:内侧图一定要是windows标准格式BMP图片,可以用windows自带的画图软件将其他格式的图片转成BMP格式,内图大小为164×314,可以根据这个比例放大。
2.安装包标题及介绍
//标题
!define MUI_WELCOMEPAGE_TITLE "\r\n LOL安装示例向导"
//文字介绍
!define MUI_WELCOMEPAGE_TEXT "这个向导将指引你完成LOL的安装进程。\r\n\r\n在开始安装之前,建议先关闭其他相关所有应用程序,这将允许“安装程序“更新指定的系统文件。\r\n\r\n为保证程序的正常安装和运行,若您的电脑遇到弹窗提醒,请允许程序所有操作。\r\n\r\n$_CLICK"