gpt4 book ai didi

delphi - 是什么原因导致此错误 'Unable to write to application file.ini'

转载 作者:行者123 更新时间:2023-12-02 06:16:22 32 4
gpt4 key购买 nike

我的应用程序是用delphi构建的,它可以在除Windows 7 64位机器之外的其他平台上完美运行。每次尝试关闭应用程序都会给我这个错误“无法写入应用程序文件.ini”

这是我的关闭代码

procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
frmMain.close;
end;

最佳答案

此错误通常是由于尝试写入 Program Files 下的应用程序自己的文件夹而引起的,对于 Vista 及更高版本(以及 XP,如果您不这样做的话)下的非管理员来说,这是不允许的以管理员或高级用户身份运行)。

下面是一些获取 .INI 文件正确文件夹的代码:

uses
Windows,
ShlObj; // For SHGetSpecialFolderPath

function GetFolderLocation(Handle: HWnd; Folder: Integer): string;
begin
Result := '';
SetLength(Result, MAX_PATH);
if not SHGetSpecialFolderPath(Handle, PChar(Result), Folder, False) then
RaiseLastOSError;
end;

我在应用程序中使用这些来检索非漫游配置文件文件夹,并使用在该文件夹下创建的子文件夹来保存应用程序的数据。它是在创建 TDataModule 期间设置的:

procedure TAppData.Create(Sender.TObject);
begin
// DataPath is a property of the datamodule, declared as a string
// CSIDL_LOCAL_APPDATA is the local non-roaming profile folder.
// CSIDL_APPDATA is for the local roaming profile folder, and is more typically used
DataPath := GetFolderLocation(Application.Handle, CSIDL_LOCAL_APPDATA);
DataPath := IncludeTrailingPathDelimiter(DataPath) + 'MyApp\';
end;

参见MSDN's documentation page各种 CSIDL_FOLDERID_ 值的含义。 FOLDERID_ 值类似,但仅在 Vista 及更高版本上可用,并与 SHGetKnownFolderIDList 一起使用。 .

对于那些不愿意愿意忽视 MS 关于不支持 SHGetSpecialFolderPath 的警告的人,这里有一个使用 GetFolderLocation 的替代版本SHGetFolderPath,首选:

uses
ShlObj, SHFolder, ActiveX, Windows;

function GetFolderLocation(Handle: HWnd; Folder: Integer): string;
begin
Result := '';
SetLength(Result, MAX_PATH);
if not Succeeded(SHGetFolderPath(Handle, Folder, 0, 0, PChar(Result))) then
RaiseLastOSError();
end;

最后,对于那些仅使用 Vista 及更高版本的用户,这里有一个使用 SHGetKnownFolderPath 的示例- 请注意,这在 Delphi 的 XE 之前版本中不可用(据我所知,可能是 2009 年或 2010 年),您需要使用 KNOWNFOLDERID值而不是 CSIDL_,如 FOLDERID_LocalAppData:

uses
ShlObj, ActiveX, KnownFolders;

// Tested on XE2, VCL forms application, Win32 target, on Win7 64-bit Pro
function GetFolderLocation(const Folder: TGuid): string;
var
Buf: PWideChar;
begin
Result := '';
if Succeeded(SHGetKnownFolderPath(Folder, 0, 0, Buf)) then
begin
Result := Buf;
CoTaskMemFree(Buf);
end
else
RaiseLastOSError();
end;

关于delphi - 是什么原因导致此错误 'Unable to write to application file.ini',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11222132/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com