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

あなたのコードは、間違った順序で実行しているため、どの OS でも正しく動作しません。(Win2008 で動作したと思われる場合、それは単純に、自分が思っていたとおりにテストしていなかったか、結果を間違って解釈したことを意味します。)

コードの主な問題は、Check 関数を呼び出す方法です。

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

パラメータが渡されたときにNeedsAppPath内部のコードがすでに展開されていることを明らかにNeedsAppPath期待している場合、 の結果を展開しています。{app}

これを次のように変更します。

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

(実際には、チェック関数はブール値を返す必要があり、ExpandConstant はそうしないため、上記のコードはコンパイルすることさえできません。したがって、繰り返しになりますが、自分が何を考えているかをテストしていないことは明らかです。)

于 2012-09-23T08:56:05.403 に答える
0

次のようなものの方が良いかもしれませんが、元のバージョンが機能しない理由は説明されていません。1つ確かなことは、元のコードがCheckブール値ではなくパラメータ文字列に渡されることです。これは基本的に間違っていますが、Windows2008で機能する理由は説明されていません。

[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 に答える