gpt4 book ai didi

installation - Inno Setup ExtractTemporaryFile 导致向导卡住

转载 作者:行者123 更新时间:2023-12-03 16:53:00 36 4
gpt4 key购买 nike

我制作了自定义页面来管理特定的 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
在这里,页面 PageInstallationPersonnalisee直到第一个 ExtractTemporaryFile 才显示已经完成了...
我知道 ExtractTemporaryFile可能会导致安装过程出现一些延迟,但为什么会导致向导卡住?
所以我的问题是:在我的场景中,有没有办法强制向导刷新,以便他出现在任何 ExtractTemporaryFile 之前程序启动?

最佳答案

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 call 是在幕后抽出消息队列的原因。所以即使它的参数没有改变,调用它也是有意义的。但是你不能,因为 ExtractTemporaryFile block 。

或者,您可以将部署留给 [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

关于installation - Inno Setup ExtractTemporaryFile 导致向导卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41549970/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com