我继承了一个遗留应用程序,用于将其设置写入C:\Program Files\<Company>\<ProgramName>
下的文件。
此应用程序在Windows Vista之前进行,因此不包含清单。因此,当安装在Windows Vista或更高版本上时,这些写入实际上将被重定向(虚拟化),并且设置文件将最终在其他位置 - 通常在C:\Users\<username>AppData\Local\VirtualStore\Program Files(x86)\...
中(但如果我是正确的,这取决于Windows版本)。
现在我需要更新此遗留应用程序,并将包含清单。设置文件现在需要存储在其他位置,可能在%APPDATA%中。问题是,当更新&#39;版本安装在旧版本的顶部,如果能以某种方式找到以前的设置文件并将其复制到新位置,那就太好了。
因此,问题是:有没有办法以 虚拟化的应用程序以编程方式知道Windows最终会放置虚拟化文件的位置?
答案 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\"
,则没有虚拟化,程序可以直接写入该文件夹。