为什么我们不能从Windows \ System32文件夹中读取.ini文件?
使用此示例:
ReadIniFile := TIniFile.Create(Format('%s\System32\%s', [GetEnvironmentVariable('WINDIR'), 'File.ini']));
Result := ReadIniFile.ReadString('HWID', 'A', '');
ReadIniFile .Free;
返回一个空字符串,现在,如果删除“ System32”并尝试从Windows文件夹中读取,则表示没有问题。
答案 0 :(得分:4)
如果您将应用程序编译为32位,但在64位版本的Windows上运行,则您的代码实际上是试图从C:\Windows\SysWOW64\
文件夹而不是{{1 }}文件夹。有关更多详细信息,请参见File System Redirector。在WOW64下运行时,您可以使用C:\Windows\System32\
别名访问实际的sysnative
文件夹:
System32
请注意,function GetWindowsFolder: string
var
Folder: array[0..MAX_PATH-1] of Char;
Len: UINT;
begin
Len := GetWindowsDirectory(Folder, MAX_PATH);
if (Len > 0) and (Len < MAX_PATH) then
Result := IncludeTrailingPathDelimiter(Folder)
else;
Result := '';
end;
function GetSystemFolder: string;
var
Folder: array[0..MAX_PATH-1] of Char;
Len: UINT;
begin
Len := GetSystemDirectory(Folder, MAX_PATH);
if (Len > 0) and (Len < MAX_PATH) then
Result := IncludeTrailingPathDelimiter(Folder)
else
Result := '';
end;
function GetRealSystem32Folder: string
var
IsWow64: BOOL;
begin
if IsWow64Process(GetCurrentProcess(), @IsWow64) and IsWow64 then
begin
Result := GetWindowsFolder;
if Result <> '' then
Result := Result + 'sysnative' + PathDelim;
end else
Result := GetSystemFolder;
end;
...
var
ReadIniFile: TIniFile;
begin
ReadIniFile := TIniFile.Create(GetRealSystem32Folder + 'File.ini');
...
end;
别名仅在WOW64下起作用,因此,如果您不想根据是否使用WOW64动态格式化文件路径,则可以简单地暂时禁用重定向器:< / p>
sysnative
答案 1 :(得分:0)
如果将程序编译为32位,则它将尝试从SysWOW64目录读取ini文件。如果您将程序编译为64位,则应该可以。您可以通过Wow64DisableWow64FsRedirection禁用重定向,更多信息: Could not find system file when it actually exists