Inno设置:ExtractTemporaryFile导致向导冻结

时间:2017-01-09 14:16:52

标签: inno-setup extract freeze temporary-files

我根据用户的选择制作了自定义页面以管理特定的redist工具。

这些工具链接到用户检查的复选框,如果他想要或不安装这些工具。 然后只在那里出现一个页面,向用户显示每个工具的安装进度。

我在这里遇到的问题是,仅当工具设置的第一个ExtractTemporaryFile完成时,才显示进度页面,显示最后一页就好像已经冻结。

在ExtractTemporaryFile发生之前,我必须让进度页面显示的唯一方法是在任何安装函数之前放置一个MsgBox。 但即使在这种情况下,当ExtractTemporaryFile启动时,进度条动画也会被冻结,直到ExtractTemporaryFile完成...

以下是执行此操作的代码部分:

procedure CurPageChanged(CurPageID: Integer);
begin
  If CurPageID=PageInstallationPersonnalisee.ID then
    begin
      ProgressBarLabelPageInstPerso.Caption := 'Initialisation...';
      if InstallTool1 = True then
        begin
          ProgressBarLabelPageInstPerso.Caption := 'Installing InstallTool1...';
          F_InstallTool1();
        end;
      if InstallTool2 = True then
        begin
          ProgressBarLabelPageInstPerso.Caption := 'Installing InstallTool2...';
          F_InstallTool2();
        end;
      if InstallTool3 = True then
        begin
          ProgressBarLabelPageInstPerso.Caption := 'Installing InstallTool3...';
          F_InstallTool3();
        end;

      ProgressBarPageInstPerso.Style := npbstMarquee;
      //ProgressBarPageInstPerso.Style := npbstNormal;
      ProgressBarPageInstPerso.Position := 100;

      CancelWithoutPrompt:=True;
      WizardForm.Close;
    end;
end;

请注意 ExtractTemporaryFile()在每个F_InstallTooln()函数中生成。

设置和文件部分的其他部分可能会有所帮助:

[Setup]
SolidCompression=no

[Files]
;Temporary redists
Source: "{#MyRessourcesPath}InstallTool1_Setup.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall noencryption dontcopy
Source: "{#MyRessourcesPath}InstallTool2_Setup.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall noencryption dontcopy
Source: "{#MyRessourcesPath}InstallTool3_Setup.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall noencryption dontcopy

此处,在第一次完成ExtractTemporaryFile之前,页面PageInstallationPersonnalisee不会显示...

我知道 ExtractTemporaryFile 会导致安装过程出现延迟,但为什么会导致向导冻结?

所以我的问题是:在我的场景中,有没有办法强制向导刷新,以便在启动任何 ExtractTemporaryFile 程序之前显示它?

2 个答案:

答案 0 :(得分:1)

我知道这是一个旧线程,但是我面临着类似的情况,其中使用ExtractTemporaryFile函数提取的某些文件比其他文件要慢得多。

经过一番调查,我在Inno Setup help pages上发现了这一点:

  

启用固体压缩后,请确保在[文件]部分顶部(或附近)列出您的临时文件。为了在固态压缩安装中提取任意文件,安装程序必须首先解压缩所有先前的文件(到内存中的临时缓冲区)。如果[文件]部分中的指定文件上方列出了许多其他文件,则可能导致大量延迟。

这意味着为了获得最佳性能,应使用该功能将要提取的文件移动到[Files]部分的顶部

>

答案 1 :(得分:0)

ExtractTemporaryFile确实挂起了向导表单。正如大多数代码所做的那样。

允许强制Windows消息队列被抽取的唯一自定义页面是TOutputProgressWizardPage(由CreateOutputProgressPage创建)。

您可以这样做:

function NextButtonClick(CurPageID: Integer): Boolean;
var
  ProgressPage: TOutputProgressWizardPage;
begin
  if CurPageID = wpReady then
  begin
    ProgressPage := CreateOutputProgressPage('Preparing installations', '');
    ProgressPage.Show;
    try
      ProgressPage.Msg1Label.Caption := 'Installing 1 ...';
      ProgressPage.SetProgress(0, 100);
      ExtractTemporaryFile('1.exe');
      Exec(...);

      ProgressPage.Msg1Label.Caption := 'Installing 2 ...';
      ProgressPage.SetProgress(33, 100);
      ExtractTemporaryFile('2.exe');
      Exec(...);

      ProgressPage.Msg1Label.Caption := 'Installing 3 ...';
      ProgressPage.SetProgress(66, 100);
      ExtractTemporaryFile('3.exe');
      Exec(...);

      ProgressPage.SetProgress(100, 100);
      ProgressPage.Hide;
    finally
    end;
  end;
  Result := True;
end;

虽然在现代版本的Windows上有动画进度条,但如果你不能经常调用SetProgress,它仍然无法正常工作。请注意,SetProgress调用是在后台处理消息队列的内容。因此,即使其参数不变,也可以调用它。但你不能像ExtractTemporaryFile一样阻止。

或者,您可以将部署保留到[Files]部分,并从AfterInstall event执行安装程序。

[Files]
;Temporary redists
Source: "{#MyRessourcesPath}InstallTool1_Setup.exe"; DestDir: "{tmp}"; \
  Flags: deleteafterinstall noencryption dontcopy; AfterInstall: Install1
Source: "{#MyRessourcesPath}InstallTool2_Setup.exe"; DestDir: "{tmp}"; \
  Flags: deleteafterinstall noencryption dontcopy; AfterInstall: Install2
Source: "{#MyRessourcesPath}InstallTool3_Setup.exe"; DestDir: "{tmp}"; \
  Flags: deleteafterinstall noencryption dontcopy; AfterInstall: Install3