有些人在给老项目做多模块安装的时候,尤其是主程序+子模块(比如子游戏),经常会遇到这么个安装弹窗:
内部错误:试图在初始化之前展开“app”常量
看着吓人,其实就是 注册表里没找着路径,所以 {app}
常量没法解析出来。
常见原因
这类问题大多数发生在 子游戏安装包:
-
主程序在装的时候,会把路径写到注册表里(一般是
HKCU\Software\XXX
)。 -
子程序要读这个注册表,拿到
{app}
作为路径。 -
如果找不到,就直接报错,提示无法展开。
怎么排查?
第一步:看子程序的安装路径是否从注册表拿对了
标准写法:
[Setup]
DefaultDirName={reg:HKCU\Software\WHQPGame\GamePlaza,InstallPath}
这句话的意思是:
-
到注册表
HKCU\Software\WHQPGame\GamePlaza
下找InstallPath
。 -
作为安装根目录。
第二步:看主程序是否写了正确的注册表键
标准写法示例:
[Registry]
Root: HKCU; Subkey: "Software\WHQPGame\GamePlaza"; Flags: uninsdeletekey
Root: HKCU; Subkey: "Software\WHQPGame\GamePlaza"; ValueName: "InstallPath"; ValueType: String; ValueData: "{app}"; Flags: createvalueifdoesntexist uninsdeletevalue deletevalue
这里重点:
-
ValueName
必须叫InstallPath
。 -
ValueData
要用{app}
,表示当前安装路径。 -
安装时才会把这个路径写到注册表。
第三步:显示安装路径,确认路径是否正确
如果还没思路,可以在 ISS
脚本里加一行:
[Setup]
DisableDirPage=no
意思是把安装路径选择页显示出来,这样装的时候就能看到实际拿到的路径是什么,方便排错。
实操示例
假设你主程序脚本里是:
[Setup]
AppName=WHQPGame
DefaultDirName={pf}\WHQPGame\GamePlaza
那子程序脚本就要写:
[Setup]
DefaultDirName={reg:HKCU\Software\WHQPGame\GamePlaza,InstallPath}
保证两个路径一致,否则子程序读不到注册表值就挂了。
碰到这种 “初始化之前展开 app 常量” 的错误,99% 是注册表路径没写对,或者子程序脚本没和主程序对齐。
一句话总结:
-
主程序先写注册表。
-
子程序从注册表读路径。
-
路径一致,问题消失。
转载请注明出处,保留作者署名与出处链接,感谢支持开源精神与知识传播!