Inno setup 创建一个安装程序,该安装程序将在已安装旧版本时执行更新

Inno setup 创建一个安装程序,该安装程序将在已安装旧版本时执行更新,inno-setup,updates,Inno Setup,Updates,我正在尝试为我的软件(这是一个C#软件)配置Inno设置。 我计划发布许多版本的软件,如果计算机上已经安装了较旧版本的应用程序,我想更改Inno安装程序界面。 在这种情况下,用户不能更改安装目录 有四种情况: 第一种情况:这是我的产品的第一次安装,Inno安装应该正常进行 第二种情况:产品已安装,安装程序包含较新版本。用户无法选择目标文件夹。他可以直接运行更新 第三种情况:如果安装程序包含比已安装版本旧的版本,则将禁用更新,并显示一条消息 第四种情况:安装程序版本与安装的版本相同。如果需要,用户

我正在尝试为我的软件(这是一个C#软件)配置Inno设置。 我计划发布许多版本的软件,如果计算机上已经安装了较旧版本的应用程序,我想更改Inno安装程序界面。 在这种情况下,用户不能更改安装目录

有四种情况:

第一种情况:这是我的产品的第一次安装,Inno安装应该正常进行

第二种情况:产品已安装,安装程序包含较新版本。用户无法选择目标文件夹。他可以直接运行更新

第三种情况:如果安装程序包含比已安装版本旧的版本,则将禁用更新,并显示一条消息

第四种情况:安装程序版本与安装的版本相同。如果需要,用户可以修复其实际版本


使用InnoSetup可以做到这一点吗?

如果在应用程序的生命周期内您的
AppID保持不变,InnoSetup已经自动处理案例1、2和4。
您还可以使用以下
[Setup]
指令隐藏目录和组页面:

DisableDirPage=auto
DisableGroupPage=auto
有关更多详细信息,请参见此


对于案例3,假设您的文件版本正确,Inno不会降级任何内容,但实际上不会警告用户。要做到这一点,您需要添加代码来检查这一点,很可能是在
InitializeSetup()
事件函数中。

如果您想为用户提供一些反馈,您可以尝试类似的方法。 首先,您的更新应该与主应用程序具有相同的
AppId
名称。 然后您可以设置一些检查,这些检查将显示消息以通知用户状态

#定义MyAppVersion“1.2.2.7570”
#定义MyAppName“MyApp更新”
[设置]
AppId=MyApp
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MyApp\u is1,InstallLocation}
DisableDirPage=True
[定制信息]
MyAppOld=安装程序检测到的应用程序版本
MyAppRequested=安装{#MyAppName}需要安装MyApp。%n请在安装此更新之前安装MyApp。%n%n
MyAppTerminated=更新设置将被终止。
[守则]
变量
安装位置:字符串;
函数GetInstallString():String;
变量
InstPath:字符串;
InstallString:字符串;
开始
InstPath:=ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp_is1');
InstallString:='';
如果不是RegQueryStringValue(HKLM、InstPath、“InstallLocation”、InstallString),则
RegQueryStringValue(HKCU、InstPath、'InstallLocation',InstallString);
结果:=InstallString;
InstallLocation:=InstallString;
结束;
函数初始化设置:布尔;
变量
V:整数;
sunstallstring:String;
版本:字符串;
开始
如果RegValueExists(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp_is1','UninstallString'),则开始
RegQueryStringValue(HKEY_LOCAL_计算机,'Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp_is1','DisplayVersion',Version);
如果Version=
1。检查是否安装了应用程序;2.检查应用程序版本;3.比较应用程序版本和更新版本;3a。如果更新更新,则安装;3b。如果更新较旧,则不安装;3c。如果应用程序不存在,则不安装否已自动记住安装目录,从而使您的
DefaultDirName
代码冗余。您也不需要为第一次安装指定默认值。它们不需要分开,Inno会自动完成这一切。如果它们需要包含较少的文件,则只需保留相同的AppID和
[Setup]
指令。此外,您可以使用
WizardForm.PrevAppDir
检索以前的
{app}
文件夹,顺便说一句,这是一种很好的方法,可以判断该应用是否以前安装过。但是,尽管如此,我不确定从
InitializeSetup
执行此操作是否有效;这可能太早了。实际上,如果使用脚本向导创建脚本,则应用程序文件的默认设置是添加
ignoreversion
标志,在这种情况下,降级实际上会降级所有文件。添加一条警告消息来确认用户确实想要这样做,这可能仍然是一个好主意,但是如果你的应用程序本身能够应对降级(例如数据兼容性问题),那么它应该可以正常工作。如果没有,那么您应该添加一个错误而不是警告。@Miral我没有注意到这一点。谢谢你的提醒。签入
InitializeSetup
的示例逻辑将非常好…我假设inno中已经有一些关于这个的定义…@assimilter没有内置的方法,但是你可以在安装时将版本写入注册表,然后重新读取并比较。我手头没有任何代码。如果让我们求助于这样的黑客,我想真的没什么好说的了。我一个人就能得到那么多