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

时间:2014-12-01 20:10:27

标签: inno-setup

我正在尝试将{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}上会返回“异常:无法评估”代码“由于可能的副作用而导致的常量”。经过几个小时试图让这个工作,我接近得出结论,Inno安装程序不支持包含大括号的注册表位置。

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

1 个答案:

答案 0 :(得分: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);

P.S。感谢@Tlama指出我的不确定性。

相关问题