一个文件位于 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
目录。文件系统重定向器的描述似乎使这一点显而易见。
注意页面中的评论
应用程序应使用该
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%');
如果您使用的是 64 位版本的 windows,则 32 位应用程序不能使用FOLDERID_ProgramFilesX64
显式获取 64 位位置Program Files
,但可以使用环境变量扩展代替。在 32 位版本的 Windows 上,此位置无效,不会为您提供值。在尝试访问此变量之前,您需要检查系统的位数。
您可以使用函数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;
总之:FOLDERID_ProgramFiles
从 32/64 位程序访问时为您提供 32/64 位变体,FOLDERID_ProgramFilesX64
在 64 位应用程序上显式为您提供 64 位版本,并FOLDERID_ProgramFilesX86
显式为您提供 32 位变体。您可以使用环境变量扩展来获取 32 位应用程序上的 64 位值