在Inno Setup的“卸载”窗体中,是否有CurInstallProgressChanged
的事件/函数用于CurProgress
和MaxProgress
值的进度条?
答案 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?