Создание установщика, который будет выполнять обновление, если старая версия уже установлена - программирование
Подтвердить что ты не робот

Создание установщика, который будет выполнять обновление, если старая версия уже установлена

Я пытаюсь настроить Inno для своего программного обеспечения (это программное обеспечение С#). Я планирую выпустить много версий своего программного обеспечения, я хотел бы изменить интерфейс установщика Inno Setup, если на компьютере уже установлена более старая версия моего приложения. В этом случае пользователь не сможет изменить каталог установки.

Есть четыре случая:

Первый случай: это первая установка моего продукта, установка Inno должна продолжаться в обычном режиме.

Второй случай: продукт уже установлен И установщик содержит более новую версию. Пользователь не может выбрать папку назначения. Он может просто запустить обновление.

Третий случай: если установщик содержит более старую версию, чем установленная, обновление будет отключено, и должно появиться сообщение.

Четвертый случай: версия установщика совпадает с установленной версией. Пользователь может восстановить свою актуальную версию, если это необходимо.

Возможно ли это сделать с помощью InnoSetup?

4b9b3361

Ответ 1

Если вы хотите получить обратную связь для пользователя, вы можете попробовать что-то подобное. Прежде всего, ваше обновление должно иметь то же имя AppId, что и ваше главное приложение. Затем вы можете установить некоторые проверки, которые будут отображать сообщения для информирования пользователя о состоянии.

#define MyAppVersion "1.2.2.7570"
#define MyAppName "MyApp Update"

[Setup]
AppId=MyApp
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MyApp_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('Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp_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,'Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp_is1', 'UninstallString') then begin
      RegQueryStringValue(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp_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;

Ответ 2

Inno Setup уже обрабатывает случаи 1, 2 и 4 автоматически, если ваш AppID поддерживается одинаково для жизни приложения.
Вы также можете скрыть страницы каталога и группы, используя следующие директивы [Setup]:

DisableDirPage=auto
DisableGroupPage=auto

Подробнее см. статью ISXKB.

В случае 3, предполагая, что ваши файлы имеют правильную версию, Inno ничего не понизит, но на самом деле он не предупредит пользователя. Для этого вам нужно будет добавить код, чтобы проверить это, скорее всего, в функции события InitializeSetup().