Inno setup:ExtractTemporaryFile导致向导冻结

问题描述:

根据用户的选择,我已经制作了自定义页面来管理特定的redist工具安装。Inno setup:ExtractTemporaryFile导致向导冻结

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

我在这里的问题是,只有当工具设置的第一个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 

在这里,没有显示在网页PageInstallationPersonnalisee直到第一ExtractTemporaryFile后...

我知道,ExtractTemporaryFile可能会导致一些延迟安装过程,但为什么它应该导致向导冻结?

所以我的问题是:在我的情况下,有没有办法强制向导刷新,以便他在任何ExtractTemporaryFile程序启动之前出现?

+0

对于提取到临时文件夹的文件,最好使用'nocompression'标志。也建议将它们放在'[Files]'部分的最开始处。它也取决于你的文件的大小。 – RobeN

+0

你好。如果情况下我添加了无压缩参数,并且文件已经在文件部分的开头。 但我仍然冻结,直到ExtractTemporaryFile程序完成.... – BenDev

+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; 

虽然它不具有动画花哨的进度条,如果你不能调用SetProgress频繁Windows现代版本中的工作真的太好。请注意,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 
+0

非常感谢,它与CreateOutputProgressPage()非常相称。 由于ProgressPage.Show真的显示了ExtractTemporaryFile之前的页面。 我仍然想知道为什么在ExtractTemporaryFile过程之前,即使在启动ExtractTemporaryFile之前初始化它,为什么CreateCustomPage不会显示... 您的替代解决方案无法为我工作,因为它是关于在主安装之后管理这些工具的安装,是安装程序方案的一个侧面部分,它不会执行整个主安装,只要安装了该工具就会强制一个WizardForm.Close。 – BenDev

+0

替代解决方案:使用['Check'参数](http://www.jrsoftware.org/ishelp/index.php?topic=scriptcheck)仍然可行。 –

+0

检查参数不匹配'在这种情况下原因这些工具被安装为独立文件之前的主要安装和主要安装是自愿不执行,然后......但我的问题只是关于进度页面不显示,现在解决了;) – BenDev