【问题标题】:GetPrivateProfileString and AppData VirtualStore directoryGetPrivateProfileString 和 AppData VirtualStore 目录
【发布时间】:2017-08-01 10:00:33
【问题描述】:

我有一个程序从文件 ".\abcd.ini" 中读取 GetPrivateProfileString - 即它将在当前目录中查找 ini 文件。 如果没有找到ini文件,则在第三个参数中设置默认值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 文件 (x86) 没有完全权限。但是,程序本身不会写入 ini 文件,它只会从中读取。

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

我使用的是 Windows 10 64 位。

【问题讨论】:

标签: c windows winapi appdata virtualstore


【解决方案1】:

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

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

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

它只读取它

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 程序为什么会崩溃?
    猜你喜欢
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 2014-04-04
    • 2020-03-26
    • 1970-01-01
    • 2013-09-25
    相关资源
    最近更新 更多