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()
соответственно.
Это фактически указано в нижней документации 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);
}
}
Для папки «Мои документы» используйте FOLDERID_Documents
.