GetPrivateProfileString和AppData VirtualStore目录

时间:2017-08-01 10:00:34

标签: c windows winapi appdata virtualstore

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

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

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

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

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

中找到了abcd.ini的副本

删除后,程序正常工作(好像没有ini文件)。

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

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

我在Windows 10 64位上。

2 个答案:

答案 0 :(得分:2)

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

  

这实际上是它应该是怎样的吗?

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

  

它只能从中读取

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

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

答案 1 :(得分:-2)

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