You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Inno Setup中通过验证文件哈希限制安装流程?

在Inno Setup中实现文件哈希验证以控制安装流程

核心思路是:将你创建的文件选择页设为全局变量,在用户点击「下一步」时读取选中文件、计算MD5哈希,与预期值对比——不匹配则阻止安装流程继续。

以下是完整的实现代码,直接替换你现有[Code]段即可:

[Code]
var
  ROMFilePage: TInputFileWizardPage;
  // 替换成你需要验证的MD5哈希值
  ExpectedROMHash: string = '填入你的预期MD5哈希';

procedure InitializeWizard;
begin
  ROMFilePage := CreateInputFilePage(wpWelcome,
    '选择SMB1 ROM文件', '需要合法获取的SMB1 ROM才能继续安装',
    '点击“浏览...”选择你的SMB1 ROM文件,然后点击下一步。');

  ROMFilePage.Add('&SMB1 ROM文件:',
    '.NES|*.nes|.NEZ|*.nez|.UNF|*.unif|.UNIF|*.unif',
    '.nes');
end;

function NextButtonClick(CurPageID: Integer): Boolean;
var
  ROMFilePath: string;
  ROMContent: string;
  CalculatedHash: string;
begin
  Result := True;

  // 仅在当前页是ROM选择页时执行验证
  if CurPageID = ROMFilePage.ID then
  begin
    ROMFilePath := ROMFilePage.Values[0];
    
    // 双重校验文件有效性
    if not FileExists(ROMFilePath) then
    begin
      MsgBox('请选择有效的SMB1 ROM文件。', mbError, MB_OK);
      Result := False;
      Exit;
    end;

    // 读取ROM文件内容(40KB大小无内存压力)
    if not LoadStringFromFile(ROMFilePath, ROMContent) then
    begin
      MsgBox('无法读取所选ROM文件,请检查文件权限或完整性。', mbError, MB_OK);
      Result := False;
      Exit;
    end;

    // 计算文件MD5哈希并对比
    CalculatedHash := GetMD5OfString(ROMContent);
    if UpperCase(CalculatedHash) <> UpperCase(ExpectedROMHash) then
    begin
      MsgBox('所选ROM文件不符合要求,请检查文件是否正确。', mbError, MB_OK);
      Result := False;
      Exit;
    end;
  end;
end;

关键说明

  • 全局变量ROMFilePage:让NextButtonClick事件能访问到用户选择的文件路径,解决局部变量无法跨事件访问的问题。
  • NextButtonClick事件拦截:这是Inno Setup内置的流程拦截点,返回False即可阻止页面跳转,实现验证不通过时无法继续安装。
  • 哈希对比逻辑:统一转成大写对比,避免MD5哈希大小写书写差异导致的验证失败。

内容的提问来源于stack exchange,提问作者Amy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 06:42:46