在 Windows 7 中,使用 Windows 资源管理器,我通过重命名文件 C:\Program Files\Microsoft Visual Studio\VC98\ATL\Include\ATLCOM.H 保存了它的备份,然后我将一个稍有不同的新文件复制到位(作为同一目录中的 ATLCOM.H)。
然后我打开了 Microsoft Visual C++ 6.0 IDE,并编译了我的项目(依赖于 ATLCOM.H)。我注意到编译后的可执行文件的行为就像我没有进行任何更改一样。
因此(为了再次检查我是否确实进行了更改)我从 IDE 中打开了文件。我的更改不存在。但是如果我在其他编辑器中打开文件,则更改存在。总而言之,我尝试使用四个单独的程序打开文件;除了 VC++ 6.0,当文件在所有程序中打开时,我的更改都存在。此外,如果我从 VC++ 6.0 中对文件进行另一次更改并保存它,则从其他程序中查看时,文件的内容似乎不受影响,但是如果我关闭 VC++ 6.0 并重新打开它,我在 VC++ 6.0 中所做的更改仍然存在。因此它会被写入磁盘某处。
然后我发现,如果我通过“以管理员身份运行”启动 VC++ 6.0,文件的内容(在 VC++ 6.0 中)看起来与其他程序中的内容相同。如果我没有以“管理员身份”启动它,它们会有所不同。
我猜想可能是 Windows(或 IDE 本身)将两个独立的“真实”目录合并为一个虚拟目录?这与 Windows 可能将“C:\Users\Public\Documents”和“C:\Users\Bob\Documents”合并为从用户角度看似乎是单个目录的方式类似吗?而它究竟如何进行合并取决于我是否以管理员身份运行 IDE?
有人知道这是怎么回事吗?是否有一些目录可以通过 Windows 资源管理器(或 shell 提示符或其他方式)访问,这些目录将允许我真正看到两个实际文件,而不仅仅是看似合并的 C:\Program Files\Microsoft Visual Studio\VC98\ATL\Include?提前致谢。
答案1
您的问题是您使用的是 Visual C++ 6.0。该版本的 MSVC 很旧。您可能会遇到 Windows Vista 及更高版本中存在的虚拟存储功能问题。
以下是具体情况:
该程序可能试图将数据保存在 Program Files 下的自己的文件夹中,而不是您的用户配置文件文件夹中。在 Windows 7 中,对 Program Files 文件夹的写入会悄无声息地透明地重定向到您的用户配置文件目录中的虚拟存储文件夹。当您选择以管理员身份运行时,对 Program Files 的写入会成功,并且不会发生重定向。
请检查以下内容:
查看 C:\Users\\AppData\Local\VirtualStore。你看到下面有一个 WINDOWS 和一个 Program Files 文件夹吗?如果是,是否有与 VC6.0 相关的文件?如果是,那么这就是你遇到的情况。
您唯一的解决方案是始终以管理员身份运行或从不以管理员身份运行,以便行为始终保持一致。您还可以从本地组策略编辑器禁用 VirtualStore 功能(当您关闭 UAC 时,它不再像在 Windows Vista 中那样被禁用)。
或者,您可以升级到较新版本的 Visual C++(我强烈推荐这个版本,因为就像我说的,6.0 已经很古老了)。