Есть ли новая замена для SHGetSpecialFolderLocation? - PullRequest
0 голосов
/ 21 января 2019

Мое приложение написано на C ++ Builder для Win32. Мой код использует API SHGetSpecialFolderLocation() для получения путей CSIDL_APPDATA и CSIDL_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;
  }
}

1 Ответ

0 голосов
/ 21 января 2019

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...