Inno setup 如何在“过程中显示进度”;“准备安装”吗;?

Inno setup 如何在“过程中显示进度”;“准备安装”吗;?,inno-setup,progress,Inno Setup,Progress,我正在使用的安装程序在preparetoanstall功能中完成大部分工作,因为我需要做的每件事都可能失败,因此这是处理这些事情的适当位置,以防它们失败。通过在函数结果中传递错误消息,可以自动报告任何故障。安装程序实际上只复制了3个小文件 问题是向导在执行此功能时似乎冻结(或者不响应),只显示一个标题为“准备安装…”的空白页面,而实际上,它正在执行我的安装过程 我想用一个简单的过程ShowProgress(const S:String)向用户显示进度向用户显示它实际在做什么。我该怎么做 这就是我

我正在使用的安装程序在
preparetoanstall
功能中完成大部分工作,因为我需要做的每件事都可能失败,因此这是处理这些事情的适当位置,以防它们失败。通过在函数结果中传递错误消息,可以自动报告任何故障。安装程序实际上只复制了3个小文件

问题是向导在执行此功能时似乎冻结(或者不响应),只显示一个标题为“准备安装…”的空白页面,而实际上,它正在执行我的安装过程

我想用一个简单的过程
ShowProgress(const S:String)向用户显示进度向用户显示它实际在做什么。我该怎么做

这就是我安装的方式,我希望将每个调用包装到
Log()

函数preparetoall(var-NeedsRestart:Boolean):字符串;
变量
R:整数;
开始
结果:='';
尝试
日志('做这个…');
R:=DoThis;
案例R
0:开始
结果:='';
结束;
1:开始
结果:='执行此操作时引发错误消息1';
结束;
否则开始
结果:='执行此操作时出现意外错误:'+IntToStr(R);
结束;
结束;
如果结果=“”则开始
日志(‘做那个…’);
R:=DoThat;
案例R
0:开始
结果:='';
结束;
1:开始
结果:='执行此操作时引发错误消息1';
结束;
否则开始
结果:='执行此操作时出现意外错误:'+IntToStr(R);
结束;
结束;
结束;
如果结果=“”则开始
日志('做其他事情…');
R:=剂量霉素;
案例R
0:开始
结果:='';
结束;
1:开始
结果:=“执行其他操作时引发错误消息1”;
结束;
否则开始
结果:='执行其他操作时出现意外错误:'+IntToStr(R);
结束;
结束;
结束;
//像上面那样再过几个街区
//错误记录
如果结果为“”,则开始
日志('失败:'+结果);
结束;
除了
结果:='异常';
日志(“异常”);
结束;
结束;

preparetoall
功能中编写的代码会阻止Windows消息泵的处理,从而导致向导表单没有响应。如果需要在这个屏幕中显示许多控件,可能会显示一个进度条和要执行的步骤列表,那么可以使用DLL中的一个表单来完成。确保此DLL中有执行实际安装过程的线程,并且只更新GUI以向用户显示状态。例如,此DLL表单可以覆盖向导,甚至可以嵌入到自定义向导页面中的向导内部。我们的想法是将安装代码从
preparetoall
功能移动到该线程中,只有这样,您才能在此过程中实现完全响应的GUI。从
preparetoall
函数中,应该只有一个DLL调用来启动安装过程,这反过来显示DLL中的表单

结果可能是这样的(在工程中):


看看Inno附带的
CodeDlg.iss
示例脚本,特别是使用的代码

此页面类型允许您在执行其他操作时显示状态消息和/或进度条。当您更改进度标签/值时,它会自动发送消息,以确保用户看到正确的状态


它正是为这类代码而设计的。

我把你们所有的答案都混在了一起,我找到了这个问题的另一个可能的解决方案

我知道这不是所谓的“优雅解决方案”。 无论如何,这是一个快速的解决方案,可以避免您使用自定义控件开发一个单独的DLL来管理安装程序和DLL之间的通信

以下方法描述了如何创建一个自定义页面,该页面是在
preparetoall
Setup阶段Inno Setup显示的页面的副本。 此副本必须具有与原始副本相同的外观,加上一个进度条和一个标签,开发人员可以使用该标签指示
preparetoall
安装阶段的当前步骤

让我们看一些代码。
首先,准备自定义页面:

[代码]
变量
PreparetInstallWithProgressPage:TOutputProgressWizardPage;
现在定义
preparetoall
函数以添加自定义内容:

函数preparetoall(var-NeedsRestart:Boolean):字符串;
变量
结果代码:整数;
开始
PrepareToInstallWithProgressPage.SetProgress(0,0);
使用ProgressPage.Show准备安装;
尝试
//第一个预安装步骤:假设杀死当前要更新的应用程序
PrepareToInstallWithProgressPage.SetText('正在退出MyApp运行实例'),'';
ExecuteCmd('taskkill','/F/IM MyApp');
//将进度条设置为10%
使用进度页准备安装。设置进度(1,10);
//第二个预安装步骤
//有什么有用的吗。。。
//完成后将进度条设置为20%
准备安装进度页。设置进度(2,10);
//…执行其他预安装步骤,直到结束
使用进度页准备安装。设置进度(10,10);
最后
PrepareToInstallWithProgressPage.Hide;
结束;
结束;
在此安装阶段,我们完成了准备安装阶段的步骤,因此Inno Setup的默认
preparetoall
页面会显示一段时间

现在,用户可能无法理解页面的更改,因为我们的
preparetoallwithprogresspage
具有与原始页面相同的外观和感觉

为了让我们的页面具有相同的外观和感觉,我们可以使用
SetupMessage
函数获得第二个