Inno setup Inno安装程序使用{reg}常量引用包含大括号的注册表项

Inno setup Inno安装程序使用{reg}常量引用包含大括号的注册表项,inno-setup,Inno Setup,我正在尝试为DefaultDirName使用{reg}常量,其中它引用了包含大括号的路径: DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{3E4A76D9-EC0E-4806-915C-8BC2B3C0011B},InstallLocation} 但是,这不起作用,因为编译器认为路径中的GUID是常量。如果我尝试按照建议使用另一个大括号来转义大括号(见下文),这也不起作用,并且会出

我正在尝试为DefaultDirName使用{reg}常量,其中它引用了包含大括号的路径:

  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安装程序不支持包含大括号的注册表位置

注意,我需要读取此注册表项,因为软件不是由Inno安装程序安装的,这是一个用于替换文件的修补程序,因此我需要知道它最初安装到哪里。

如果使用而不是关闭
}
您必须使用
%7d

例如:

DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\
{{‌​3E4A76D9-EC0E-4806-915C-8BC2B3C0011B%7d,InstallLocation}
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\
{3E4A76D9-EC0E-4806-915C-8BC2B3C0011B}','InstallLocation', strExistingInstallPath);
[code]
部分读取注册表时,如果没有使用
ExpandConstant
,则不必使用双开口
{

例如:

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

另外,感谢@Tlama指出我的不精确性。

我已经尝试过了,但我希望在运行调试器时,结果会显示%7d被替换为大括号。我使用此语法运行它时,它确实编译了,但没有显示任何结果。现在,在第50次检查所有内容后,感谢您的建议,我没有看到任何结果ced发现GUID中有一个不正确的字符(换位错误),事后看来,这显然是我没有得到结果的原因!在这种情况下,我显然无法从树上看到木头,只关注语法!非常感谢!@Robert,你永远不会在调试器中看到那些未转义的字符,因为它们是。