1. 程式人生 > 實用技巧 >NSIS 安裝指令碼常用功能整理

NSIS 安裝指令碼常用功能整理

僅允許一個安裝例項執行

!define PRODUCT_NAME "你的產品名稱"
; ……

# 檢查是否已啟動安裝程式,同時只能執行一個安裝程式
Function CheckMutexInstance
    System::Call 'kernel32::CreateMutexA(i0, i0, t"${PRODUCT_NAME}.exe")?e'
    Pop $R0
    StrCmp $R0 0 +3
    MessageBox MB_OK|MB_ICONEXCLAMATION "安裝程式已經在執行。"
    Abort
FunctionEnd

Function .onInit
    # ……
    Call CheckMutexInstance
    # ……
FunctionEnd

在初始化的函式裡呼叫了CheckMutexInstance函式,該函式會呼叫系統api建立例項,可根據此返回值判斷控制僅允許執行一個例項。

限制同一臺機器僅能安裝一個產品,不允許安裝多個

通過在安裝的時候寫入登錄檔,然後在安裝的初始化函式中讀取該登錄檔項,如果讀取到該項,則說明已經安裝過,給出提示即可。

!define PRODUCT_NAME "你的產品名稱"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\${PRODUCT_NAME}.exe"

# 登錄檔操作
Section 
-Post ; …… WriteRegDword HKLM "${PRODUCT_DIR_REGKEY}" "Installed" 1 ; …… SectionEnd #檢查是否已經安裝了該程式,只能安裝一個 Function CheckOnlyOneInstalled ReadRegDWORD $0 HKLM '${PRODUCT_DIR_REGKEY}' "Installed" IntCmp $0 +1 +4 MessageBox MB_OK|MB_USERICON '$(^Name) 已安裝在計算機中。如需重新安裝,請先解除安裝已有的安裝。'
Quit nop FunctionEnd Function .onInit ; …… Call CheckOnlyOneInstalled ; …… FunctionEnd

解除安裝前彈出確認解除安裝對話方塊,確認後再解除安裝

nsis提供了解除安裝的初始化函式,直接在這個函式中給出提示,當用戶點選取消是退出即可。

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