是什么原因导致此错误“无法写入应用程序 file.ini”

2023-12-08

我的应用程序是用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;

See MSDN 的文档页面关于各种含义CSIDL_ or FOLDERID_价值观。这FOLDERID_值类似,但仅在 Vista 及更高版本上可用,并与SHGetKnownFolderIDList.

对于你们这些人not愿意无视 MS 的警告SHGetSpecialFolderPath不受支持,这是一个替代版本GetFolderLocation using 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 及更高版本的人,这里有一个使用的示例SH获取已知文件夹路径- 请注意,这在 Delphi 的 XE 之前版本中不可用(据我所知,可能是 2009 年或 2010 年),您需要使用已知文件夹ID值而不是CSIDL_, like 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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是什么原因导致此错误“无法写入应用程序 file.ini” 的相关文章

随机推荐

  • DBase7 中的时间戳

    我正在尝试从 dbf 文件读取 DBase 7 时间戳值 从 DBase 格式规范我得到以下信息 8 个字节 两个长整型 第一个用于日期 第二个用于时间 该日期是自 01 01 4713 BC 以来的天数 时间为小时 3600000L 分钟
  • Java Firestore Android 在查询中使用数组列表来显示关注用户的帖子

    我正在开发一项活动 显示用户关注的用户的帖子 对于帖子 我使用了以下结构 root posts collection uid documents userPosts collection postId documents title Pos
  • Python OSError:SFTP 失败

    我正在 Windows 11 笔记本电脑上测试 SFTP 通信 SFTP 服务器在 localhost 3373 上运行 一个sftp get请求生成一个 操作系统错误 失败 此代码错误 import pysftp remotepath C
  • 即使我声明了 Main 方法也未找到

    我想创建一个带有 main 方法的简单 java 类 但是当我编译代码时 我收到以下错误消息 错误 在类错误中找不到主方法 TestErrors 请定义 主要方法为 public static void main String args 这
  • 多个数据库连接和 Yii 2.0

    我有两个数据库 每个数据库都有相同的表和相同的字段 但是如何同时从所有两个数据库中获取所有记录Yii 2 0 首先 您需要配置数据库 如下所示 return components gt db1 gt class gt yii db Conn
  • jqGrid 列选择器对话框可调整大小,但调整大小时内部内容不会在调整大小时拉伸

    我使用 jqGrid 和 ui multiselect js 进行列选择和重新排序 出现的对话框可以调整大小 但调整大小时 对话框的内容不会调整大小 你必须参加任何活动才能做这些事情吗 你是对的 目前 这是列选择器中的问题 最好在代码中进行
  • Android Volley:POST 请求 - NodeJS REST API 内的 req.body 为空

    我知道它已经被讨论了十亿次 而且我已经阅读了几个问题 答案 特别是这个似乎是一个很好的例子 gt example 所以现在我尝试重新创建代码并添加我的getParams 以及我的getHeaders 尴尬的是我得到了 HTTP 状态代码 4
  • 如何在php中获取选择框的多个选定值?

    我有一个 html 表单 其中有一个选择列表框 您可以从中选择多个值 因为它的 multiple 属性设置为 multiple 考虑表单方法是 GET 表单的html代码如下
  • 从父级中删除多个子级?

    我有一堆同名的元素 我试图用 onchange 函数同时删除它们 这是 JavaScript 甚至不确定removeChildren是否是一个真正的命令 我的元素是给onchange操作
  • 加载多个图像时回调的跨浏览器解决方案?

    我检查了其他问题 但它们都包含如何在加载一张特定图像时进行回调的信息 var img new Image img src images img png if img complete img onload function code to
  • 在android 3.0(蜂窝)中隐藏系统栏

    如何在android 3 0 honeycomb 中隐藏系统栏 无法删除系统栏 在未 root 的设备上 您可以进入 熄灯模式 该模式会将其变暗并仅显示按钮使用以下代码的点 ref View v findViewById R id view
  • 如何在 SQL 语句中组合 AND 和 OR

    我有这样的SQL语句 SELECT FROM table WHERE type 3 OR type 5 OR type 4 and table deleted 1 我读过可以使用括号来完成此操作 但我想知道这是否有效 SELECT FROM
  • 从不区分大小写的数组中删除重复值的最佳解决方案[重复]

    这个问题在这里已经有答案了 我找到了一些解决方案 但我无法决定使用哪一个 使用 php 的最紧凑 最有效的解决方案是什么array unique 函数在不区分大小写的数组上 Example input array green Green b
  • 如何在 Meteor 中存储日期和时间以进行范围查询?

    我的应用程序需要创建在浏览器中的 3 个不同时区中显示 startDate 的对象 日期还必须包括确切的时间 日期的存储方式应允许查询 提供 X 和 Y 之间的所有日期 并将其解析为 3 个时区 我的问题是我应该如何最好地保存 并随后检索
  • 修复 GCC 的 #includes <> (Code::Blocks)

    我正在使用一些为不同编译器 链接器编写的代码 它包括如下文件 include
  • 将图像从加载项导入图像管理器

    我们通过插件在 EA 中自动创建需求元素 但问题是我们无法将图像从目录导入到图像管理器并将超链接添加到需求元素注释 那么 企业架构师是否提供了任何API来将图像从目录导入到图像管理器并将超链接添加到需求元素注释中 EA 将图像存储在t im
  • Android 按钮有两个功能

    我需要一个具有两个功能的按钮 如果我点击它一次 它就会转到下一页 如果我按住该按钮 它将允许我编辑按钮上的文本 点击该按钮后可以转到下一页 但是如何实现第二个功能 该功能允许我在按住按钮时更改文本 有人知道吗 java代码 public c
  • Google Datastore 跨区域复制

    我们有一个在美国和欧盟托管的应用程序 为了获得出色的性能 我们将在两个位置托管一个数据存储实例 现在我们的问题是如何将数据从美国数据存储复制到欧盟数据存储 或者从技术角度来看 我们将数据存储在哪里并不重要 目前还没有多位置 GAE 应用程序
  • 如何在子视图中使用addChildViewController

    我想用addChildViewController in View 子视图数组的一个视图 但我不知道这一点 这是我的代码 for UIView subview in self view subviews if subview tag 1 C
  • 是什么原因导致此错误“无法写入应用程序 file.ini”

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