說明
安裝軟件或者升級軟件的時候要做一下常規的檢查,一般包括以下幾項:
- 軟件是否已經安裝
- 軟件版本是否正確(升級)
- 軟件是否正在運行
- 安裝/升級程序是否正常運行
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