GetPrivateProfileString 和 AppData VirtualStore 目录

GetPrivateProfileString and AppData VirtualStore directory

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

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

最初,安装程序还在具有特定配置文件字符串 key/value 对的同一目录中安装了一个 abcd.ini 文件。 Post 那,我更改了安装程序以不安装任何 ini 文件。

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

在进行全系统搜索后,我在 c:\Users\myusername\AppData\Local\VirtualStore\Program Files (x86)\abcd\Client

中找到了一份 abcd.ini

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

Google 似乎使用了 virtualstore,因为 myuser 没有 c:\program files (x86) 的完全权限。但是,程序本身不会写入 ini 文件,它只会从中读取。

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

我在 Windows 10 64 位。

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

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

Is this actually how it's supposed to be?

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

it only reads from it

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

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