如何可靠地获取 XP 和 Vista 中的“快速启动”文件夹?
-
09-06-2019 - |
题
我们需要在 Vista 和 XP 下可靠地为所有用户和当前用户获取快速启动文件夹。我正在使用 C++ 进行开发,但这可能更像是一个常见的 Windows API 问题。
作为参考,以下是获取两个系统下的 Application Data 文件夹的代码:
HRESULT hres;
CString basePath;
hres = SHGetSpecialFolderPath(this->GetSafeHwnd(), basePath.GetBuffer(MAX_PATH), CSIDL_APPDATA, FALSE);
basePath.ReleaseBuffer();
我怀疑这只是知道微软使用哪个子文件夹的问题。
在 Windows XP 下,应用程序数据子文件夹为:
Microsoft\Internet Explorer\快速启动
在 Vista 下,子文件夹似乎已更改为:
漫游\Microsoft\Internet Explorer\快速启动
但我想确保这是确定正确位置的正确方法。
寻找 正确的 确定此位置的方法非常重要,因为当您进入国际安装等时,依赖硬编码的文件夹名称几乎总是会中断......事实上,该文件夹在 Vista 中被命名为“Roaming”,这让我想知道是否有一些与该文件夹相关的特殊处理(类似于 XP 下的“本地设置”文件夹)。
编辑:以下msdn文章: http://msdn.microsoft.com/en-us/library/bb762494.aspx 表明 CSIDL_APPDATA 具有 FOLDERID_RoamingAppData 的等效 ID,这似乎支持 StocksR 的断言,即 CSIDL_APPDATA 确实返回 C:\Users\xxxx\AppData oaming,因此应该可以使用 CSIDL_APPDATA 的相同相对路径来快速启动(\Microsoft\Internet Explorer\快速启动)。
因此以下算法对于每个 MS 都是正确的:
HRESULT hres;
CString basePath;
hres = SHGetSpecialFolderPath(this->GetSafeHwnd(), basePath.GetBuffer(MAX_PATH), CSIDL_APPDATA, FALSE);
basePath.ReleaseBuffer();
CString qlPath = basePath + "\\Microsoft\\Internet Explorer\\Quick Launch";
检查 hres 以确保对 SHGetSpecialFolderPath 的调用成功也是一个好主意。
解决方案
vista 上的 AppData 指的是 C:\Users\xxxx\AppData oaming,而不是它本身的 C:\Users\xxxx\AppData 文件夹。
还有这篇文章 http://www.microsoft.com/technet/scriptcenter/resources/qanda/sept05/hey0901.mspx 在 Microsoft 站点上意味着您只需使用相对于 appdata 文件夹的路径
其他提示
好问题!
不管你做什么, 不 屈服于诱惑 深入注册表 找到这个信息!
此外,我们必须抵制对某些路径进行硬编码的诱惑,即使是部分路径。如果我们获得特殊的 AppData 路径,然后只需在末尾附加一个字符串,则在文件夹名称本地化为该语言的非美国安装软件下,这可能会中断。例如。 GetSpecialFolderPath(APP_DATA) + "\\Fonts"
不适用于非英语版本的 Windows。
希望有人对您的问题有正确的答案;我自己也很好奇!