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