如何获得(编程)Windows UAC虚拟文件的位置?

问题描述:

我有在将可执行文件是相同的文件夹中创建它的数据文件中的32位的Windows旧应用(与C/Win32的源)。如何获得(编程)Windows UAC虚拟文件的位置?

因为应用程序没有安装程序,用户可以将的地方,他/她想要的应用程序有一个对话框,告知哪里它的数据是位于用户的可执行文件。

但在微软Vista /七,如果用户将在Program Files或其他任何系统保护文件夹中的数据文件的应用程序虚拟化获取并移动到虚拟商店。

如果在Vista /七,我还是想告诉在数据文件所在的用户:如果 (不妨碍在清单文件虚拟化)

  1. 我怎么能知道(编程)数据文件是虚拟化的?或者,如果可执行文件所在的文件夹意味着数据文件将被虚拟化?

  2. 假设我知道数据文件是虚拟化的,我怎么能知道(编程)的虚拟文件夹的位置,以显示它的信息对话框?

我发现以下问题非常接近,我要问,但它并不显示在虚拟化正在发生一个文件知道的解决方案(如果有的话),并在它被虚拟化。

How to detect file redirection to the Windows VirtualStore?

虚拟化是透明的应用程序。知道它是否是被虚拟化的唯一方法是问OS,每个答案在您链接到(使用GetTokenInformation()TokenVirtualizationEnabled标志)的问题,但也没办法(我知道的)问OS其中虚拟化项目实际上被存储,因为它可能不同于一个OS版本到下一个。你将不得不做一些研究,然后硬编码你的应用程序在运行时检测到的每个给定操作系统的路径。

如果你要更新您的代码来检测虚拟化,那么你最好更新代码与UAC发挥更好的代替。停止将文件存储在不属于的地方,然后开始将它们存储在Microsoft希望存储它们的地方。在这种情况下,请改为在用户的配置文件中。使用SHGetFolderPath()或相关的功能定位(在Vista +或SHGetKnownFolderPath()找到FOLDERID_LocalAppData文件夹)用户的CSIDL_LOCAL_APPDATA文件夹,然后创建它下方的子文件夹为您的应用程序存储在它的数据文件。