2

我正在尝试使用此函数在运行时转换 {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;

你知道原因吗?

谢谢你!

4

2 回答 2

2

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

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

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

您正在扩展 的结果NeedsAppPath,而当传入参数时,显然内部的代码NeedsAppPath已经{app}被扩展了。

将其更改为:

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

(事实上​​,你上面的代码甚至不应该编译,因为 Check 函数需要返回布尔值而 ExpandConstant 不这样做。所以同样,你显然没有测试你认为你是什么。)

于 2012-09-23T08:56:05.403 回答
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;
于 2012-09-22T22:22:58.743 回答