这是因为WOW64 file system redirection
,如果您的 32 位应用程序想要访问本机 system32 目录,您必须使用该Wow64DisableWow64FsRedirection
函数或Sysnative
别名。
Wow64DisableWow64Fs 重定向
试试这个样本
{$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 文件系统重定向器。禁用文件系统重定向会影响调用线程执行的所有文件操作,因此只有在需要单个 CreateFile 调用时才应禁用它,并在函数返回后立即重新启用它。长时间禁用文件系统重定向会阻止 32 位应用程序加载系统 DLL,从而导致应用程序失败。
系统性的
32 位应用程序可以通过将 %windir%\Sysnative 替换为 %windir%\System32 来访问本机系统目录。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.