NSIS運行的一些檢查項目

說明

安裝軟件或者升級軟件的時候要做一下常規的檢查,一般包括以下幾項:

  1. 軟件是否已經安裝
  2. 軟件版本是否正確(升級)
  3. 軟件是否正在運行
  4. 安裝/升級程序是否正常運行

Script

配置

!define PRODUCT_NAME "Test"
!define PRODUCT_VERSION "2.4.1"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define PRODUCT_UNINST_ROOT_PATH "SOFTWARE\WOW6432Node\My Project\Test"
!define PRODUCT_UNINST_HOME_PATH "SOFTWARE\WOW6432Node\My Project\Test\2.3.1\Home"
!define PRODUCT_INSTALL "TEST_INSTALL"

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

LangString VERSION_IS_WRONG ${LANG_SIMPCHINESE} "當前軟件版本不是2.4版本,不支持此次升級!"
LangString VERSION_IS_WRONG ${LANG_ENGLISH} "The current software version is not version 2.4 and this upgrade is not supported!"
LangString VERSION_IS_LESS ${LANG_SIMPCHINESE} "當前軟件版本爲"
LangString VERSION_IS_LESS ${LANG_ENGLISH} "The current software version is "
LangString NEED_UPGRADE ${LANG_SIMPCHINESE} " , 即將升級至${PRODUCT_VERSION}版本。"
LangString NEED_UPGRADE ${LANG_ENGLISH} ", Upgrading to ${PRODUCT_VERSION}."
LangString SOFTWARE_NOT_EXIST ${LANG_SIMPCHINESE} "軟件沒有安裝,請先安裝軟件。"
LangString SOFTWARE_NOT_EXIST ${LANG_ENGLISH} "The software is not installed, please install the software first."
LangString SOFTWARE_RUN ${LANG_SIMPCHINESE} "軟件正在運行,請先關閉軟件。"
LangString SOFTWARE_RUN ${LANG_ENGLISH} "The software is running, please close the software first."
LangString UPGRADE_RUN ${LANG_SIMPCHINESE} "升級程序已經在運行。"
LangString UPGRADE_RUN ${LANG_ENGLISH} "The upgrade program is already running."

軟件是否安裝

可以通過軟件在註冊表中的安裝路徑或者其他信息來判斷軟件是否安裝,這裏使用的是版本號

Function verify_install
  ReadRegStr $R2 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_ROOT_PATH}" "CurrentVersion"
  ;也可以使用安裝路徑來判斷
  ;ReadRegStr $R2 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_HOME_PATH}" "7500_HOME_PATH"
  StrLen $0 $R2
  ${if} $0 < 1
    MessageBox MB_ICONSTOP $(SOFTWARE_NOT_EXIST) IDOK
    Abort
  ${endif}
FunctionEnd

軟件版本判斷

Function verify_version
  ; Verify the version
  ReadRegStr $R2 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_ROOT_PATH}" "CurrentVersion"
  !insertmacro VersionCompare
  ;我的這個腳本是升級的,要求必須是2.4
  ;${VersionCompare} "$R2" "${PRODUCT_VERSION}" $1 與當前準備安裝的版本比較
  ${VersionCompare} "$R2" "2.4" $1
  ;比較結果爲0/1/2,0表示相等,1表示大於,2表示小於
  StrCmp $1 "1" 0 +3
    MessageBox MB_ICONSTOP $(VERSION_IS_WRONG) IDOK
    Abort

  StrCmp $1 "2" 0 +3
    MessageBox MB_ICONSTOP $(VERSION_IS_WRONG) IDOK
    Abort
FunctionEnd

軟件運行判斷

需要添加腳本FindProcDLL.dll到\NSIS\Plugins\x86-ansi中

Function verify_running
  FindProcDLL::FindProc "Test.exe"
  pop $R0
  StrCmp $R0 0 +3
  MessageBox MB_ICONSTOP $(SOFTWARE_RUN) IDOK
  Abort
FunctionEnd

安裝/升級程序運行判斷

Function verify_upgarde
  System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${PRODUCT_INSTALL}") i .r1 ?e'
  Pop $R0
  StrCmp $R0 0 +3
    MessageBox MB_ICONSTOP $(UPGRADE_RUN) IDOK
    Abort
FunctionEnd

如果全部檢查通過,就可以進行下一步了,我增加了一個提示:

Function .onInit
  call verify_install
  call verify_version
  call verify_running
  call verify_upgarde
  MessageBox MB_OK "$(VERSION_IS_LESS) $R2 $(NEED_UPGRADE)" IDOK
FunctionEnd

安裝完成以後,還需要做一寫修改註冊表的操作:

Function .onInstSuccess
; Change the version to 2.4.1
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_ROOT_PATH}" "CurrentVersion" "${PRODUCT_VERSION}"
  MessageBox MB_OK "$(UPGRADE_END)" IDOK
FunctionEnd
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章