在 Inno Setup 中提取存档时显示自定义状态消息

Unc*_*Bob 4 inno-setup pascalscript

我的应用程序有一个安装文件,它还包含 .exe 文件和 .zip 文件。

我想要的是:

最近我在从zip中提取文件的部分添加了一段代码[Code],但实际上,它是在安装完成后发生的,并且进度条为100%,所以我想要的是使该代码的(解压缩)过程与进度条并向用户显示当前正在提取的内容。

例如:假设提取文件将占用进度条的 50%,其余部分将占用解压缩时的代码部分,以及当前正在提取的内容的状态。

这是代码:

[Code]
 
procedure InitializeWizard;
begin
  ForceDirectories(ExpandConstant('{localappdata}\folder-A\app\folder-B'))
end;
 
const
  SHCONTCH_NOPROGRESSBOX = 4;
  SHCONTCH_RESPONDYESTOALL = 16;
 
procedure unzip(ZipFile, TargetFldr: variant);
var
  shellobj: variant;
  SrcFldr, DestFldr: variant;
  shellfldritems: variant;
begin
  if FileExists(ZipFile) then begin
    if not DirExists(TargetFldr) then 
      if not ForceDirectories(TargetFldr) then begin
        MsgBox('Can not create folder '+TargetFldr+' !!', mbError, MB_OK);
        Exit;
      end;    
 
  shellobj := CreateOleObject('Shell.Application');
  SrcFldr := shellobj.NameSpace(ZipFile);
  DestFldr := shellobj.NameSpace(TargetFldr);
  shellfldritems := SrcFldr.Items;
  DestFldr.CopyHere(
    shellfldritems, SHCONTCH_NOPROGRESSBOX or SHCONTCH_RESPONDYESTOALL);
end;
 
procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then 
  begin
    unzip(ExpandConstant('{app}\example.zip'),ExpandConstant('{app}\'));
  end;
end;
Run Code Online (Sandbox Code Playgroud)

Mar*_*ryl 5

最简单的解决方案是使用WizardForm.StatusLabel

WizardForm.StatusLabel.Caption := 'Extracting...';
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


对于更奇特的解决方案,您可以使用TOutputProgressWizardPage. 有关甚至显示进度条的示例(尽管通过使用 DLL 进行提取),请参阅:
Inno Setup - 如何向解压页面添加取消按钮?

这篇文章列出了更多相关示例:
Inno Setup:如何修改长时间运行的脚本,使其不会冻结 GUI?