NSIS:如果更改了程序名称,如何在安装新版本之前卸载以前的版本?

问题描述 投票:1回答:1

在我的程序名中,写入注册表,有一个版本号(例如,它看起来像这样:“我的程序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的多个版本中的插件而制作的。因此,注册表中的条目如下所示:对于“我的程序3.1 for 3dsMax 2014”的一个版本,以及另一个版本的“我的程序3.1 for 3dsMax 2018”。安装我的程序的新版本后,条目应如下所示:“我的程序3.2 for 3dsMax 2014”和“我的程序3.2 for 3dsMax 2018”。也就是说,只有我的程序的版本号应该改变,其他一切(“我的程序......”和“... for 3dsMax(3ds Max版本)”应该保持不变。谢谢理解,谢谢你提前帮助你!

installer nsis uninstaller
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.