NSIS:如果程序名称已更改,如何在安装新版本之前先卸载旧版本?

时间:2018-09-08 16:32:58

标签: installer nsis uninstaller

在写入注册表的我的程序名称中,有一个版本号(例如,看起来像这样:“我的程序3.1”)。当安装较新的版本3.2或3.3(等等)时,我需要卸载旧的安装,但是我不知道如何使安装程序通过版本号在注册表中找到以前的安装。是的,我了解了此链接的示例:http://nsis.sourceforge.net/Auto-uninstall_old_before_installing_new,但是在此示例中,注册表搜索是由程序名称执行的。就我而言,程序的名称会更改,因为版本号已更改,并且安装程序无法再在注册表中找到该条目以在安装新版本之前卸载旧版本。请告诉我,我该怎么做。

这是我的示例代码:

;Define main variables:
!define PRODUCT_NAME "My programm"
!define PRODUCT_VERSION "3.9"
!define PRODUCT_FULLNAME "${PRODUCT_NAME} ${PRODUCT_VERSION}"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_FULLNAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define PRODUCT_UNINSTALL_EXE "uninstall.exe"

;Registry is added by this:
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" '"$INSTDIR\${PRODUCT_UNINSTALL_EXE}" _?=$INSTDIR'

;Read the registry key value for uninstall previous installation:
ReadRegStr $R0 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString"
StrCmp $R0 "" done

但是此命令在注册表中找不到条目,​​因为程序$ {PRODUCT_FULLNAME}的名称已经具有不同的版本号。 请告诉我如何使注册表中的条目仅查找程序“我的程序”的名称,而不考虑版本号吗?

重要的补充!

在上面的消息中,我忘了澄清一件事:我的安装程序是为安装在3ds Max的多个版本中的插件制作的。结果,注册表中的条目如下所示:对于一个版本的“我的3dsMax 2014的程序3.1”,对于另一个版本的“我的3dsMax 2018的程序3.1”。在安装了新版本的程序之后,条目应如下所示:“我的3dsMax 2014程序3.2”和“我的3dsMax 2018程序3.2”。也就是说,仅应更改程序的版本号,其他所有内容(“ My program ...”和“ ... for 3dsMax(3ds Max的版本)”应保持不变。 感谢您的理解,也感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

使用EnumRegKey枚举卸载密钥:

Section
StrLen $3 "${PRODUCT_NAME}"
StrCpy $0 0
loop:
EnumRegKey $1 ${PRODUCT_UNINST_ROOT_KEY} "Software\Microsoft\Windows\CurrentVersion\Uninstall" $0
    StrCmp $1 "" done
    IntOp $0 $0 + 1
    StrCpy $2 $1 $3 ; Get ${PRODUCT_NAME} prefix
    StrCmp $2 "${PRODUCT_NAME}" 0 loop
    ReadRegStr $2 ${PRODUCT_UNINST_ROOT_KEY} "Software\Microsoft\Windows\CurrentVersion\Uninstall\$1" UninstallString
    StrCmp $2 "" loop
    ExecWait $2 ; (This assumes you stored the old versions with the _?= parameter)
    Goto loop
done:
SectionEnd