ExpandConstant函数似乎不适用于Windows 7

时间:2012-09-22 22:01:27

标签: windows inno-setup

我正在尝试使用此功能,以便在运行时翻译{app}变量。它在Windows 2008(64位)上运行良好,但在Windows 7(64位)上不起作用。

这是我使用的代码:

[Registry]
    Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; ValueName: "Path"; ValueData: "{olddata};{app}"; Check: ExpandConstant(NeedsAddPath('{app}'))



function NeedsAddPath(Param: string): boolean;
var
  OrigPath: string;
begin
  if not RegQueryStringValue(HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'Path', OrigPath)
  then begin
    Result := True;
    exit;
  end;
  // look for the path with leading and trailing semicolon
  // Pos() returns 0 if not found
  Result := Pos(';' + UpperCase(Param) + ';', ';' + UpperCase(OrigPath) + ';') = 0;  
  if Result = True then
     Result := Pos(';' + UpperCase(Param) + '\;', ';' + UpperCase(OrigPath) + ';') = 0; 
end;

你知道原因吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

您的代码在任何操作系统上都无法正常运行,因为您的操作顺序错误。 (如果你认为它在Win2008上有效,那只是意味着你没有测试你的想法,或者错误地解释了结果。)

您的代码的主要问题是您调用Check函数的方式:

Check: ExpandConstant(NeedsAddPath('{app}'))

您正在扩展NeedsAppPath的结果,当传递参数时,NeedsAppPath内的代码显然已经展开{app}

将其更改为:

Check: NeedsAppPath(ExpandConstant('{app}'))

(实际上你上面的代码甚至不应该编译,因为需要Check函数来返回布尔值而ExpandConstant不会这样做。所以再一次,你显然没有测试你认为你是什么。)< / p>

答案 1 :(得分:0)

以下内容可能会更好,但它无法解释为什么原始版本不起作用。有一件事是肯定的,原始代码传递给Check参数字符串作为结果,而不是布尔值,基本上是错误的,但它没有解释为什么它适用于Windows 2008:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

#define KeyPath "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"

[Registry]
Root: HKLM; Subkey: "{#KeyPath}"; ValueType: expandsz; ValueName: "Path"; ValueData: "{olddata};{app}"; Check: NeedsAddPath

[Code]
function NeedsAddPath: Boolean;
var
  AppPath: string;
  OrigPath: string;
begin
  Result := True;
  if RegQueryStringValue(HKEY_LOCAL_MACHINE, '{#KeyPath}', 'Path', OrigPath) then
  begin  
    AppPath := ExpandConstant('{app}');
    Result := Pos(';' + UpperCase(AppPath) + ';', ';' + UpperCase(OrigPath) + ';') = 0;  
    if Result then
      Result := Pos(';' + UpperCase(AppPath) + '\;', ';' + UpperCase(OrigPath) + ';') = 0; 
  end;
end;