Inno setup 在Inno安装程序的尼斯任务对话框窗口中显示下载文件的错误哈希信息

Inno setup 在Inno安装程序的尼斯任务对话框窗口中显示下载文件的错误哈希信息,inno-setup,pascalscript,inno-setup-v6,Inno Setup,Pascalscript,Inno Setup V6,我最初是在另一个平台()上问这个问题的 在Inno设置中,它具有以下消息定义: ErrorFileHash2=Invalid file hash: expected %1, found %2 当安装程序尝试下载并运行具有错误哈希值的文件时,将显示此消息 在我的脚本中,我有: 函数NextButtonClick(CurPageID:integer):布尔; 开始 结果:=真; 如果(CurPageID=wpSelectTasks),则 开始 下载页面。清除; 如果选择了(WizardIsTask

我最初是在另一个平台()上问这个问题的

在Inno设置中,它具有以下消息定义:

ErrorFileHash2=Invalid file hash: expected %1, found %2
当安装程序尝试下载并运行具有错误哈希值的文件时,将显示此消息

在我的脚本中,我有:

函数NextButtonClick(CurPageID:integer):布尔;
开始
结果:=真;
如果(CurPageID=wpSelectTasks),则
开始
下载页面。清除;
如果选择了(WizardIsTaskSelected('downloadhelp'),则
AddFileForDownload(“{#HelpDocSetupURL}”,“HelpDocSetup.exe”,
“{#getsha256ofile(..\HelpNDoc\CHM\Output\MSAHelpDocumentationSetup.exe”)}”;
结束
其他的
如果(CurPageID=wpReady),则
开始
下载页面。显示;
尝试
尝试
下载页面。下载;
结果:=真;
除了
可抑制emsgbox(
AddPeriod(GetExceptionMessage),mbCriticalError,MB_OK,IDOK);
结果:=假;
结束;
最后
下载页面。隐藏;
结束;
结束;
结束;
出现问题时显示的错误消息相当难看。有人向我提出以下建议:

它仅在您不处理异常时显示一个消息框。使用try/except,然后可以使用添加的文件名或使用任务对话框重新引发异常

我想我应该试试MessageBox designer:

这将创建以下代码:

//显示消息框
SuppressibleTaskDialogMsgBox(
'无法下载[文件]','这是因为校验和值不匹配',
mbError,MB_OK,['OK'],0,IDOK);
但我不知道我在这里做什么

  • 如何处理显示此错误的异常
  • 如何显示更好的任务对话框?一旦这也包括了详细信息和文件名

只需更换您当前的:

SuppressibleMsgBox(
AddPeriod(GetExceptionMessage),mbCriticalError,MB_OK,IDOK);
使用新代码:

SuppressibleTaskDialogMsgBox(
'无法下载[文件]','这是因为校验和值不匹配',
mbError,MB_OK,['OK'],0,IDOK);


如果要识别下载失败,可以使用
DownloadPage.Msg2Label.Caption
的值(如果移动消息框,可以看到该值)

如果需要在消息中包含哈希,则必须解析错误消息中的数据。这有点脆弱。但是如果您提供了一个回退消息,以防解析失败,它是可行的

以下函数尝试从任何标准Inno设置字符串中解析数据:

函数ParseDataFromSetupMessage(
Msg:string;ID:TSetupMessageID;var数据:TArrayOfString):布尔值;
变量
MsgOrig,Pattern,PatternOrig,S:string;
一、 P,P2:整数;
开始
尝试
MsgOrig:=Msg;
模式:=设置消息(ID);
PatternOrig:=图案;
而(消息“”)和(模式“”)则
开始
P:=Pos(“%”,模式);
如果(P=0)或(P=长度(模式))或(P>1),则
开始
如果(P=0)或(P=Length(Pattern)),则P:=Length(Pattern)+1;
如果复制(Msg,1,P-1)复制(模式,1,P-1),则中止;
删除(Msg,1,P-1);
删除(模式1,P-1);
结束
其他的
如果(模式[2]<'1')或(模式[2]>'9'),则
开始
如果复制(Msg,1,1)“%”,则中止;
删除(模式1,1);
删除(Msg,1,1);
结束
其他的
开始
I:=stroint(模式[2]);
删除(模式1、2);
如果长度(图案)=0,则
开始
S:=味精;
设置长度(Msg,0);
结束
其他的
开始
P:=Pos(“%”,模式);
如果P=0,则P:=长度(图案)+1;
P2:=位置(复制(模式1,P-1),消息);
如果P2=0,则中止;
S:=拷贝(Msg,1,P2-1);
删除(Msg,1,P2-1);
结束;
如果GetArrayLength(数据)
您可以在
块中同时使用这两个选项,但
块除外,如下所示:

除了
Msg:=GetExceptionMessage;
如果ParseDataFromSetupMessage(Msg,msgErrorFileHash2,数据),则
开始
应为:=数据[0];
散列:=数据[1];
味精:=
“这是因为校验和值不匹配。”+#13+
“下载:”+DownloadPage.Msg2Label.Caption+#13+
“预期:”+预期+#13+
“Got:”+Hash;
结束
其他的
开始
//因为其他原因而失败?
味精:=
“下载失败。”+#13+
“下载:”+DownloadPage.Msg2Label.Caption+#13+
'详情:'+Msg;
结束;
SuppressibleTaskDialogMsgBox(
“无法下载”,Msg,mbError,MB_OK,['OK'],0,IDOK);
结果:=假;
结束;