You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Inno Setup Registry段ValueData使用含大括号常量报错求助

解决Inno Setup中Registry区段ValueData的大括号转义问题

这个问题其实是Inno Setup的预处理器和脚本解析顺序导致的——当你定义了包含单个大括号的常量后,预处理器会先把{#TConst}替换成abcd {efgh},但脚本解析器会把{efgh}当成一个未定义的常量引用,自然就抛出"Unknown constant"的错误了。

要解决这个问题,有两种常用的方法:

方法一:在常量定义时直接转义大括号

Inno Setup中,要表示字面意义的大括号,需要用两个连续的{}来转义。所以你只需要修改常量的定义:

#define TConst "abcd {{efgh}}"  // 把单个{改成{{

[Registry]
Root: HKCU; Subkey: "Software\MyApp"; ValueType: string; ValueName: "MyValue"; ValueData: "{#TConst}"

预处理器替换后,ValueData会变成abcd {efgh},脚本解析时会自动把{{转换成单个{,最终写入注册表的就是你想要的内容,不会再触发常量解析错误。

方法二:使用预处理器函数动态转义

如果你的常量内容是动态生成的(比如来自外部变量、文件内容等),没法提前手动转义,可以用Inno Setup预处理器的StringChange函数,把单个{替换成{{

#define TConst "abcd {efgh}"

[Registry]
Root: HKCU; Subkey: "Software\MyApp"; ValueType: string; ValueName: "MyValue"; ValueData: "{#StringChange(TConst, '{', '{{')}"

这种方式会在预处理器阶段自动完成转义,同样能避免脚本解析时的错误。

补充说明

要注意区分两种大括号的用途:

  • 单个{...}:被脚本解析器识别为常量引用(比如{app}{win}这类内置常量,或者用户自定义的常量)
  • 两个{{/}}:表示字面意义的大括号,最终会被解析成单个{/}

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

火山引擎 最新活动