从Windows \ System32文件夹中读取INI文件

时间:2018-11-19 23:37:46

标签: delphi ini

为什么我们不能从Windows \ System32文件夹中读取.ini文件?

使用此示例:

ReadIniFile := TIniFile.Create(Format('%s\System32\%s', [GetEnvironmentVariable('WINDIR'), 'File.ini']));
Result  := ReadIniFile.ReadString('HWID', 'A', '');
ReadIniFile .Free;

返回一个空字符串,现在,如果删除“ System32”并尝试从Windows文件夹中读取,则表示没有问题。

2 个答案:

答案 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