Проблема Проблема при отмене распаковки

tihiy_don

Старожил
мужики, подскажите, может кто сталкивался. Если при распаковке нажимаю "Отмена", а потом нажимаю "Нет", то инсталлятор повисает.
По-разному правил код, всё-равно не выходит как надо, либо 11 ошибка, либо зависает.
Вот код:
Код:
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if CurPageID = wpInstalling then
begin
Confirm := False;
Cancel := False;
SuspendProc;
if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then
begin
ISDoneError := True;
ISDoneCancel := 1;
end;;
ResumeProc;
end;
end;

procedure CancelButtonOnClick(Sender: TObject);
begin
SuspendProc;
if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then
begin
ISDoneCancel:=1;
#ifdef xtool
if IsProcessRunning('xtool.exe') then
Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM xtool.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
#endif

#ifdef SrepFutureLZ
if IsProcessRunning('cls-srep_x86.exe') then
Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM cls-srep_x86.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
if IsProcessRunning('cls-srep_x64.exe') then
Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM cls-srep_x64.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
#endif

#ifdef lolz
if IsProcessRunning('cls-lolz_x64.exe') then
Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM cls-lolz_x64.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
if IsProcessRunning('cls-lolz_x86.exe') then
Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM cls-lolz_x86.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
#endif
ResumeProc;
end;

end;
 

Shegorat

Lord of Madness
Администратор
@tihiy_don, в процедуре CancelButtonOnClick(Sender: TObject)
Функция ResumeProc(); вызывается только, если юзер нажал "Да".
Нужно вынести вызов функции за пределы условия:
Код:
if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then
begin
   ****
end;
ResumeProc();
 

SBalykov

Старожил
мужики, подскажите, может кто сталкивался. Если при распаковке нажимаю "Отмена", а потом нажимаю "Нет", то инсталлятор повисает.
По-разному правил код, всё-равно не выходит как надо, либо 11 ошибка, либо зависает.
Вот код:
Код:
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if CurPageID = wpInstalling then
begin
Confirm := False;
Cancel := False;
SuspendProc;
if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then
begin
ISDoneError := True;
ISDoneCancel := 1;
end;;
ResumeProc;
end;
end;

procedure CancelButtonOnClick(Sender: TObject);
begin
SuspendProc;
if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then
begin
ISDoneCancel:=1;
#ifdef xtool
if IsProcessRunning('xtool.exe') then
Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM xtool.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
#endif

#ifdef SrepFutureLZ
if IsProcessRunning('cls-srep_x86.exe') then
Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM cls-srep_x86.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
if IsProcessRunning('cls-srep_x64.exe') then
Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM cls-srep_x64.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
#endif

#ifdef lolz
if IsProcessRunning('cls-lolz_x64.exe') then
Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM cls-lolz_x64.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
if IsProcessRunning('cls-lolz_x86.exe') then
Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM cls-lolz_x86.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
#endif
ResumeProc;
end;

end;
Попробуйте:
Код:
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm:= False;
if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then begin
if CurPageID = wpInstalling then begin
  Cancel:= False;
  ISDoneCancel:= 1;
  ISDoneError:= True;
  end else Cancel:= True;
  end else Cancel:= False;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  case CurStep of
  ssInstall: begin 
  ...

  ISDoneCancel:= 0;
  ISDoneError:= True;
if ISDoneInit(ExpandConstant('{tmp}\record.inf'), $F222, Comps1, Comps2, Comps3, MainForm.Handle, 512, @ProgressCallback) then begin
  repeat
  ...

  ISDoneError:= False;
  until True;
if ISDoneError then begin
  SuspendProc;  

#ifdef SrepFutureLZ
Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM cls-srep_x86.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM cls-srep_x64.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
#endif

#ifdef lolz
Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM cls-lolz_x64.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
Exec(ExpandConstant('{sys}\taskkill.exe'), ' /F /IM cls-lolz_x86.exe', '', SW_HIDE, ewWaitUntilTerminated, i);
#endif

  Sleep(500);
  ResumeProc;

while ISDonePB.Position <> 0 do begin
  ISDonePB.Position:= ISDonePB.Position-1;
  Sleep(6);
  end;
  ISDoneStop;
  HideControls();
  end else
  ISDoneStop;
  end;

if not ISDoneError then begin
  HideControls();
  ...
  end;
  end;
  end;
end;
 
Последнее редактирование:

tihiy_don

Старожил
@SBalykov, мне помог вариант от Shegorat, где я вынес ResumeProc(); за условие.
Сегодня вечером попробую и Ваш вариант, спасибо за ответ.
 
Сверху