在Inno Setup的漂亮任务对话框窗口中显示有关下载文件的错误哈希值的信息

安德鲁·特拉克(Andrew Truckle)

我最初在另一个平台(这里问这个问题

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

ErrorFileHash2=Invalid file hash: expected %1, found %2

当安装程序尝试下载并运行具有错误哈希值的文件时,将显示此消息。

在我的脚本中,我有:

function NextButtonClick(CurPageID: integer): boolean;
begin
    Result := True;
 
  if (CurPageID = wpSelectTasks) then
  begin
    DownloadPage.Clear;
    if (WizardIsTaskSelected('downloadhelp')) then
      AddFileForDownload('{#HelpDocSetupURL}', 'HelpDocSetup.exe', 
        '{#GetSHA256OfFile("..\HelpNDoc\CHM\Output\MSAHelpDocumentationSetup.exe")}');
  end
    else
  if (CurPageID = wpReady) then
  begin
    DownloadPage.Show;
    try
      try
        DownloadPage.Download;
        Result := True;
      except
        SuppressibleMsgBox(
          AddPeriod(GetExceptionMessage), mbCriticalError, MB_OK, IDOK);
        Result := False;
      end;
    finally
      DownloadPage.Hide;
    end;
  end;
end;

出现问题时显示的错误消息非常难看。向我提出以下建议:

如果您不处理异常,它只会显示一个消息框。使用try / except,然后可以执行一些操作,例如添加文件名重新引发异常或使用任务对话框。

我以为我会尝试消息框设计器:

在此处输入图片说明

这将创建以下代码:

// Display a message box
SuppressibleTaskDialogMsgBox(
  'Unable to download [file]', 'This is because the checksum value does not match',
  mbError, MB_OK, ['OK'], 0, IDOK);

但是我不知道我在这里做什么。

  • 如何处理显示此错误的异常?
  • 如何显示更好的任务对话框?是否还包含详细信息和文件名?
马丁·普里克里(Martin Prikryl)

只需替换您当前的:

SuppressibleMsgBox(
  AddPeriod(GetExceptionMessage), mbCriticalError, MB_OK, IDOK);

使用您的新代码:

SuppressibleTaskDialogMsgBox(
  'Unable to download [file]', 'This is because the checksum value does not match',
  mbError, MB_OK, ['OK'], 0, IDOK);

在此处输入图片说明


如果要确定失败的下载,则可以使用的值DownloadPage.Msg2Label.Caption(如果移动消息框,则可以看到它的值)。

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

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

function ParseDataFromSetupMessage(
  Msg: string; ID: TSetupMessageID; var Data: TArrayOfString): Boolean;
var
  MsgOrig, Pattern, PatternOrig, S: string;
  I, P, P2: Integer;
begin
  try
    MsgOrig := Msg;
    Pattern := SetupMessage(ID);
    PatternOrig := Pattern;
    while (Msg <> '') and (Pattern <> '') do
    begin
      P := Pos('%', Pattern);
      if (P = 0) or (P = Length(Pattern)) or (P > 1) then
      begin
        if (P = 0) or (P = Length(Pattern)) then P := Length(Pattern) + 1;

        if Copy(Msg, 1, P - 1) <> Copy(Pattern, 1, P - 1) then Abort;

        Delete(Msg, 1, P - 1);
        Delete(Pattern, 1, P - 1);
      end
        else
      if (Pattern[2] < '1') or (Pattern[2] > '9') then
      begin
        if Copy(Msg, 1, 1) <> '%' then Abort;
        Delete(Pattern, 1, 1);
        Delete(Msg, 1, 1);
      end
        else
      begin
        I := StrToInt(Pattern[2]);
        Delete(Pattern, 1, 2);
        if Length(Pattern) = 0 then
        begin
          S := Msg;
          SetLength(Msg, 0);
        end
          else
        begin
          P := Pos('%', Pattern);
          if P = 0 then P := Length(Pattern) + 1;
          P2 := Pos(Copy(Pattern, 1, P - 1), Msg);
          if P2 = 0 then Abort;
          S := Copy(Msg, 1, P2 - 1);
          Delete(Msg, 1, P2 - 1);
        end;

        if GetArrayLength(Data) < I then
          SetArrayLength(Data, I);
        Data[I - 1] := S;
      end;
    end;

    if Msg <> Pattern then Abort;

    Result := True;
  except
    Log(Format('"%s" does not seem to match format string "%s".', [
      MsgOrig, PatternOrig]));
    Result := False;
  end;
end;

您可以except像这样块中同时使用两者

except
  Msg := GetExceptionMessage;
  if ParseDataFromSetupMessage(Msg, msgErrorFileHash2, Data) then
  begin
    Expected := Data[0];
    Hash := Data[1];
    Msg :=
      'This is because the checksum value does not match.' + #13+
      'Download: ' + DownloadPage.Msg2Label.Caption + #13 +
      'Expected: ' + Expected + #13 +
      'Got: ' + Hash;
  end
    else
  begin
    // Failed for other reasons?
    Msg :=
      'Download has failed.' + #13+
      'Download: ' + DownloadPage.Msg2Label.Caption + #13 +
      'Details: ' + Msg;
  end;
  SuppressibleTaskDialogMsgBox(
    'Unable to download', Msg, mbError, MB_OK, ['OK'], 0, IDOK);
  Result := False;
end;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Inno Setup语言对话框自定义

来自分类Dev

Inno Setup语法-OR,AND

来自分类Dev

Inno Setup中的TTreeView

来自分类Dev

Inno Setup如何在浏览对话框上显示网络?

来自分类Dev

通过inno setup安装时下载文件

来自分类Dev

通过inno setup安装时下载文件

来自分类Dev

inno setup中的“ Not in a loop”错误

来自分类Dev

提供Inno Setup下载功能的文件大小

来自分类Dev

如何在Inno Setup的“浏览文件夹”对话框中禁用“确定”按钮

来自分类Dev

如何在Inno Setup的打开对话框中选择多个文件?

来自分类Dev

未捕获Inno Setup异常

来自分类Dev

如何从Inno Setup安装JRE?

来自分类Dev

Inno Setup ComponentsList OnClick事件

来自分类Dev

Inno Setup设置TInputQueryWizardPage高度

来自分类Dev

Inno Setup从CDATA创建TStringList

来自分类Dev

Inno Setup:选择组件的功能

来自分类Dev

Inno Setup隐藏日志条目

来自分类Dev

Inno Setup Abs(Integer)功能

来自分类Dev

Inno Setup更改CreateOutputMsgMemoPage字体

来自分类Dev

在Inno Setup中取消安装

来自分类Dev

Inno Setup中的条件DisableProgramGroupPage

来自分类Dev

缺少Inno-Setup分号

来自分类Dev

在Inno Setup中记录TWindowsVersion

来自分类Dev

Inno Setup更改c:\权限

来自分类Dev

Inno Setup:创建简化的ComponentsList

来自分类Dev

Inno Setup,检测Java版本

来自分类Dev

Inno Setup-后处理

来自分类Dev

Inno Setup 中的动态密码

来自分类Dev

根据Inno Download Plugin选择的任务下载?