これはWOW64 file system redirection
、ネイティブsystem32ディレクトリへのアクセスを取得する32ビットアプリの場合、Wow64DisableWow64FsRedirection
関数またはSysnative
エイリアスを使用する必要があるためです。
Wow64DisableWow64FsRedirection
このサンプルを試してください
{$APPTYPE CONSOLE}
uses
SysUtils,
Windows;
Function Wow64DisableWow64FsRedirection(Var Wow64FsEnableRedirection: LongBool): LongBool; StdCall;
External 'Kernel32.dll' Name 'Wow64DisableWow64FsRedirection';
Function Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection: LongBool): LongBool; StdCall;
External 'Kernel32.dll' Name 'Wow64EnableWow64FsRedirection';
Var
Wow64FsEnableRedirection: LongBool;
begin
try
if Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection) then
begin
if FileExists('c:\windows\system32\alg.exe') then
Writeln('fe')
else
Writeln('fne');
if not Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection) then
RaiseLastOSError;
end
else
RaiseLastOSError;
except
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Writeln('Press Enter to exit');
Readln;
end.
end.
さらに、このトピックについては、MSDNのドキュメントを確認してください。
アプリケーションは、Wow64DisableWow64FsRedirection、Wow64EnableWow64FsRedirection、およびWow64RevertWow64FsRedirection関数を使用してWOW64ファイルシステムリダイレクタを制御できます。ファイルシステムのリダイレクトを無効にすると、呼び出し元のスレッドによって実行されるすべてのファイル操作に影響するため、1回のCreateFile呼び出しに必要な場合にのみ無効にし、関数が戻った直後に再度有効にする必要があります。ファイルシステムのリダイレクトを長期間無効にすると、32ビットアプリケーションがシステムDLLをロードできなくなり、アプリケーションが失敗する可能性があります。
Sysnative
32ビットアプリケーションは、%windir%\ System32を%windir%\ Sysnativeに置き換えることで、ネイティブシステムディレクトリにアクセスできます。WOW64は、ファイルシステムがアクセスをリダイレクトしてはならないことを示すために使用される特別なエイリアスとしてSysnativeを認識します。このメカニズムは柔軟性があり使いやすいため、ファイルシステムのリダイレクトをバイパスするための推奨メカニズムです。64ビットアプリケーションは、実際のディレクトリではなく仮想ディレクトリであるため、Sysnativeエイリアスを使用できないことに注意してください。
{$APPTYPE CONSOLE}
{$R *.res}
uses
SysUtils,
Windows;
begin
try
if FileExists('c:\windows\SysNative\alg.exe') then
Writeln('fe')
else
Writeln('fne');
except
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Writeln('Press Enter to exit');
Readln;
end.