Удалить при запуске Inno setup с уже установленным приложением

Я только начал использовать Inno setup, и, похоже, он работает хорошо. Однако, когда я запускаю установщик с уже установленным приложением, он переустанавливается. Я хотел бы дать пользователю возможность удалить. Возможно ли это, и если да, то как это можно сделать?

чтобы быть точным, я написал игру для домашнего задания. Я сделал установщик с помощью Inno setup. Приложение устанавливается нормально и может быть удалено с помощью панели управления, но мой профессор хотел бы иметь возможность удалить применение путем повторного запуска установщика и выбора опции удаления. Это сэкономит ему время, так как у него есть около 50 из этих заданий, чтобы отметить.

спасибо,

Джерри

3 ответов


следующий скрипт сделает следующие параметры формы, когда приложение уже установлено в целевой системе при запуске установки:

enter image description here

когда пользователь нажимает Repair кнопка, настройка обычно запускается. Когда пользователь нажимает Uninstall кнопка, ранее установленное приложение удаляется. Когда пользователь закрывает эту форму, ничего не происходит.

вот скрипт (не забудьте указать, в идеале какое-то уникальное значение для AppId директива установки в ваш скрипт):

[Setup]
AppName=My Program
AppVersion=1.5
AppId=1C9FAC66-219F-445B-8863-20DEAF8BB5CC
DefaultDirName={pf}\My Program
OutputDir=userdocs:Inno Setup Examples Output

[CustomMessages]
OptionsFormCaption=Setup options...
RepairButtonCaption=Repair
UninstallButtonCaption=Uninstall

[Code]
const
  mrRepair = 100;
  mrUninstall = 101;

function ShowOptionsForm: TModalResult;
var
  OptionsForm: TSetupForm;
  RepairButton: TNewButton;
  UninstallButton: TNewButton;
begin
  Result := mrNone;
  OptionsForm := CreateCustomForm;
  try
    OptionsForm.Width := 220;
    OptionsForm.Caption := ExpandConstant('{cm:OptionsFormCaption}');
    OptionsForm.Position := poScreenCenter;

    RepairButton := TNewButton.Create(OptionsForm);
    RepairButton.Parent := OptionsForm;
    RepairButton.Left := 8;
    RepairButton.Top := 8;
    RepairButton.Width := OptionsForm.ClientWidth - 16;
    RepairButton.Caption := ExpandConstant('{cm:RepairButtonCaption}');
    RepairButton.ModalResult := mrRepair;

    UninstallButton := TNewButton.Create(OptionsForm);
    UninstallButton.Parent := OptionsForm;
    UninstallButton.Left := 8;
    UninstallButton.Top := RepairButton.Top + RepairButton.Height + 8;
    UninstallButton.Width := OptionsForm.ClientWidth - 16;
    UninstallButton.Caption := ExpandConstant('{cm:UninstallButtonCaption}');
    UninstallButton.ModalResult := mrUninstall;

    OptionsForm.ClientHeight := RepairButton.Height + UninstallButton.Height + 24;
    Result := OptionsForm.ShowModal;
  finally
    OptionsForm.Free;
  end;
end;

function GetUninstallerPath: string;
var
  RegKey: string;
begin
  Result := '';
  RegKey := Format('%s\%s_is1', ['Software\Microsoft\Windows\CurrentVersion\Uninstall', 
    '{#emit SetupSetting("AppId")}']);
  if not RegQueryStringValue(HKEY_LOCAL_MACHINE, RegKey, 'UninstallString', Result) then
    RegQueryStringValue(HKEY_CURRENT_USER, RegKey, 'UninstallString', Result);
end;

function InitializeSetup: Boolean;
var
  UninstPath: string;
  ResultCode: Integer;  
begin
  Result := True;
  UninstPath := RemoveQuotes(GetUninstallerPath);
  if UninstPath <> '' then
  begin
    case ShowOptionsForm of
      mrRepair: Result := True;
      mrUninstall: 
      begin
        Result := False;
        if not Exec(UninstPath, '', '', SW_SHOW, ewNoWait, ResultCode) then
          MsgBox(FmtMessage(SetupMessage(msgUninstallOpenError), [UninstPath]), mbError, MB_OK);
      end;
    else
      Result := False;
    end;
  end;
end;

по какой-то причине ваш код

RegKey := Format('%s\%s_is1', ['Software\Microsoft\Windows\CurrentVersion\Uninstall', 
    '{#emit SetupSetting("AppId")}']);

вернула дополнительное { значение _is1. У меня не было времени проверить, почему и где я ошибался в своей реализации, все, что я подтверждаю, это то, что мой установщик работает с

RegKey := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppId")}_is1');

альтернативный.

надеюсь, что это помогает.

Спасибо за пример кода.


при использовании Inno Setup нет причин удалять предыдущую версию, если эта версия не была установлена другой программой установки. В противном случае обновления обрабатываются автоматически.

ваш ответ здесь :

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