参考· 05
边界值与官方对照
逐条核对过 Inno Setup 官方帮助的指令与取值范围,以及核实后改掉的三个数字。
以下结论逐条核对了 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。