使用NSIS制作安裝程序的一點心得


NSIS是一個開源的Windows平台下的安裝程序制作程序,由C/C++語言編寫。想了解更多內容請訪問百度百科

怎么獲得NSIS呢?這里有NSIS ANSI版本NSIS Unicode版本下載地址。

安裝完成后就可以編輯我們的腳本了。

我使用的是Notepad++這款文本編輯器,新建一個文件,[Ctrl]+[Alt]+S 將文件另存為擴展名為.nsi的文件,這樣在我們編輯時就可以享受Notepad++提供的代碼高亮自動完成功能了。

1. 編碼格式(亂碼)問題

根據NSIS是ANSI版本還是Unicode版本來確定腳本的編碼格式:

  • ANSI版本: 在Notepad++的菜單欄選擇[格式]->[以ANSI格式編碼]
  • Unicode版本: [格式]->[以UCS-2 Little Endian格式編碼]

如果文件中已有文本,請選擇[轉為...編碼格式],否則可能會導致編譯出的安裝程序顯示亂碼。

2. 多語言安裝界面

引用NSIS安裝目錄下Contrib\Language files\.nlf類型語言文件,並在初始化時添加語言選項,具體實現請看代碼:

; 引用語言資源文件(注意文件路徑)
LoadLanguageFile "SimpChinese.nlf"
LoadLanguageFile "English.nlf"

; 添加語言選項
Function .onInit
	Push ""
	Push ${LANG_ENGLISH}
	Push English
	Push ${LANG_SIMPCHINESE}
	Push "簡體中文"
	Push A ; A means auto count languages
	       ; for the auto count to work the first empty push (Push "") must remain
	LangDLL::LangDialog "Installer Language" "Please select the language of the installer"

	Pop $LANGUAGE
	StrCmp $LANGUAGE "cancel" 0 +2
		Abort
FunctionEnd

如果腳本中引用了MUI2.nsh頭文件,則腳本代碼如下:

; 引用"MUI2.nsh"頭文件的腳本
!include "MUI2.nsh"

; 語言設置
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "SimpChinese"

; 顯示語言選項
Function .onInit
  !insertmacro MUI_LANGDLL_DISPLAY
FunctionEnd

3. 自定義變量的使用

假如我們的腳本中有多處使用軟件名稱,並且以后可能會更改軟件名稱,有什么簡便的方法來避免復制、粘貼、替換嗎?

當然有。對於這種情況,我們可以定義一個變量,並在初始化時給變量賦值,具體實現請看代碼:

; 軟件名稱
Var SoftName

Function .onInit
	StrCpy $SoftName "XXX"
FunctionEnd

Function un.onInit
	StrCpy $SoftName "XXX"
FunctionEnd

4. 安裝完成頁面定制

在安裝完成后,我們可能需要為用戶提供可選的運行選項,如:運行XXX程序、打開Readme文件、訪問XXX網站等。下面是MUI_FINISHPAGE支持的屬性:

# 運行XXX程序
!define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_TEXT
!define MUI_FINISHPAGE_RUN_PARAMETERS
!define MUI_FINISHPAGE_RUN_NOTCHECKED   ;默認不選中
!define MUI_FINISHPAGE_RUN_FUNCTION

; 自述文件
!define MUI_FINISHPAGE_SHOWREADME
!define MUI_FINISHPAGE_SHOWREADME_TEXT
!define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
!define MUI_FINISHPAGE_SHOWREADME_FUNCTION

# 訪問XXX網站
!define MUI_FINISHPAGE_LINK
!define MUI_FINISHPAGE_LINK_LOCATION
!define MUI_FINISHPAGE_LINK_COLOR

引用MUI2.nsh頭文件的例子:

; 引用MUI2.nsh頭文件
!include "MUI2.nsh"

; 定義完成后要運行的程序
!define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_FUNCTION "runSoft"
!define MUI_FINISHPAGE_RUN_TEXT "運行 $SoftName"

Function "runSoft"
    /* 
    運行的程序,可以多個
    如果只運行一個程序,可以這么寫:
    !define MUI_FINISHPAGE_RUN "$INSTDIR\XXX.exe" 
    */
FunctionEnd

; 自述文件
!define MUI_FINISHPAGE_SHOWREADME "readme.txt"
; 默認不選中自述文件復選框
!define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED

; 訪問XXX網站
!define MUI_FINISHPAGE_LINK "XXX"
!define MUI_FINISHPAGE_LINK_LOCATION "http://www.XXX.com"
; 文字顏色為紅
!define MUI_FINISHPAGE_LINK_COLOR "FF0000"

5. 執行外部命令

  1. Exec '"命令" [可選參數]'
  2. ExecShell "動作" "命令" [參數] [SW_SHOWNORMAL | SW_SHOWMAXIMIZED | SW_SHOWMINIMIZED | SW_HIDE]
  3. ExecWait '"命令"' [用戶變量(返回代碼)]
  4. nsExec::Exec [參數]

6. 注冊DLL組件

如果我們發布的程序中有動態鏈接庫需要注冊到系統中,下面代碼是一個比較通用的例子,將安裝目錄下的所有.dll類型文件注冊到系統:

; 注冊安裝目錄下的所有DLL到系統中
FindFirst $0 $1 $INSTDIR\*.dll
loop:
	StrCmp $1 "" done
	DetailPrint $1
	RegDLL $INSTDIR\$1
	FindNext $0 $1
	Goto loop
done:
FindClose $0

7. 快捷方式

生成快捷方式

# 在桌面生成快捷方式
CreateShortCut "$DESKTOP\XXX.lnk" "$INSTDIR\XXX.exe"

# 在開始菜單生成快捷方式
CreateDirectory "$SMPROGRAMS\XXX"   ; 在開始菜單創建程序文件夾
CreateShortCut "$SMPROGRAMS\XXX\XXX.lnk" "$INSTDIR\XXX.exe"
CreateShortCut "$SMPROGRAMS\XXX\卸載XXX.lnk" "$INSTDIR\XXX.exe"

# 在快速啟動欄生成快捷方式
CreateShortCut "$QUICKLAUNCH\XXX.lnk" "$INSTDIR\XXX.exe"

刪除快捷方式

在Win7下創建快捷方式時,可能由於權限問題,快捷方式被創建到所有用戶的路徑,而不是當前用戶的路徑。XP不存在此問題。解決方法是:同時刪除當前用戶和所有用戶路徑下的快捷方式,示例代碼如下:

# 設置為當前用戶
SetShellVarContext current
Call un.DeleteShortCut  ; 刪除快捷方式函數
; 注意:如果此段代碼在'Section "Uninstall"'里,函數名前必須加un.

# 設置為所有用戶
SetShellVarContext all
Call un.DeleteShortCut

刪除快捷方式函數可以這樣寫:

# 刪除桌面快捷方式
Delete "$DESKTOP\XXX.lnk"
# 刪除快捷啟動欄快捷方式
Delete "$QUICKLAUNCH\XXX.lnk"
# 刪除開始菜單快捷方式文件夾
RMDir /r "$SMPROGRAMS\XXX"  /* /r遞歸刪除目錄 */

以上是我在使用NSIS過程遇到的一些問題,利用一些閑暇時間總結整理寫出的這篇心得,以備不時之需。

3gbywork

2015/12/28


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM