【问题标题】:How to implement MD5 check into Inno Setup installer to get 'like NSIS integrity check'?如何在 Inno Setup 安装程序中实施 MD5 检查以获得“像 NSIS 完整性检查”?
【发布时间】:2026-01-11 08:20:02
【问题描述】:

如何在 Inno Setup 中执行 MD5 检查,以便它可以验证 InitializeSetup 上的基本安装程序文件(exe + bins) - 这是标准 NSIS 功能,它非常有用,因为它会通知安装程序是否正常或损坏?

如果是可能需要嵌入 MD5Summer 或其他 MD5 检查器并在编译期间/之后创建 MD5 总和的 IS。

【问题讨论】:

  • 您需要临时解压文件并为此使用GetMD5OfFile函数。
  • 在编译时,您可以使用同名的GetMD5OfFile 预处理器函数并存储 MD5 和,例如放入可以在运行时加载的文本文件中。然而,这并不容易,因为你can't access file list
  • 如果您没有指定dontverifychecksum 标志,使用ExtractTemporaryFile 函数就足够了(快速查看源代码)。当文件有问题时它会抛出异常:-)

标签: md5 inno-setup nsis integrity


【解决方案1】:

Inno 已经对自己的内容进行了完整的完整性检查。无需额外检查。

如果您使用磁盘跨越(暗示存在 .bin 文件),则 .bin 文件可能不可用(在不同的磁盘上),因此在安装程序到达该磁盘之前不会被扫描。

【讨论】:

  • 安装过程中会这样做。我可以损坏文件,安装程序无论如何都会运行。它将在安装过程中通知问题。我想要/需要的是验证InitializeSetup 上的所有文件。所以我不能同意你的回答。
  • 你失去了我。我们同意安装程序验证其文件。您要检查什么?
  • 运行任何 NSIS 安装程序。在显示向导之前,它将验证整个安装程序。如果安装程序文件损坏,它将通知问题并退出。所以...用户可以确定如果安装程序将显示向导,则安装程序正常(未损坏)。即使机柜出现故障、损坏,Inno Setup 设置也可以运行。在安装过程中会显示错误。我想在向导之前验证安装程序的文件。为什么?因为如果应用程序很大 - 例如12 BINs - 在提取最后一个柜子时遇到错误我会非常生气。最好提前知道...
  • 好吧,现在我可以肯定地告诉你,唯一的确定方法是在向导启动时提取所有文件(如你所说,需要很长时间)并处理例外。这样做,您应该考虑将这些提取的文件从临时文件夹复制到目标文件夹,以防止重复提取。
  • 既然您提到使用 .bin 文件,这意味着您启用了 DiskSpanning。在这种情况下,Inno 不会在启动时进行验证,因为这些文件被允许位于单独的磁盘/光盘上(因此得名),因此在启动时不可用。如果您的应用程序足够小,您应该关闭 DiskSpanning 以避免这种情况。
【解决方案2】:

如何为所有 .bin 文件创建 md5 哈希? 这应该分两步完成:

1) 从已编译的 .bin(s) 创建 md5 哈希 - 哈希将作为文本文件存储在 setup.exe 中 [所以这是一个两步编译:创建 .bins,为 .bins 创建哈希,然后再次编译以将哈希包含到 setup.exe 中]

2) 在运行时在 InitializeWizard() 函数中使用插件。

您可以使用一些 Pascal 字符串比较函数或简单地使用“=”轻松比较哈希值。 如果哈希值不匹配,您可以在显示任何窗口之前存在安装程序。

拥有小的 setup.exe 很重要 - 哈希必须始终位于 [Files] 部分顶部附近的同一位置,以便快速解压缩。 并且一切都必须是可靠的,因此在 setup.exe 中添加哈希不会修改 .bins 的 md5。

【讨论】:

  • 1) 你可以用预处理器来做 2) 该插件如何从 InnoSetup 安装档案中提取文件?不要忘记,它们只是在安装时复制文件时才解压缩的。
  • 提取文件很容易:将文件放入 [Files] 部分 "Source: file.hash; Flags: dontcopy;"并在 InitializeWizard() 函数中将它们提取为“ExtractTemporaryFile('file.hash');”