Обнаружение и удаление старой версии приложения в Inno Setup, используя номер версии, хранящийся в реестре - PullRequest
1 голос
/ 23 марта 2020

У меня есть установщик, который записывает эту строку в Windows реестр

[Registry]
Root: "HKCU"; Subkey: "SOFTWARE\W117GAMER"; ValueType: string; ValueName: "DSVersionL4D2"; ValueData: "{#MyAppVersion}"

, учитывая, что {#MyAppVersion} определяется и записывается при установке программы

#define MyAppVersion "2.7"

Я постоянно обновляю установщик, поэтому у некоторых людей старые установки, и когда они обновляют, старые конфликтующие файлы объединяются, чтобы не удалять предыдущую версию, есть какой-то способ прочитать этот реестр перед началом установки .

  • Первый случай: если у пользователя старая версия, удалите ее и установите новую версию
  • Второй случай: если у пользователя такая же версия, скажите ему, что они * У 1013 * уже установлена ​​последняя версия и отмените установку
  • Третий случай: если у пользователя установлена ​​версия, и он собирается
    установить старую версию, скажите ему, что у него уже установлена ​​самая новая версия program

Я прочитал предыдущие посты, но они работают только с "GUID" или "appID" программы, попробуйте изменить у меня есть несколько строк кода, но я ничего не могу получить, если кто-то может мне помочь, заранее благодарю, извините за мой Engli sh Я использую переводчик Я из Латинской Америки

Как обнаружить старую установку и удалить предложение?

Inno Setup: Как автоматически удалить предыдущую установленную версию?

1 Ответ

1 голос
/ 24 марта 2020

С использованием RegQueryStringValue функции и CompareVersion функции из Сравнить строки версий в Inno Setup (ваш вопрос) вы можете сделать:

#define MyAppVersion "2.6"

[Code]

function InitializeSetup(): Boolean;
var
  InstalledVersion: string;
  VersionDiff: Integer;
begin
  Result := True;
  if not RegQueryStringValue(
           HKCU, 'Software\Martin Prikryl\WinSCP 2',
           '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.

...