是否有SHGetSpecialFolderLocation的新替代品?

hom*_*ase 7 c++ winapi

我的应用程序是用C++ Builder for Win32编写的.我的代码使用SHGetSpecialFolderLocation()API来获取CSIDL_APPDATACSIDL_MYDOCUMENTS路径.

我注意到微软在2014年4月12日的网站上说:

[SHGetSpecialFolderLocation不受支持,将来可能会被更改或不可用.相反,使用SHGetFolderLocation.]

然后SHGetFolderLocation它说:

弃用

获得这两条路径的当前方法是什么?

我目前的代码如下.

LPITEMIDLIST List = NULL;
wchar_t  wPath[MAX_PATH + 1];
UnicodeString S01, Fi;

if( !SHGetSpecialFolderLocation(0, CSIDL_APPDATA, &List) ){
  if( SHGetPathFromIDListW(List, wPath ) ){
    S01 = wPath;
    Fi = (S01+"\\my_files\\");
    Form1->MyRoamingPath_Mh = Fi;
  }
}
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 9

SHGetSpecialFolderLocation()最初是在Windws 95/NT4中引入的.它在Windows 2000/XP中被弃用SHGetFolderLocation()(它将文件夹位置作为一个返回IDLIST_ABSOLUTE)和SHGetFolderPath()(它将文件夹位置作为路径字符串返回).

因此,在您的示例中,您可以使用SHGetFolderPath():

#include <Shlobj.h>
#include <SysUtils.hpp>

wchar_t wPath[MAX_PATH + 1];

if (SHGetFolderPathW(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, wPath) == S_OK)
{
    Form1->MyRoamingPath_Mh = IncludeTrailingPathDelimiter(wPath) + L"my_files\\";
}
Run Code Online (Sandbox Code Playgroud)

在Vista中,使用CSIDL被弃用了KNOWNFOLDERID.上述函数已被弃用,分别支持SHGetKnownFolderIDList()/ IKnownFolder::GetIDList()SHGetKnownFolderPath()/ IKnownFolder::GetPath().

这是在实际陈述底部的的SHGetFolderLocation()文档1:

1:我猜你没有向下滚动到足以看到它.

注意从Windows Vista开始,此功能仅仅是一个包装器SHGetKnownFolderIDList.该CSIDL值将转换为其关联的KNOWNFOLDERID并被SHGetKnownFolderIDList调用.新应用程序应使用已知的文件夹系统而不是旧CSIDL系统,仅支持向后兼容性.

因此,在您的示例中,您现在可以使用SHGetKnownFolderPath():

#include <Shlobj.h>
#include <SysUtils.hpp>

PWSTR pwPath;

if (SHGetKnownFolderPath(FOLDERID_RoamingAppData, KF_FLAG_DEFAULT, NULL, &pwPath) == S_OK)
{
    try
    {
        Form1->MyRoamingPath_Mh = IncludeTrailingPathDelimiter(pwPath) + L"my_files\\";
    }
    __finally
    {
        CoTaskMemFree(pwPath);
    }
}
Run Code Online (Sandbox Code Playgroud)

对于"我的文档"文件夹,请使用FOLDERID_Documents.

  • @homebase 不是默认情况下,他们不会。默认情况下,“CSIDL_MYDOCUMENTS”和“FOLDERID_Documents”映射到用户的本地配置文件,始终如此。有一个专门用于 OneDrive 的新“KNOWNFOLDERID”:“FOLDERID_SkyDriveDocuments”。但是,已知文件夹位置可以重定向到新位置,并且如果您允许 OneDrive 客户端自动将文档保存到 OneDrive,则它会重定向“FOLDERID_Documents”。 (2认同)