从虚拟化文件夹UAC获取配置文件

时间:2016-04-28 17:33:37

标签: windows winapi windows-vista uac

我继承了一个遗留应用程序,用于将其设置写入C:\Program Files\<Company>\<ProgramName>下的文件。

此应用程序在Windows Vista之前进行,因此不包含清单。因此,当安装在Windows Vista或更高版本上时,这些写入实际上将被重定向(虚拟化),并且设置文件将最终在其他位置 - 通常在C:\Users\<username>AppData\Local\VirtualStore\Program Files(x86)\...中(但如果我是正确的,这取决于Windows版本)。

现在我需要更新此遗留应用程序,并将包含清单。设置文件现在需要存储在其他位置,可能在%APPDATA%中。问题是,当更新&#39;版本安装在旧版本的顶部,如果能以某种方式找到以前的设置文件并将其复制到新位置,那就太好了。

因此,问题是:有没有办法以 虚拟化的应用程序以编程方式知道Windows最终会放置虚拟化文件的位置?

1 个答案:

答案 0 :(得分:2)

这取决于旧应用程序的安装位置。用户可能已安装在"c:\program files\...""c:\program files (x86)\"或其他某个位置。

您必须找到旧的安装路径并删除驱动器号。例如:"c:\Program Files\Company\Old App"变为"Program Files\Company\Old App"

接下来,附加到VirtualStore路径。

例如:

wchar_t *old_application_path = L"Program Files\\Company\\Old App Folder";
wchar_t path[300];

wchar_t *ptr;
if (S_OK == SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &ptr))
{
    wsprintf(path, L"%s\\VirtualStore\\%s", ptr, old_application_path);
    CoTaskMemFree(ptr);
}

请注意,此虚拟化仅适用于受保护的文件夹,例如"c:\Program Files",需要管理员访问才能写入数据。如果程序安装到不受保护的文件夹,例如"c:\my programs\",则没有虚拟化,程序可以直接写入该文件夹。