Как правильно закрыть мастер установки Inno без запроса?

Часть моего установщика проверяет наличие последней версии на нашем сервере и при необходимости загружает ее автоматически сразу после страницы приветствия. Фактическая проверка и загрузка находятся в функции CheckForNewInstaller, которая возвращает True, если новый установщик был загружен и выполнен, и False, если необходимо продолжить. Если новый установщик был загружен (True), то мастер должен завершить работу.

Используя следующий код, я сделал это, используя WizardForm.Close. Тем не менее, он по-прежнему предлагает пользователю, если он уверен, что хочет отменить. В обычных сценариях я по-прежнему хочу, чтобы пользователь получал это приглашение при попытке закрыть программу установки. Однако мне нужно подавить это диалоговое окно, когда мне нужно принудительно закрыть мастер. Я также не могу завершить процесс, потому что процесс очистки не произойдет должным образом.

function NextButtonClick(CurPageID: Integer): Boolean;
var
  ResultCode: Integer;
  X: Integer;
begin
  Log('NextButtonClick(' + IntToStr(CurPageID) + ') called');
  Result := True;
  case CurPageID of
    wpWelcome: begin
      if CheckForNewInstaller then begin
        //Need to close this installer as new one is starting
        WizardForm.Close;
      end;
    end;
    ....
  end;
end;

Как я могу полностью закрыть этот установщик без дальнейшего взаимодействия с пользователем?


person Jerry Dodge    schedule 12.02.2014    source источник


Ответы (1)


Это можно сделать, обработав событие CancelButtonClick и установив параметр Confirm...

var
  ForceClose: Boolean;

procedure Exterminate;
begin
  ForceClose:= True;
  WizardForm.Close;  
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm:= not ForceClose;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
var
  ResultCode: Integer;
  X: Integer;
begin
  Log('NextButtonClick(' + IntToStr(CurPageID) + ') called');
  Result := True;
  case CurPageID of
    wpWelcome: begin
      if CheckForNewInstaller then begin
        Exterminate;
      end;
    end;
    ....
  end;
end;
person Jerry Dodge    schedule 12.02.2014
comment
Что ж, тогда вы используете неправильное событие. Если вы хотите предотвратить запуск установщика, вы должны использовать метод события InitializeSetup. Во всех случаях этот ответ является неправильным. - person TLama; 13.02.2014
comment
@TLama Это не самое первое, я хочу, чтобы это произошло после страницы приветствия. Я никогда не хотел препятствовать запуску мастера, иначе я бы поместил его в InitializeSetup. - person Jerry Dodge; 13.02.2014
comment
@TLama На самом деле, поскольку я опубликовал этот вопрос / ответ, я изменил логику, и теперь в мастере есть даже страница с вопросом, хотят ли они проверить наличие новой версии. - person Jerry Dodge; 13.02.2014
comment
Вы сказали на самом первом шаге, то есть до запуска мастера. И я согласен с идеей даже не начинать установку, если есть более новая версия. Но я вижу, у вас есть свой путь, который вы хотите предложить своим пользователям. Удачи ;-) - person TLama; 13.02.2014
comment
@TLama Да, это утверждение было очень расплывчатым :-) - person Jerry Dodge; 13.02.2014