3

ファイルは C:\program files (x86)\my app\myexe.exe にあります

  1. FileExists('C:\program files (x86)\my app\myexe.exe') はtrueを返します。

  2. FileExists('C:\program files\my app\myexe.exe') はfalseを返します。 どちらの場合も、Wow64DisableWow64FsRedirection を使用するかどうか。

なんで ?ありがとう

4

1 に答える 1

8

ファイル システムのリダイレクトは、ディレクトリに対してのみ存在し%windir%\system32ます。File System Redirectorの説明は、これを明らかにしているようです。

ページ内のコメントに注意してください

アプリケーションは、このSHGetSpecialFolderPath関数を使用して %ProgramFiles% ディレクトリ名を決定する必要があります。

編集FOLDERID_ProgramFilesx64 は、64 ビット ウィンドウで実行されている 32 ビット アプリケーションでは機能しないことがわかりました。この場合、%ProgramW6432%代わりに環境変数を使用できます。この変数は、Windows 7 以降の 32 ビット アプリケーションでのみ使用できることに注意してください。

次の Delphi スニペットでは、変数にアクセスできます。

function GetEnvironmentString(aString : string) : string;
var
  dest : string;
  retSize : integer;
begin
  SetLength(dest, MAX_PATH);
  retSize := ExpandEnvironmentStrings(pchar(aString), pchar(dest), MAX_PATH);
  if retSize > 0 then
      SetLength(dest, retSize - 1);
  result := dest;
end;

次のように呼ばれます:

GetEnvironmentString('%ProgramW6432%');

Windows の 64 ビット バージョンを使用している場合、32 ビット アプリケーションは を使用FOLDERID_ProgramFilesX64して の 64 ビットの場所を明示的に取得することはできませんProgram Filesが、代わりに環境変数展開を使用できます。Windows の 32 ビット バージョンでは、この場所は無効であり、値を取得できません。この変数にアクセスする前に、システムのビット数を確認する必要があります。

関数IsWow64Processを使用して、これを判断できます。次のスニペットを使用すると、これを確認できます。

function IsWow64: Boolean;
type
  TIsWow64Process = function(Handle: Windows.THandle; var Res: Windows.BOOL): Windows.BOOL; stdcall;
var
  IsWow64Result: Windows.BOOL;
  IsWow64Process: TIsWow64Process;
begin
  // Try to load required function from kernel32
  IsWow64Process := Windows.GetProcAddress(Windows.GetModuleHandle('kernel32.dll'), 'IsWow64Process');
  if Assigned(IsWow64Process) then
  begin
    // Function is implemented: call it
    if not IsWow64Process(Windows.GetCurrentProcess, IsWow64Result) then
      raise SysUtils.Exception.Create('IsWow64: bad process handle');
    // Return result of function
    Result := IsWow64Result;
  end
  else
    // Function not implemented: can't be running on Wow64
    Result := False;
end;

要約すると、32 / 64FOLDERID_ProgramFilesビットプログラムからアクセスしたときに32/64ビットバリアントをFOLDERID_ProgramFilesX64提供し、64ビットアプリケーションで64ビットバージョンを明示的にFOLDERID_ProgramFilesX86提供し、32ビットバリアントを明示的に提供します。環境変数展開を使用して、32 ビット アプリケーションで 64 ビット値を取得できます。

于 2012-07-19T07:36:55.620 に答える