Inno setup Inno安装程序从.NET Framework 4.5(或更高版本)安装程序获取更新进度条位置的进度

Inno setup Inno安装程序从.NET Framework 4.5(或更高版本)安装程序获取更新进度条位置的进度,inno-setup,ipc,memory-mapped-files,pascalscript,Inno Setup,Ipc,Memory Mapped Files,Pascalscript,我目前正在安装.NET Framework 4.6.2,作为preparetoall事件函数中的先决条件,以便获得退出代码,设置NeedsReboot状态,或者在安装失败时中止。我的代码如下,一切正常 var PrepareToInstallLabel:TNewStaticText; 准备安装进度条:TNewProgressBar; intDotNetResultCode:整数; CancelWithoutPrompt,中止安装:布尔值; 函数InitializeSetup():Boolean;

我目前正在安装.NET Framework 4.6.2,作为
preparetoall
事件函数中的先决条件,以便获得退出代码,设置
NeedsReboot
状态,或者在安装失败时中止。我的代码如下,一切正常

var
PrepareToInstallLabel:TNewStaticText;
准备安装进度条:TNewProgressBar;
intDotNetResultCode:整数;
CancelWithoutPrompt,中止安装:布尔值;
函数InitializeSetup():Boolean;
开始
结果:=真;
覆盖b:=假;
CancelWithoutPrompt:=False;
中止调用:=False;
结束;
函数PrepareToInstall(var NeedsRestart:Boolean):字符串;
变量
intResultCode:整数;
strInstallType:字符串;
开始
如果未安装ISDOTNET45和ISWindows7SP1或以上,则
开始
HIDEPREPARETION控件;
PrepareToInstallLabel.Caption:=“正在安装Microsoft.NET Framework 4.6.2…”;
showPrepareToInstallGui控件;
提取临时文件('NDP462-KB3151800-x86-x64-AllOS-chs.exe');
如果WizardSilent=True,则
开始
strInstallType:='/q';
结束
其他的
开始
strInstallType:='/被动';
结束;
Exec(ExpandConstant({tmp}\NDP462-KB3151800-x86-x64-AllOS-ENU.exe'),strInstallType+/norestart','',SW_SHOW,
EWWaitUnterminated,intDotNetResultCode);
如果(intDotNetResultCode=0)或(intDotNetResultCode=1641)或(intDotNetResultCode=3010),则
开始
日志('Microsoft.NET Framework 4.6.2安装成功。'+#13#10+'退出代码:'+IntToStr(intDotNetResultCode));
CancelWithoutPrompt:=False;
中止调用:=False;
结束
其他的
开始
如果WizardSilent=True,则
开始
日志('Microsoft.NET Framework 4.6.2安装失败。'+#13#10+'退出代码:'+IntToStr(intDotNetResultCode)+#13#10+'安装程序中止');
结束
其他的
开始
MsgBox('Microsoft.NET Framework 4.6.2安装失败。'+#13#10+#13#10+
'退出代码:'+IntToStr(intDotNetResultCode)+#13#10+#13#10+
'安装程序已中止。单击“下一步”或“取消”退出,或单击“上一步”重试。',
mbCriticalError,MB_OK);
结束;
PrepareToInstallProgressBar.Visible:=False;
PrepareToInstallLabel.Caption:=“Microsoft.NET Framework 4.6.2安装失败”。++13#10++13#10++”退出代码:“+IntToStr(intDotNetResultCode)+13#10++”安装程序中止。单击“下一步”或“取消”退出,或单击“上一步”重试。“;
CancelWithoutPrompt:=真;
中止调用:=True;
中止
结束;
结束;
结束;
过程初始化Wizard();
开始
//定义准备安装页面的标签
PrepareToInstallLabel:=TNewStaticText.Create(WizardForm);
用PrepareToInstallLabel做什么
开始
可见:=假;
父项:=WizardForm.PreparingPage;
左:=WizardForm.StatusLabel.Left;
Top:=WizardForm.StatusLabel.Top;
结束;
//为“准备安装”页面定义进度条
PrepareToInstallProgressBar:=TNewProgressBar.Create(WizardForm);
用PrepareToInstallProgressBar做
开始
可见:=假;
父项:=WizardForm.PreparingPage;
左:=WizardForm.ProgressGauge.Left;
Top:=WizardForm.ProgressGauge.Top;
宽度:=WizardForm.ProgressGauge.Width;
高度:=WizardForm.ProgressGauge.Height;
PrepareToInstallProgressBar.Style:=npbstMarquee;
结束;
结束;
过程CurStepChanged(CurStep:TSetupStep);
开始
如果CurStep=ssInstall,则
开始
如果AbortInstall=True,则
开始
中止
结束;
结束;
结束;

目前,我正在使用
/q
/passive
将安装类型设置为静默或无人参与,以控制.NET Framework安装程序显示的可见GUI的数量,具体取决于Inno安装程序的运行方式,并使用字幕样式的进度条指示正在发生的事情。但是,从Microsoft文档来看,似乎可以使用
/pipe
开关让.NET Framework安装程序报告其安装进度,这可能允许它以交互方式更新实际进度上的常规样式进度条。这意味着.NET Framework安装程序可以完全隐藏,Inno安装程序用于指示相对进度,这是一个更整洁的解决方案。不幸的是,我不知道C++,而只是一个新手程序员。因此,是否有人可以确认Inno安装程序是否可以执行此操作,如果可以,如何尝试执行此操作?

以下显示了
中代码的Pascal脚本实现

[文件]
资料来源:“NDP462-KB3151800-x86-x64-AllOS-ENU.exe”;标志:dontcopy
[守则]
//更改为唯一名称
常数
SectionName='MyProgSetup';
EventName='MyProgSetupEvent';
常数
无限=65535;
等待对象0=0;
等待超时=$00000102;
文件映射写入=0002美元;
E_待定=8000000美元;
S_OK=0;
MMIO_V45=1;
最大路径=260;
见_MASK_NOCLOSEPROCESS=$00000040;
无效的\u句柄\u值=-1;
页面_READWRITE=4;
MMIO_尺寸=65536;
类型
TMmioDataStructure=记录
下载完成:布尔;//下载完成了吗?
InstallFinished:Boolean;//安装完成了吗?
下载中止:布尔;//将下载程序设置为中止
InstallAbort:布尔值;//将安装程序设置为中止
下载FinishedResult:Cardinal;//用于下载的结果HRESULT
InstallFinishedResult:Cardinal;//用于安装的结果HRESULT
内部错误:基数;
CurrentItemStep:WideChar的数组[0..MAX_PATH-1];
下载日期:字节;//下载进度0-255(完成0-100%)
InstallSoFar:Byte;//安装进度0-255(完成0到100%)