首页 > 解决方案 > 有什么方法可以使用 NSIS 以通用方式读取注册表版本号键?

问题描述

在安装较新版本的软件时使用 NSIS,从特定的旧版本号(例如 3.01.00)我通过卸载旧版本并安装较新版本自动将其升级到较新版本,如下所示:

注意:这里我的旧版软件安装程序使用的是 WIX,而新版的安装程序使用的是 NULLSOFT

 ReadRegStr $R1 HKLM "SOFTWARE\Millinnium\3.01.00" "InstallPath"
  ReadRegStr $R2 HKLM "SOFTWARE\Millinnium\3.02.00" "InstallPath"

${If} $R1 != ""

MessageBox MB_YESNO|MB_ICONQUESTION "$(UninstallPrevVer)" IDYES noUninstOld

Abort
 noUninstOld:
 ExecWait '"MsiExec.exe" /X{8ED262EE-FC73-47A9-BB86-D92223246881} /qb!'  


${ElseIf} $R2 != ""

MessageBox MB_YESNO|MB_ICONQUESTION "$(UninstallPrevVer)" IDYES noUninstOld

Abort
 noUninstOld:
 ExecWait '"MsiExec.exe" /X{8ED262EE-FC73-47A9-BB86-D92223246881} /qb!'  

${EndIf}

但是,如果我有很多旧版本,例如 <3.01.00(即 3.0 或 3.0.0.1 或 2.0 或更小),我想显示一条通用消息,说明在安装新版本之前手动卸载现有版本。

有什么方法可以以通用方式读取注册表版本号键?

还是我需要遵循每个版本,如下所示?

 ReadRegStr $R1 HKLM "SOFTWARE\Millinnium\3.0" "InstallPath"
  ReadRegStr $R2 HKLM "SOFTWARE\Millinnium\3.0.0.1" "InstallPath"
ReadRegStr $R2 HKLM "SOFTWARE\Millinnium\2.0" "InstallPath"

标签: nsis

解决方案


用于EnumRegKey枚举键:

Section
StrCpy $0 0
loop:
  EnumRegKey $1 HKLM "SOFTWARE\Millinnium" $0
  StrCmp $1 "" done
  IntOp $0 $0 + 1
  DetailPrint "Key: $1"
  Goto loop
done:
SectionEnd

部分结束


推荐阅读