Inno Setup удалить событие изменения панели прогресса

Есть ли какое-либо событие/функция, как CurInstallProgressChangedдля progressbar С CurProgressи MaxProgressзначения в форме удаления в Inno Setup?

1 ответ

  1. Для этого нет собственной поддержки.

    То, что вы можете сделать, это настроить таймер и следить за изменениями в UninstallProgressForm.ProgressBar.Position.

    Таймер тоже хитрый. Опять же, нет родной поддержки. Можно использовать библиотеку DLL InnoTools InnoCallback . Но использование внешней библиотеки DLL из деинсталлятора тоже сложно. См. (yours) Load external DLL for uninstall process in Inno Setup.

    Код может быть похож:

    [Files]
    Source: InnoCallback.dll; DestDir: {app}
    
    [Code]
    
    type
      TTimerProc = procedure(h: LongWord; Msg: LongWord; IdEvent: LongWord; dwTime: LongWord);
    
    procedure TimerProc(h: LongWord; AMsg: LongWord; IdEvent: LongWord; dwTime: LongWord);
    begin
      Log(Format(
        'Uninstall progress: %d/%d',
        [UninstallProgressForm.ProgressBar.Position, UninstallProgressForm.ProgressBar.Max]));
    end;
    
    function WrapTimerProc(Callback: TTimerProc; ParamCount: Integer): LongWord;
      external 'wrapcallback@{%TEMP}\innocallback.dll stdcall uninstallonly delayload';
    
    function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord;
      lpTimerFunc: LongWord): LongWord;
      external 'SetTimer@user32.dll stdcall';
    
    procedure InitializeUninstallProgressForm();
    var
      TimerCallback: LongWord;
    begin
      if FileCopy(ExpandConstant('{app}\innocallback.dll'),
                  ExpandConstant('{%TEMP}\innocallback.dll'), False) then
      begin
        TimerCallback := WrapTimerProc(@TimerProc, 4);
        SetTimer(0, 0, 100, TimerCallback); { every 100 ms }
      end;
    end;
    

    Другое решение (лучше, но сложнее реализовать) см. В разделе Как сохранить файлы удаления внутри uninstaller?