欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

NSIS运行的一些检查项目

程序员文章站 2024-03-09 10:00:11
...

说明

安装软件或者升级软件的时候要做一下常规的检查,一般包括以下几项:

  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
相关标签: 工作问题记录