我正在尝试使用此功能,以便在运行时翻译{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;
你知道原因吗?
谢谢!
答案 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;