Inno安装程序卸载进度条更改事件

时间:2016-05-04 11:59:49

标签: inno-setup

在Inno Setup的“卸载”窗体中,是否有CurInstallProgressChanged的事件/函数用于CurProgressMaxProgress值的进度条?

1 个答案:

答案 0 :(得分:0)

没有原生支持。

您可以做的是设置计时器并观察UninstallProgressForm.ProgressBar.Position

中的更改

计时器也很棘手。同样,没有原生支持。您可以使用InnoTools InnoCallback DLL library。但是使用卸载程序中的外部DLL库也很棘手。见(你的)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;

对于另一种解决方案(更好但实施起来更复杂),请参阅How keep uninstall files inside uninstaller?