2

我有一个 32 位 Windows 旧应用程序(使用 C/Win32 源代码),它在可执行文件所在的同一文件夹中创建其数据文件。

由于该应用程序没有安装程序,并且用户可以将可执行文件放在他/她想要的任何位置,因此该应用程序有一个对话框来通知用户其数据所在的位置。

但是在 Microsoft Vista/Seven 下,如果用户将应用程序放在 Program Files 或任何其他受系统保护的文件夹中,则数据文件会被虚拟化并移动到虚拟存储中。

如果在 Vista/Seven 下,我仍然想通知用户数据文件所在的位置:(不阻止清单文件中的虚拟化)

  1. 我如何(以编程方式)知道数据文件是否已虚拟化?或者如果可执行文件所在的文件夹意味着数据文件将被虚拟化?

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

我发现以下问题与我要问的问题非常接近,但它没有显示知道何时对文件进行虚拟化以及在何处进行虚拟化的解决方案(如果有)。

如何检测到 Windows VirtualStore 的文件重定向?

4

1 回答 1

3

虚拟化对应用程序是透明的。知道它是否被虚拟化的唯一方法是询问操作系统,根据您链接到的问题中的答案(GetTokenInformation()TokenVirtualizationEnabled标志一起使用),但没有办法(据我所知)询问操作系统虚拟化的位置项目实际上是存储的,因为它可能与一个操作系统版本不同。您必须进行一些研究,然后对您的应用在运行时检测到的每个给定操作系统的路径进行硬编码。

如果您要更新代码以检测虚拟化,那么您最好更新代码以更好地使用 UAC。停止将文件存储在不属于它们的位置,并开始将它们存储在 Microsoft 希望您存储它们的位置。在这种情况下,改为在用户的个人资料中。使用SHGetFolderPath()或相关功能定位用户的CSIDL_LOCAL_APPDATA文件夹(或SHGetKnownFolderPath()在 Vista+ 上定位FOLDERID_LocalAppData文件夹),然后在其下创建一个子文件夹,供您的应用程序存储其数据文件。

于 2013-07-30T19:13:18.490 回答