0

我有一个GetPrivateProfileString从文件“.\abcd.ini”中读取的程序——即它将在当前目录中查找ini 文件。如果没有找到 ini 文件,则在第三个参数中将默认值设置为GetPrivateProfileString.

我有一个将程序安装到c:\program files (x86)\abcd\client目录的安装程序。

最初,安装程序还在同一目录中安装了一个带有特定配置文件字符串键/值对的 abcd.ini 文件。发布后,我将安装程序更改为不安装任何 ini 文件。

然而,程序继续从我提供的旧 ini 文件中获取值,即使该目录中不存在它。

在进行系统范围的搜索后,我发现了 abcd.ini 的副本c:\Users\myusername\AppData\Local\VirtualStore\Program Files (x86)\abcd\Client

一旦我删除它,程序就可以正常工作(好像没有 ini 文件一样)。

谷歌搜索似乎使用了虚拟存储,因为 myuser 没有 c:\program 文件(x86)的完全权限。但是,程序本身不会写入 ini 文件,它只会从中读取。

这真的是它应该的样子吗?为什么将ini文件复制到AppData&如果没有本地副本,为什么程序会从那里读取?

我在 Windows 10 64 位。

4

2 回答 2

2

诊断是 EXE 程序不包含声明自己与 UAC 兼容的清单。对于仍然使用 GetPrivateProfileString() 的应用程序来说并不罕见。

这真的是它应该的样子吗?

是的,这就是现代版本的 Windows(主要版本 >= 6,Vista 及更高版本)处理假定用户始终具有管理员权限的遗留程序的方式。将文件访问重定向到 VirtualStore 目录可确保缺少对 Program Files 目录的访问权限不会造成麻烦。

它只从中读取

操作系统没有时间机器来猜测您是否可以写入文件并且在之前的会话中这样做了。所以它必须首先检查 VirtualStore 目录。找到那个 .ini 文件。

同样重要的是不要假设是您的程序在该目录中获取了 .ini 文件。它可以由另一个古老的程序完成,比如文本编辑器。或您的程序的先前版本。或您使用的安装程序。

于 2017-08-07T22:20:55.443 回答
-2

是的,因为程序会崩溃,所以 Windows 将程序重定向到 VirtualStore 目录。

于 2017-08-07T21:02:53.960 回答