利用NSIS建立自己的windows安裝程式
NSIS簡介
NSIS 是“Nullsoft 指令碼安裝系統”(Nullsoft Scriptable Installation System)的縮寫,它是一個免費的 Win32 安裝、解除安裝系統,它的特點:指令碼簡潔高效;系統開銷小;當然進行安裝、解除安裝、設定系統設定、解壓檔案等等更不在話下,幾乎可以做所有的事情。更多的功能請閱讀官方文件。
工具
- NIS Edit v2.0.3
- NSIS v3.03
思路:
指令碼嚮導+修改程式碼=個性化安裝包
步驟:
1.安裝上面兩款軟體,啟動NIS Edit,在“檔案”選單中“新建指令碼:嚮導”->下一步”,如圖1:
2.設定應用程式資訊,如軟體名稱、版本、出版人等,如圖2。如果設定了應用程式網站,則安裝包會生成一個對應網址的“Internet 快捷方式”。
3.設定程式選項,如安裝包圖示、安裝程式檔案、安裝包語言[這裡選“SimChinese”]、使用者圖形介面及壓縮方式等,選用預設值,也可以點選對應專案的按鈕或下拉選單更改設定,如下圖3
4.設定安裝目錄及授權資訊,如圖4後“下一步”:
5.選定程式檔案,即我們要打包的檔案,可以使用預設的“Mainsection”,也可以根據需要進行更改或新建組別,如果組比較多時,可以設定是否“允許使用者選擇要安裝的元件”,如圖5
6.完畢後進行“新增檔案”操作,選定我們要打包的檔案,如圖6,完成自動後返回的圖5的介面,執行下一步操作。
7.設定開始選單中資料夾名稱及快捷方式,這裡我們使用預設值,如圖7,按“下一步”:
8.指定安裝後要執行的程式,同上用預設值並設定相關執行引數及描述,不想在安裝執行任何程式,則留空即可,如圖8
9.這步是有關解除安裝程式的相關資訊,如解除安裝時的提示、解除安裝的圖示等,如圖9
10.勾選“儲存指令碼”、“轉換檔案路徑到相關路徑”及“編譯指令碼”,如圖10
問題解決方案
1.用NSIS做安裝程式,在解除安裝資訊提示部分出現亂碼
方案一
使用Notepad++編寫指令碼,編碼格式使用ANSI
方案二
編碼格式使用UTF-8(有BOM),在指令碼最前面加上Unicode true
2.使用相對路徑
Var PROJECT_PATH
Section “MainSection” SEC01
;獲取 $INSTDIR 的上一級目錄
GetFullPathName $0 ../../../
DetailPrint PROJECT_PATH
SetOutPath “$INSTDIR”
File “${PRODUCT_DIR_ROOT_NAME}\CapClient.bat”
SectionEnd
3.打包檔案移除不需要的檔案
移除掉Bin/Interpreter目錄下的Linux,Unix目錄
File /r /x “Linux” /x “Unix” “${PRODUCT_DIR_ROOT_NAME}\Bin*”
4.解除安裝程式檢查當前程式是否在執行
下載FindProcDLL
放到C:\Program Files (x86)\NSIS\Plugins(軟體的安裝目錄)裡面
Function .onInit
FindProcDLL::FindProc “xxx.exe”
Pop $R0IntCmp $R0 1 0 no_run
MessageBox MB_ICONSTOP “安裝程式檢測到 ${PRODUCT_NAME} 正在執行,請關閉之後再解除安裝!”
Quit
no_run:
FunctionEnd
5.檢測程式多次安裝,通過登錄檔的方式
Function .onInit
ClearErrors
ReadRegStr $UNINSTALL_PROG ${PRODUCT_UNINST_ROOT_KEY} ${PRODUCT_UNINST_KEY} “UninstallString”
IfErrors doneReadRegStr $OLD_VER ${PRODUCT_UNINST_ROOT_KEY} ${PRODUCT_UNINST_KEY} “DisplayVersion”
MessageBox MB_ICONSTOP “檢測到本機已經安裝了 ${PRODUCT_NAME},請解除安裝後再安裝”
Quit
done:
FunctionEnd
6.解決win7解除安裝程式快捷方式解除安裝不徹底
建立快捷方式時
RequestExecutionLevel user
Section -AdditionalIconsSetShellVarContext all
CreateShortCut “$SMPROGRAMS\Capsheaf\Website.lnk” “$INSTDIR\${PRODUCT_NAME}.url”
CreateShortCut “$SMPROGRAMS\Capsheaf\Uninstall.lnk” “$INSTDIR\uninst.exe”SectionEnd
刪除快捷方式時
RequestExecutionLevel admin
Section UninstallSetShellVarContext all
Delete “$SMPROGRAMS\Capsheaf\Uninstall.lnk”
Delete “$SMPROGRAMS\Capsheaf\Capsheaf.lnk”SectionEnd