12

システムは見つかりませんalg.exeが、存在します-" c:\windows\system32\alg.exe"。

最近、Win 7 x86から​​x64に移行しましたが、x86を使用していたときは、これに問題はなく、Delphi7とXE2を試しました。

私が使用しているコード:

if FileExists('c:\windows\system32\alg.exe') then
  ShowMessage('fe') else ShowMessage('fne');

ファイルと私のアプリの所有権を管理者権限で取得しようとしました-同じ問題。

みんな、x64かどうかを確認します。

function IsWow64Process(Handle:THandle; var IsWow64 : BOOL) : BOOL; stdcall; external 'kernel32.dll';

function IS64 : Boolean;
var
 xIS64 : Bool;
begin
 if IsWow64Process(GetCurrentProcess, xIS64) then
  Result := xIS64 else RaiseLastOSError;
end;
4

2 に答える 2

17

これは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.
于 2013-03-24T19:50:27.490 に答える
13

64ビットシステムで実行されている32ビットプロセスがあります。プロセスはWOW64エミュレーター内で実行され、ファイルシステムリダイレクターの対象となります。これにより、64ビットシステムフォルダー%windir%\ System32への参照が32ビットシステムフォルダー%windir%\SysWOW64にリダイレクトされます。

エミュレーターで実行されている32ビットプロセス内から64ビットシステムフォルダーにアクセスするための推奨される方法は、%windir%\Sysnativeエイリアスを使用することです。

32ビットアプリケーションは、%windir%\ System32を%windir%\ Sysnativeに置き換えることで、ネイティブシステムディレクトリにアクセスできます。WOW64は、ファイルシステムがアクセスをリダイレクトしてはならないことを示すために使用される特別なエイリアスとしてSysnativeを認識します。このメカニズムは柔軟性があり使いやすいため、ファイルシステムのリダイレクトをバイパスするための推奨メカニズムです。64ビットアプリケーションは、実際のディレクトリではなく仮想ディレクトリであるため、Sysnativeエイリアスを使用できないことに注意してください。

当然、このエイリアスは64ビットシステムにのみ存在します。これを確認する最も簡単な方法は、の値をテストすることですTOSVersion.Architecture

リダイレクタを無効にすることは可能ですが、無効にすることはお勧めしません。ドキュメントには次のように書かれています。

アプリケーションは、Wow64DisableWow64FsRedirection、Wow64EnableWow64FsRedirection、およびWow64RevertWow64FsRedirection関数を使用してWOW64ファイルシステムリダイレクタを制御できます。ファイルシステムのリダイレクトを無効にすると、呼び出し元のスレッドによって実行されるすべてのファイル操作に影響するため、1回のCreateFile呼び出しに必要な場合にのみ無効にし、関数が戻った直後に再度有効にする必要があります。ファイルシステムのリダイレクトを長期間無効にすると、32ビットアプリケーションがシステムDLLをロードできなくなり、アプリケーションが失敗する可能性があります。

ファイルシステムリダイレクタを無効にしないことを強くお勧めします。

于 2013-03-24T19:56:18.537 に答える