Winapi 如何(以编程方式)获取Windows UAC虚拟化文件的位置?

Winapi 如何(以编程方式)获取Windows UAC虚拟化文件的位置?,winapi,windows-vista,uac,data-virtualization,Winapi,Windows Vista,Uac,Data Virtualization,我有一个32位的windows旧应用程序(带有C/Win32源代码),它在可执行文件所在的同一文件夹中创建数据文件 因为应用程序没有安装程序,用户可以将可执行文件放在他/她想要的任何地方,所以应用程序有一个对话框来通知用户其数据的位置 但在MicrosoftVista/Seven下,如果用户将应用程序放在程序文件或任何其他受系统保护的文件夹中,数据文件将被虚拟化并移动到虚拟存储中 如果在Vista/Seven下,我仍希望通知用户数据文件的位置: (不阻止清单文件中的虚拟化) 如何(通过编程)知道

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

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

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

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

  • 如何(通过编程)知道数据文件是否已虚拟化?或者,如果可执行文件所在的文件夹意味着数据文件将被虚拟化

  • 假设我知道数据文件是虚拟化的,我如何知道(以编程方式)虚拟文件夹的位置,以便在信息对话框中显示它

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


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

    如果您要更新代码以检测虚拟化,那么最好更新代码以更好地使用UAC。停止将文件存储在不属于它们的位置,并开始将它们存储在Microsoft希望您存储它们的位置。在这种情况下,改为在用户的配置文件中。使用
    SHGetFolderPath()
    或相关函数定位用户的
    CSIDL\u LOCAL\u APPDATA
    文件夹(或在Vista+上使用
    shGetKnowlderPath()
    定位
    FOLDERID\u LocalAppData
    文件夹),然后在其下创建一个子文件夹,以便应用程序在其中存储其数据文件