ファイルは C:\program files (x86)\my app\myexe.exe にあります
FileExists('C:\program files (x86)\my app\myexe.exe') はtrueを返します。
FileExists('C:\program files\my app\myexe.exe') はfalseを返します。 どちらの場合も、Wow64DisableWow64FsRedirection を使用するかどうか。
なんで ?ありがとう
ファイルは C:\program files (x86)\my app\myexe.exe にあります
FileExists('C:\program files (x86)\my app\myexe.exe') はtrueを返します。
FileExists('C:\program files\my app\myexe.exe') はfalseを返します。 どちらの場合も、Wow64DisableWow64FsRedirection を使用するかどうか。
なんで ?ありがとう
ファイル システムのリダイレクトは、ディレクトリに対してのみ存在し%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 ビット値を取得できます。