SHGetSpecialFolderLocation是否有新的替代品?

本垒

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

我在Microsoft日期为12/04/2018的网站上注意到它说:

[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;
  }
}
雷米·勒博

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\\";
}

在Vista中,CSIDL不赞成使用KNOWNFOLDERID不推荐使用上述功能,而推荐使用SHGetKnownFolderIDList()/IKnownFolder::GetIDList()SHGetKnownFolderPath()/ IKnownFolder::GetPath()

实际上,这文档1底部有所SHGetFolderLocation()说明

1:我想您没有向下滚动足够远才能看到它。

注意从Windows Vista开始,此功能仅是的包装SHGetKnownFolderIDListCSIDL值被转换到其相关的KNOWNFOLDERIDSHGetKnownFolderIDList被调用。新应用程序应使用已知的文件夹系统,而不是旧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);
    }
}

对于“我的文档”文件夹,使用FOLDERID_Documents

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章