Inno setup 由Inno Setup制作的安装程序安装多个软件副本

Inno setup 由Inno Setup制作的安装程序安装多个软件副本,inno-setup,Inno Setup,我们使用Inno安装程序准备安装程序。因此,用户安装软件。新版本发布后,新安装程序将更新软件。到目前为止还不错 但有些人既想要旧版本的软件,也想要新版本的软件 是否可以让安装程序询问用户是否要同时更新当前安装或安装新版本。在中,检测应用程序是否已安装。如果是,请询问用户,如果他/她选择安装新副本,请更改和更改特定于版本的值以强制新安装 [Setup] #define AppId "My Program" #define SetupReg "Software\Microsoft\Windows\C

我们使用Inno安装程序准备安装程序。因此,用户安装软件。新版本发布后,新安装程序将更新软件。到目前为止还不错

但有些人既想要旧版本的软件,也想要新版本的软件

是否可以让安装程序询问用户是否要同时更新当前安装或安装新版本。

在中,检测应用程序是否已安装。如果是,请询问用户,如果他/她选择安装新副本,请更改和更改特定于版本的值以强制新安装

[Setup]
#define AppId "My Program"
#define SetupReg "Software\Microsoft\Windows\CurrentVersion\Uninstall\" + AppId + "_is1"
#define DisplayVersionReg "DisplayVersion"
#define ApplicationVersion() \
   ParseVersion('MyProg.exe', Local[0], Local[1], Local[2], Local[3]), \
   Str(Local[0]) + "." + Str(Local[1])

[Setup]
AppId={code:GetAppId}
AppName=My Program
AppVersion={#ApplicationVersion}
DefaultDirName={code:GetDefaultDirName}
UsePreviousLanguage=no

[Files]
Source: "MyProg.exe"; DestDir: "{app}"
[代码]
变量
AppId:字符串;
DefaultDirName:字符串;
函数GetAppId(参数:string):string;
开始
结果:=AppId;
日志('AppId='+结果);
结束;
函数GetDefaultDirName(参数:string):string;
开始
结果:=DefaultDirName;
日志('DefaultDirName='+结果);
结束;
函数InitializeSetup():Boolean;
变量
前置版本:字符串;
曲线版本:字符串;
消息:字符串;
R:整数;
开始
曲线版本:='{#应用程序版本}';
日志(格式('安装“%s”,曲线版本]);
结果:=真;
AppId:='{#AppId}';
DefaultDirName:=ExpandConstant(“{pf}\My Program”);
如果RegQueryStringValue(HKLM,{SetupReg}',{{DisplayVersionReg}',PrevVersion)或
RegQueryStringValue(HKCU,{SetupReg}',{{DisplayVersionReg}',PrevVersion)然后
开始
信息:=
格式(
“已安装%s版本。是否要升级到%s?”#13#10#13#10+
'按Yes,将%0:s替换为%1:s。#13#10+
'按“否”,保留%0:s并添加单独安装的%1:s。#13#10[
上一版本,曲线版本];
R:=MsgBox(消息,MB确认,MB是否取消);
如果R=y,那么
开始
日志(“用户选择替换以前的安装”);
结束
其他的
如果R=IDNO,则
开始
AppId:=AppId+曲线版本;
DefaultDirName:=DefaultDirName+''+曲线版本;
日志('用户选择安装新副本-使用ID'+AppId');
结束
其他的
开始
日志(“用户选择取消安装”);
结果:=假;
结束;
结束;
结束;

但事情并没有那么简单。应用程序本身也必须使用单独的注册表项和用户应用程序数据文件夹。