Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/installation/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Installation Inno安装程序提取临时文件导致向导冻结_Installation_Inno Setup_Freeze_Pascalscript - Fatal编程技术网

Installation Inno安装程序提取临时文件导致向导冻结

Installation Inno安装程序提取临时文件导致向导冻结,installation,inno-setup,freeze,pascalscript,Installation,Inno Setup,Freeze,Pascalscript,我制作了自定义页面,以根据用户选择管理特定的redist工具安装 如果用户想要或不想安装这些工具,这些工具将链接到用户选中的复选框。 然后出现一个页面,只向用户显示每个工具的安装进度 我在这里遇到的问题是,仅当工具设置的第一个ExtractTemporaryFile完成时,才会显示进度页,显示最后一页时,就好像它已冻结一样 在执行ExtractTemporaryFile之前,我必须让进度页显示的唯一方法是在任何安装函数之前放置MsgBox。 但即使在这种情况下,当启动ExtractTempora

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

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

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

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

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

过程CurPageChanged(CurPageID:Integer);
开始
如果CurPageID=PageInstallationPersonnalise.ID,则
开始
ProgressBarLabelPageInstPerso.标题:=“初始化…”;
如果InstallTool1=True,则
开始
ProgressBarLabelPageInstPerso.Caption:=“安装InstallTool1…”;
F_InstallTool1();
结束;
如果InstallTool2=True,则
开始
ProgressBarLabelPageInstPerso.Caption:=“安装InstallTool2…”;
F_InstallTool2();
结束;
如果InstallTool3=True,则
开始
ProgressBarLabelPageInstPerso.Caption:=“安装InstallTool3…”;
F_InstallTool3();
结束;
ProgressBarPageInstPerso.Style:=npbstMarquee;
//ProgressBarPageInstPerso.Style:=npbstNormal;
ProgressBarPageInstPerso.位置:=100;
CancelWithoutPrompt:=真;
向导窗体。关闭;
结束;
结束;
请注意,
ExtractTemporaryFile()
是在每个
F_InstallTooln()
函数中生成的

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

[设置]
固体压缩=否
[档案]
;临时再贴现
来源:“{myresourcespath}InstallTool1_Setup.exe”;DestDir:“{tmp}”\
标志:deleteafterinstall noencryption dontcopy
来源:“{myresourcespath}InstallTool2_Setup.exe”;DestDir:“{tmp}”\
标志:deleteafterinstall noencryption dontcopy
来源:“{myresourcespath}InstallTool3_Setup.exe”;DestDir:“{tmp}”\
标志:deleteafterinstall noencryption dontcopy
在这里,直到第一次
提取临时文件
完成后,才会显示页面
PageInstallationPersonnalisee

我知道
ExtractTemporaryFile
可能会导致安装过程中出现一些延迟,但为什么会导致向导冻结


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

ExtractTemporaryFile
确实挂起了向导窗体。就像大多数代码一样

唯一允许强制使用Windows消息队列的自定义页面是
TOutputProgressWizardPage
(由创建)

您可以这样做:

函数NextButtonClick(CurPageID:Integer):布尔;
变量
ProgressPage:TOutputProgressWizardPage;
开始
如果CurPageID=wpReady,则
开始
ProgressPage:=CreateOutputProgressPage('准备安装','');
ProgressPage.Show;
尝试
ProgressPage.Msg1Label.Caption:=“安装1…”;
ProgressPage.SetProgress(01100);
提取临时文件('1.exe');
执行官(…);
ProgressPage.Msg1Label.Caption:=“安装2…”;
进度页面。设置进度(33100);
提取临时文件('2.exe');
执行官(…);
ProgressPage.Msg1Label.Caption:=“安装3…”;
进度页面。设置进度(66100);
提取临时文件('3.exe');
执行官(…);
进度页面。设置进度(100100);
进行页面隐藏;
最后
结束;
结束;
结果:=真;
结束;
虽然它在现代版本的Windows上也不能很好地工作,但是如果您不能经常调用
SetProgress
,它也不能很好地工作。请注意,
SetProgress
调用在幕后推动消息队列。因此,即使它的参数不变,调用它也是有意义的。但是您不能,因为
ExtractTemporaryFile
会阻塞


或者,您可以将部署留在
[Files]
部分,让安装程序从中执行


我知道这是一个旧线程,但我遇到了一个类似的情况:我使用
ExtractTemporaryFile
函数提取的一些文件明显比其他文件慢

经过调查后,我发现:

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

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

[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