当此应用程序向系统位置(如 %programfiles% 文件夹)写入内容时,Windows Vista 会将写入操作和读取操作重定向到用户配置文件文件夹 (%localappdata%\VirtualStore) 中的用户特定位置。默认情况下,此位置为 C:\Users\User_name\AppData\Local\VirtualStore\Program Files\Application_name。
注册表虚拟化的工作原理与之类似,但应用于 HKEY_LOCAL_MACHINE\SOFTWARE 子树下的注册表项。此子树下的注册表项和数据重定向到HKEY_CURRENT_USER\Software\Classes\VirtualStore子项。
有关更多信息,请访问下面的 Microsoft 网站:
-------------写文件到programfiles-------------------------------
一 不带manifest的 应用程序显示了文件重定向到VirtualStore文件夹。
二带manifest的 应用程序,从而使它支持UAC。文件没有被重定向,而是当对Program Files文件进行写入操作时将会被阻止并引起“拒绝访问”错误。
三 最后,您将对应用程序进行修改,即将文件存储到应用程序数据(ProgramData)文件夹,来解决这一问题。
总结,programfiles文件夹只有管理员权限可以写,我们应该使用SHGetKnownFolderPath函数获得将要写入的路径(FOLDERID_ProgramData:所有用户共享;FOLDERID_LocalAPPData:当前用户,FOLDERID_RoamingAPPData:当前用户)
如果SHGetKnownFolderPath不起作用,则使用环境变量%ALLUSERSPROFILE%,%LOCALAPPDATA%,%APPDATA%(这3个与上面提到的3个对应关系,而后两个在vista之后才有)
任务管理器可以查看虚拟化是否开启