我有一个安装程序,它在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卸载注册表项中有DisplayVersion
、VersionMajor
和VersionMinor
。
对于任何感兴趣的人,我为Inno Setup编写了一个Windows DLL,如果需要,它提供了一种简单的方法:
https://github.com/Bill-Stewart/UninsIS
DLL需要Inno Setup 6或更新版本,因为1(它仅为Unicode,2(它需要指定64位与32位以及管理与非管理安装模式的参数。
DLL可以检测当前安装的版本,并判断安装的版本是旧的、新的还是相同的,以便您可以执行诸如仅在降级时自动卸载之类的操作(例如(。