参考· 05

边界值与官方对照

逐条核对过 Inno Setup 官方帮助的指令与取值范围,以及核实后改掉的三个数字。

适用于 v0.2.0/约 3 分钟/参考

以下结论逐条核对了 Inno Setup 官方帮助(https://jrsoftware.org/ishelp/,topic_setup_*), 并用 Inno Setup 6.7 实际编译验证过。代码里对应的常量都在 src-tauri/src/defaults.rs 顶部集中声明, preview/render.ts 有同名常量 —— 改一处必须改另一处,并跑一致性校验。

指令拼写

指令 SealPack 的写法 官方文档 结论
Compression lzma2/max 等 9 档 默认 lzma2/max;还支持 lzma/ultra、zip/1–zip/9 等 取值合法(子集)
SolidCompression yes 布尔 正确
LZMADictionarySize N(KB) 4–3932160(64 位编译器) 正确
LZMANumBlockThreads N 1–256,默认 1 正确
LZMAMatchFinder BT / HC 同 正确
LZMAUseSeparateProcess yes 同 正确
DiskSpanning yes 同 正确
DiskSliceSize N 262144–9223372036800000000 或字面量 max 正确
SlicesPerDisk N 1–26,默认 1 正确
Encryption yes / full yes / no / full,默认 no 正确
EncryptionKeyDerivation pbkdf2/N pbkdf2 或 pbkdf2/1–pbkdf2/2147483647 正确
Password 明文 同 正确
PrivilegesRequired admin / lowest 同,默认 admin 正确
WizardStyle modern / classic 同(还有 dark / dynamic / polar 等) 正确

核实后改掉的三个数字

项 原值 官方值 处理
DiskSliceSize 上限 9223372036854775807(i64::MAX) 9223372036800000000 界面 max 与生成器的 clamp 都改为官方值。超出 JS 安全整数范围,但它的最短往返表示恰好还是这串数字,所以两侧拼出的字符串一致
LZMADictionarySize 下界判断 > 0 才写入 有效范围从 4 起 改为 >= 4 才写入 —— 填 1–3 会被 ISCC 直接拒绝
LZMANumBlockThreads 文案 「0 表示自动」 默认值是 1,不是自动探测 文案改为「0 表示不写这一行,Inno 用它自己的默认值 1」

另外两处文案也顺手改准了:Encryption 的「默认」明确为「SealPack 默认」(Inno 自己的默认是 no); WizardStyle 的说明补上「官方还支持 dark / dynamic 等外观模式」。

端到端实证

除了对文档,六种典型配置还用 Inno Setup 6.7 真实编译过一遍(脚本由本项目的生成器产出、 占位符替换为实际路径):

配置 覆盖点 结果
单文件 + 全部 LZMA 参数 Compression、SolidCompression、字典、线程、匹配器、独立进程 编译成功、0 警告
Encryption=full 整包加密 + Password + EncryptionKeyDerivation 编译成功、0 警告
分卷 DiskSpanning、DiskSliceSize=1566000000、SlicesPerDisk=3 编译成功、0 警告
绿色版 Uninstallable=no、CreateUninstallRegKey=no,且不生成 [Icons] / [Tasks] / [Run] 编译成功、0 警告
不压缩 Compression=none,且不写 SolidCompression / LZMA 参数 编译成功、0 警告
未知取值 compression=rar/9、wizardStyle=nope、encryption=bogus → 全部退回默认值 编译成功、0 警告

[Files] 里主程序只被收录一次(若 * 那行重复收录,ISCC 会报重复文件 —— 实测无警告)。

语言包:不能用 compiler: 引用中文

生成的脚本里这行:

Name: "chinesesimplified"; MessagesFile: "ChineseSimplified.isl"

不能写成 compiler:Languages\ChineseSimplified.isl。原因:Inno Setup 的官方发行版 Languages\ 目录只带 29 种语言,简体中文属于用户贡献的翻译,需要单独下载 (见 jrsoftware.org/files/istrans)。用 compiler: 前缀的话,在任何标准安装上都会以 Couldn't open include file 失败 —— 只有手工往 Inno 目录里放过该文件的机器才能跑通。

所以本应用自带一份适配 Inno 6.5+ 的翻译(src-tauri/resources/isl/ChineseSimplified.isl), 打包阶段把它复制到临时脚本旁边,用相对路径引用(ISCC 按脚本所在目录解析相对路径, 与 Inno 装在哪儿无关)。

一条纪律

改了 [Setup] 指令或语言包引用之后,必须用真实 ISCC 编译一次。 单测只能证明字符串写对了,证明不了「ISCC 是否认识这条指令」「语言包文件在不在」。 最省事的做法是照上面的方式,用生成器产出一份脚本、把占位符换成实际路径、再交给 ISCC.exe。

搜索Esc

↑ ↓ 选择 · Enter 打开 · 中英文都能搜