创建一个安装程序,如果已经安装了旧版本,该安装程序将执行更新



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

有四种情况:

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

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

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

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

是否可以这样做与InnoSetup?

如果您的AppID在应用程序的生命周期中保持相同,则Inno Setup已经自动处理情况1,2和4。
您还可以使用以下[Setup]指令隐藏目录和组页面:

DisableDirPage=auto
DisableGroupPage=auto

有关详细信息,请参阅这篇ISXKB文章。

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

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

#define MyAppVersion "1.2.2.7570"
#define MyAppName "MyApp Update"
[Setup]
AppId=MyApp
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={reg:HKLMSOFTWAREMicrosoftWindowsCurrentVersionUninstallMyApp_is1,InstallLocation}
DisableDirPage=True
[CustomMessages]
MyAppOld=The Setup detected application version 
MyAppRequired=The installation of {#MyAppName} requires MyApp to be installed.%nInstall MyApp before installing this update.%n%n
MyAppTerminated=The setup of update will be terminated.
[Code]
var
InstallLocation: String;
function GetInstallString(): String;
var
InstPath: String;
InstallString: String;
begin
InstPath := ExpandConstant('SoftwareMicrosoftWindowsCurrentVersionUninstallMyApp_is1');
InstallString := '';
if not RegQueryStringValue(HKLM, InstPath, 'InstallLocation', InstallString) then
RegQueryStringValue(HKCU, InstPath, 'InstallLocation', InstallString);
Result := InstallString;
InstallLocation := InstallString;
end;
function InitializeSetup: Boolean;
var
V: Integer;
sUnInstallString: String;
Version: String;
begin
    if RegValueExists(HKEY_LOCAL_MACHINE,'SoftwareMicrosoftWindowsCurrentVersionUninstallMyApp_is1', 'UninstallString') then begin
      RegQueryStringValue(HKEY_LOCAL_MACHINE,'SoftwareMicrosoftWindowsCurrentVersionUninstallMyApp_is1', 'DisplayVersion', Version);
      if Version =< ExpandConstant('{#MyAppVersion}') then begin 
          Result := True;
          GetInstallString();
       end
       else begin
MsgBox(ExpandConstant('{cm:MyAppOld}'+Version+'.'+#13#10#13#10+'{cm:MyAppRequired}'+'{cm:MyAppTerminated}'), mbInformation, MB_OK);
         Result := False;
  end;
end
else begin
  MsgBox(ExpandConstant('{cm:MyAppRequired}'+'{cm:MyAppTerminated}'), mbInformation, MB_OK);
  Result := False;
end;
end;

相关内容

  • 没有找到相关文章

最新更新