Обрабатывать этот код деинсталлятора, только если требуется деинсталляция?

У меня есть этот код в разделе [Code], этот код запускается только тогда, когда я запускаю деинсталлятор:

//////////////
// Uninstaller
//////////////

const
  DeleteFiles   = true;
  DeleteSubdirs = false;

// Initialize the Inno Setup Uninstaller skin style.
function InitializeUninstall: Boolean;
begin
  Result := True;
  LoadVCLStyle_UnInstall(ExpandConstant('{app}\uninstall.vsf'));
end;

// Deinitialize the Inno Setup Uninstaller skin style.
procedure DeinitializeUninstall();
begin
  UnLoadVCLStyles_UnInstall;
  UnloadDll(ExpandConstant('{app}\uninstall.dll'));
  DeleteFile(ExpandConstant('{app}\uninstall.dll'));
  DelTree(ExpandConstant('{app}\'), true, DeleteFiles, DeleteSubdirs);
end;

Проблема в том, что инструкции внутри DeinitializeUninstall процедуры DeleteFile и DelTree выполняются, даже если пользователь выбирает Да или Нет, когда программа удаления InnoSetup спрашивает пользователя, действительно ли он хочет удалить установку или не программное обеспечение, я имею в виду выбор пользователя этого изображения:

введите описание изображения здесь

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

Поэтому мне нужно обработать эти две инструкции ниже, только если пользователь действительно потребовал удаления, выбрав Да, но также эти инструкции должны выполняться в конце процесса удаления (и это процедура DeinitializeUninstall, которую я предлагаю) :

DeleteFile(ExpandConstant('{app}\uninstall.dll'));
DelTree(ExpandConstant('{app}\'), true, DeleteFiles, DeleteSubdirs);

Как я могу это сделать?


person ElektroStudios    schedule 23.11.2014    source источник
comment
@TLama Я не знаю, почему вы удалили ответ, но ваш ответ был действительно хорош и помог мне решить эту проблему. пожалуйста, если вы можете убедиться, что измененный код в моем ответе хорош, потому что я не являюсь экспертом в использовании скрипта pascal ... еще раз спасибо!   -  person ElektroStudios    schedule 23.11.2014
comment
Я удалил свой ответ, потому что не думаю, что то, что вы спросили, - это то, что вам нужно. Удаление может по-прежнему завершиться ошибкой после того, как пользователь примет диалоговое окно подтверждения. Я думаю, что usDone - это шаг, который указывает на то, что процесс удаления завершился успешно (это условие, при котором вы хотите выполнить эту очистку).   -  person TLama    schedule 23.11.2014


Ответы (1)


Решение благодаря @ TLama за подсказку CurUninstallStepChanged и благодаря этот другой ответ, где я привел пример, чтобы понять это:

//////////////
// Uninstaller
//////////////


Const
  DeleteFiles   = True;  // Determines whether to delete all the files of the {app} dir.
  DeleteSubdirs = False; // Determines whether to delete all the sub-folders of the {app} dir.

Var
  UninstallIsDemanded: Boolean; // Determines whether the user accepted or denied the uninstallation prompt.
  UninstallSuccess   : Boolean; // Determines whether the uninstallation succeeded.


// Occurs when the uninstaller current page changes.
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin

  if CurUninstallStep = usUninstall then begin
      UninstallIsDemanded:= True;
  end;

  if CurUninstallStep = usDone then begin
      UninstallSuccess:= True;
  end;  

end;


// Deletes the VCL skin dll file.
procedure DeleteSkin();
begin
  DeleteFile(ExpandConstant('{app}\uninstall.dll'));
end;


// Deletes the 'app}' file/folder contents.
procedure DeleteApplication(DeleteFiles: Boolean; DeleteSubdirs: Boolean);
begin
  DelTree(ExpandConstant('{app}\'), true, DeleteFiles, DeleteSubdirs);
end;


// Initialize the Inno Setup Uninstaller skin style.
function InitializeUninstall: Boolean;
begin
  Result := True;
  LoadVCLStyle_UnInstall(ExpandConstant('{app}\uninstall.vsf'));
end;


// Deinitialize the Inno Setup Uninstaller skin style.
procedure DeinitializeUninstall();
begin
  UnLoadVCLStyles_UnInstall;
  UnloadDll(ExpandConstant('{app}\uninstall.dll'));

  if UninstallSuccess = True then begin
    DeleteSkin();
    DeleteApplication(DeleteFiles, DeleteSubdirs);
  end;

end;
person ElektroStudios    schedule 23.11.2014