2014-12-01 135 views
3

我试图使用{REG}常数DefaultDirName它引用包含大括号的路径包含括号注册表项:Inno Setup的参考使用{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返回任何内容并悬停在{代码:GetExistingInstallPath}返回“异常:无法计算‘代码’不变的,因为可能的副作用。 “经过几个小时试图让这个工作,我接近得出结论,Inno Setup不支持包含大括号的注册表位置。

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

回答

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指出我的不精确性。

+0

我已经试过了,但我期待的结果是在运行调试器时显示%7d替代为大括号。当我用这种语法运行它时它确实编译了,但没有显示任何结果。现在已经检查了第50次所有内容,感谢您的建议,我刚刚注意到GUID中有一个不正确的字符(转置错误),事后看来,显然是我没有得到任何结果的原因!在这种情况下,我显然无法看到树木上的木材,只关注语法!非常感谢! – 2014-12-01 20:58:38

+1

@Robert,你将不会看到这些字符在调试器中未被转义,因为它们是[内部扩展](https://github.com/jrsoftware/issrc/blob/is-5_5_5/Projects/Main.pas #L782)。 – TLama 2014-12-01 21:17:19