使用注册表中存储的版本号在Inno Setup中检测并卸载旧版本的应用程序



我有一个安装程序,它在Windows注册表中写入此行

[Registry]
Root: "HKCU"; Subkey: "SOFTWAREW117GAMER"; ValueType: string; ValueName: "DSVersionL4D2"; ValueData: "{#MyAppVersion}"

考虑到{#MyAppVersion}是在安装程序时定义和编写的

#define MyAppVersion "2.7"

我一直在更新安装程序,这就是为什么有些人有旧的安装,当他们更新时,冲突的旧文件会合并在一起,这样就不会卸载以前的版本,在开始安装之前,有一些方法可以读取此注册表。

  • 第一种情况:如果用户有旧版本,请卸载它并安装新版本
  • 第二种情况:如果用户的版本相同,请告诉他们
    已经安装了最新版本并取消安装
  • 第三种情况:如果用户安装了一个版本,并且要
    安装一个旧版本,请告诉他们他们已经安装了最新版本程序的版本

我读过以前的帖子,但它们只与";GUID";或";appID";的程序,尝试修改一些代码行,但我什么都没得到,如果有人能帮我的话,我提前感谢你,对不起我的英语,我用的是翻译,我来自拉丁美洲

如何检测旧的安装并提供删除?

Inno Setup:如何自动卸载以前安装的版本?

使用Inno设置中比较版本字符串的RegQueryStringValue函数和CompareVersion函数(您的问题(,您可以执行:

#define MyAppVersion "2.6"
[Code]
function InitializeSetup(): Boolean;
var
InstalledVersion: string;
VersionDiff: Integer;
begin
Result := True;
if not RegQueryStringValue(
HKCU, 'SoftwareMy Program', 'DSVersionL4D2', InstalledVersion) then
begin
Log('No installed version detected');
end
else
begin
Log(Format('Found installed version %s', [InstalledVersion]));
VersionDiff := CompareVersion(InstalledVersion, '{#MyAppVersion}');
if VersionDiff < 0 then
begin
MsgBox(
Format('You have an old version %s installed, will uninstall it.', [
InstalledVersion]),
mbInformation, MB_OK);
{ Uninstall old version here }
end
else
if VersionDiff = 0 then
begin
MsgBox(
'You have this version installed already, cancelling installation.',
mbInformation, MB_OK);
Result := False;
end
else
begin
MsgBox(
Format(
'You have newer version %s installed already, ' +
'cancelling installation.', [InstalledVersion]),
mbInformation, MB_OK);
Result := False;
end;
end;
end;

只是从你的问题中链接的一些答案中插入一个卸载代码。


不过请注意,您不需要编写自己的版本注册表值。stnadard卸载注册表项中有DisplayVersionVersionMajorVersionMinor

对于任何感兴趣的人,我为Inno Setup编写了一个Windows DLL,如果需要,它提供了一种简单的方法:

https://github.com/Bill-Stewart/UninsIS

DLL需要Inno Setup 6或更新版本,因为1(它仅为Unicode,2(它需要指定64位与32位以及管理与非管理安装模式的参数。

DLL可以检测当前安装的版本,并判断安装的版本是旧的、新的还是相同的,以便您可以执行诸如仅在降级时自动卸载之类的操作(例如(。

最新更新