首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSIS:如果更改了程序名,如何在安装新版本之前卸载以前的版本?

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

Stack Overflow用户
提问于 2018-09-08 16:32:58
回答 1查看 673关注 0票数 1

在写入注册表的程序名称中,有一个版本号(例如,它看起来如下:“我的程序3.1")。在安装新版本3.2或3.3 (以此类推)时,我需要卸载旧安装,但我不知道如何使安装程序通过版本号在注册表中找到先前的安装。是的,我学习了这个链接的示例:new,但是在本例中,注册表搜索是由程序名执行的。在我的示例中,程序名称会更改,因为版本号已经更改,安装程序在安装新版本之前无法在注册表中找到此条目来卸载旧版本。告诉我,拜托,我该怎么做。

下面是我的示例代码:

代码语言:javascript
运行
复制
;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的多个版本中。因此,注册表中的条目如下所示:其中一个版本是“MyProgram3.1 for 3dsMax 2014",另一个版本是”MyProgram3.1for3dsMax2018“。在安装了新版本的程序后,条目应该是这样的:“我的程序3.2表示3 3dsMax 2014”,“我的程序3.2表示3 3dsMax 2018”。也就是说,只有我的程序的版本号应该改变,其他的一切(“我的程序.”)“. for 3 3dsMax ( 3ds Max的版本)”应该保持不变。感谢您的理解,并提前感谢您的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-08 23:36:36

使用EnumRegKey枚举卸载键:

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52237244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档