我的应用程序是用C++ Builder for Win32编写的.我的代码使用SHGetSpecialFolderLocation()API来获取CSIDL_APPDATA和CSIDL_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)
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.
| 归档时间: |
|
| 查看次数: |
236 次 |
| 最近记录: |