Inno Setup使用{reg}常量引用包含括号的注册表键

3

我正在尝试使用{reg}常量来设置DefaultDirName,其中包含大括号的路径:

  DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{3E4A76D9-EC0E-4806-915C-8BC2B3C0011B},InstallLocation}

然而,这种方法行不通,因为编译器认为路径中的GUID是一个常量。如果尝试用另一个大括号来转义原有大括号(如下所示),也不起作用,并会出现“无效的注册表常量”错误。
  DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{3E4A76D9-EC0E-4806-915C-8BC2B3C0011B},InstallLocation}

我已经尝试了所有想到的组合,试图逃避这个问题并让编译器识别它,包括使用 %7d 强制闭合大括号,如文档中所建议的那样,但在这种情况下,似乎无法编译为闭合大括号。希望有人能够指导如何让编译器识别此注册表位置,或者告诉我是否正在尝试做一些不可能的事情。如果是这样,是否有其他方法可以尝试?鉴于我已经尝试过以下方法:

  DefaultDirName={code:GetExistingInstallPath}
  [Code]
  function GetExistingInstallPath(Param: String): String;
  begin
    RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{F34A6950-7E0E-4F92-8B0E-C552F4989DA}',
'InstallLocation', strExistingInstallPath);
    Result := strExistingInstallPath;
  end;

代码可以编译,但是strExistingInstallPath没有返回任何内容,并且悬停在 {code:GetExistingInstallPath} 上会返回“异常:由于可能的副作用无法评估‘code’常量”。经过几个小时的尝试,我接近得出结论:Inno Setup不支持包含大括号的注册表位置。

注意,我需要读取此注册表键,因为该软件未通过Inno Setup安装,并且这是一个替换文件的补丁,因此我需要知道它最初安装的位置。

1个回答

3

如果使用{reg:...}代替关闭},则需要使用%7d

例如:

DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\
{{‌​3E4A76D9-EC0E-4806-915C-8BC2B3C0011B%7d,InstallLocation}

[Code] 部分读取注册表时,如果没有使用 ExpandConstant,则不必使用双重开放的 {{

例如:

RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\
{3E4A76D9-EC0E-4806-915C-8BC2B3C0011B}','InstallLocation', strExistingInstallPath);

补充说明:感谢 @Tlama 指出我的不精确之处。


我之前已经尝试过了,但是我期望在通过调试器运行时,结果显示%7d被替换为大括号。使用这种语法编译时没有问题,但是没有显示任何结果。现在,在根据您的建议第50次检查所有内容后,我刚刚注意到GUID中有一个错误字符(转置错误),这显然是我没有显示结果的原因!在这种情况下,我显然无法看到整体情况,只关注语法!非常感谢! - Robert Wigley
1
@Robert,你在调试器中永远不会看到那些未转义的字符,因为它们被内部扩展了。 - TLama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接