1

我们需要在 Vista 和 XP 下为 All 和 Current 用户可靠地获取 Quick Launch 文件夹。我正在用 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 中被命名为“漫游”,这让我想知道是否有是与该文件夹相关的一些特殊处理(类似于 XP 下的 Local Settings 文件夹)。

编辑:以下 msdn 文章: http: //msdn.microsoft.com/en-us/library/bb762494.aspx表明 CSIDL_APPDATA 具有 FOLDERID_RoamingAppData 的等效 ID,这似乎支持 StocksR 的断言,即 CSIDL_APPDATA 确实返回 C:\ Users\xxxx\AppData\Roaming,因此应该可以为 CSIDL_APPDATA 使用相同的相对路径来快速启动(\Microsoft\Internet Explorer\Quick Launch)。

因此,以下算法对于每个 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 的调用成功也是一个好主意。

4

2 回答 2

2

vista 上的 AppData 指的是 C:\Users\xxxx\AppData\Roaming 而不是 C:\Users\xxxx\AppData 文件夹,它是自己的。

此外,微软网站上的这篇文章http://www.microsoft.com/technet/scriptcenter/resources/qanda/sept05/hey0901.mspx暗示您只需使用相对于 appdata 文件夹的路径

于 2008-09-16T19:54:15.907 回答
1

好问题!

无论您做什么,都不要屈服于挖掘注册表以查找此信息的诱惑!

此外,我们必须抵制对某些路径进行硬编码的诱惑,即使是部分路径。如果我们获得特殊的 AppData 路径,然后只需在末尾附加一个字符串,这可能会在文件夹名称本地化为该语言的软件的非美国安装中中断。例如GetSpecialFolderPath(APP_DATA) + "\\Fonts"不能在非英语版本的 Windows 上工作。

希望有人能正确回答您的问题;我很想知道自己!

于 2008-09-16T20:02:28.290 回答