【问题标题】:Getting different value than the one in the inifile获得与 inifile 中不同的值
【发布时间】:2014-11-12 07:51:49
【问题描述】:

我在 windows 目录的 win.ini 文件中放置了一个自定义条目,在自定义 [Login] 部分下称为 LoginCount,并在每次加载主视图时递增它。在 Form Create 事件中,我访问 win.ini 并检查它的值,如果它达到 1000,我会显示一条消息。但是发生了一件非常奇怪的事情。达到 1000 后,我手动将其值设置回 0。但它仍然显示 1000。我检查了路径,以防应用程序引用系统中某处的其他 win.ini 文件,但它是 C:\Windows\win.ini .代码如下:

procedure TfMain.FormCreate(Sender: TObject);
  var
     winIni: TIniFile; 
     windir_buf: array [0 .. 144] of Char;
     WINDIR: string;
     loginCount: integer;
  begin
   GetWindowsDirectory(windir_buf, sizeof(windir_buf));
   WINDIR := StrPas(windir_buf) + '\';

   ShowMessage(WINDIR+'win.ini');//Shows C:\Windows\win.ini

   winIni := TIniFile.Create(WINDIR + 'Win.ini');
   loginCount := winIni.ReadInteger('Login', 'LoginCount', 1);
   ShowMessage(IntToStr(loginCount));//Shows 1000 although it's 0 in the actual file.
  end;

知道为什么吗?

【问题讨论】:

  • 除了问题,你为什么要用win.ini文件?普通用户不应该对 windows 目录有写权限。
  • Windows 3.1 结束了。是时候继续前进了。 20 年是时候继续前进了。
  • @SirRufo,你知道,这是一个由其他人编写的非常古老的应用程序。现在我需要解决那里的问题。我不想费心写新代码。

标签: file delphi ini


【解决方案1】:

这可能是由于文件系统虚拟化。您正在 Vista 或更高版本下运行虚拟化进程,并且没有 Windows 目录的写入权限。

调试这个没有意义。 Win.ini 文件已被弃用近 20 年。你应该:

  1. 添加清单以抑制虚拟化。
  2. 确保您在启用 UAC 的情况下以标准用户身份运行。
  3. 将文件存储到适当的文件夹中。在用户配置文件下是明显的地方。这使其成为每个用户的设置。对于系统范围的设置,您存储到 ProgramData 文件夹。

如果您根本无法停止使用 Win.ini,那么您仍然需要使用 requireAdministrator 选项添加清单。

如果您打算使用 Win.ini(我无法表达我多么厌恶您打算这样做的事实),那么您应该使用 GetProfileStringSetProfileString。由于文件是共享的,您需要使用同步该访问的功能来访问它。

【讨论】:

  • 那是不是应该重启电脑自己解决?
  • 我根本不会这么说
  • 你知道,我离开 Delphi 已经快十年了,我能理解有人仍然使用 ini 文件这一事实让你感到多么恼火。但突然间,我发现自己面临着一个需要我解决的奇怪问题。
  • 我不生气。我只是在做正确的事情上发表我的意见。我不喜欢使用 Win.ini,但我不觉得烦。我对ini文件没问题,但是win.ini不是普通的ini文件。
  • @MikeJM,在 ini 文件中没有什么烦人的,这是一种很好的格式,但是从一开始就在系统环境配置中隐藏一些特定于应用程序的东西是错误的。
猜你喜欢
  • 2017-12-12
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 2015-04-29
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多