Inno Setup预处理器/调试器字符串变量与定义符号行为不一致问题
Inno Setup 预处理器符号展开随机异常问题
运行脚本时遇到如下随机异常现象:
- 鼠标悬浮在变量
ConfigPath: string;上时,能看到正确的变量值;但悬浮在符号{#EPIC_ID}上时,显示错误提示Internal Error - 保存预处理脚本后,
ConfigPath的赋值语句显示正确:ConfigPath := 'c:\ProgramData\Epic\EpicGamesLauncher\Data\Manifests\12C916CC456AD69CAD0B65898515C92A.item'; - 但第177行的Log仅输出
Reading "",仿佛ConfigPath是空字符串(实际并非如此) - 问题并非持续出现,具有随机性,无法找到100%复现的方法
这可能是符号展开的内部错误,但即便如此ConfigPath字符串也不应为空。相关代码示例如下:
Main.iss 文件
#define EPIC_ID "12C916CC456AD69CAD0B65898515C92A.item" #if EPIC_ID #include "EpicHelper.iss" #endif [Setup] ... [Code]
EpicHelper.iss 文件
<event('InitializeSetup')> function InitializeSetupParseConfig(): Boolean; var Json: string; ConfigPath: string; begin Result := True; ConfigPath := 'c:\ProgramData\Epic\EpicGamesLauncher\Data\Manifests\{#EPIC_ID}'; if (FileExists(ConfigPath) = false) then begin Log(Format('File not found: "%s"', [ConfigPath])); Exit; end; Log(Format('Reading "%s"', [ConfigPath])); end;
可能的原因分析
这种随机异常大概率是Inno Setup预处理器的内部缓存或符号展开机制存在bug。即便符号展开过程中出现错误,理论上ConfigPath也不应被置为空字符串,推测是预处理器在某些特定场景下未正确完成字符串拼接,导致实际编译后的代码中{#EPIC_ID}被错误替换为空,而非定义的有效值。
内容的提问来源于stack exchange,提问作者Slappy
相关产品推荐
相关产品推荐

