Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2021, 19:28   #1
Cepguo
Пользователь
 
Регистрация: 03.04.2015
Сообщений: 31
По умолчанию GetKnownFolderPath(KNOWNFOLDERID)

Столкнулся с тем, что функция SHGetKnownFolderPath даёт ошибку для виртуальных имён типа FOLDERID_ComputerFolder.
В результате родил функцию GetKnownFolderPath(KNOWNFOLDERID FolderID):
Код:
String _fastcall GetKnownFolderPath(KNOWNFOLDERID FolderID)
{
  wchar_t Path[4096] = {};
  LPWSTR ptrPath;
  PIDLIST_ABSOLUTE ptrIDList = NULL;
  IShellItem *ptrShellItem = NULL;
  try
  { HRESULT OK = SHGetKnownFolderPath(FolderID,0,0,&ptrPath);
    if(OK==S_OK)
    { wcscpy(Path,ptrPath);
      return Path;
    }
    OK = SHGetKnownFolderIDList(FolderID,0,NULL,&ptrIDList);
    if(OK!=S_OK)
    { return "";
    }
    _GUID GuID = {0x43826D1E,0xE718,0x42EE,0xBC,0x55,0xA1,0xE2,0x61,0xC3,0x7B,0xFE};
    REFIID refIID = GuID;
    PCIDLIST_ABSOLUTE pIDList = ptrIDList;
    OK = SHCreateItemFromIDList(pIDList,refIID,(void**)&ptrShellItem);
    if(OK!=S_OK)
    { return "";
    }
    OK = ptrShellItem->GetDisplayName(SIGDN_NORMALDISPLAY,&ptrPath);
    if(OK==S_OK)
    { wcscpy(Path,ptrPath);
    }
  }
   __finally
  {
    if(ptrPath) CoTaskMemFree(ptrPath);
    if(ptrIDList) ILFree(ptrIDList);
    if(ptrShellItem) ptrShellItem->Release();
  }
  return Path;
}
Для проверки:
Код:
String Path = GetKnownFolderPath(FOLDERID_ComputerFolder); // имя каталога ComputerFolder
Писал на cpp_билдере, пусть модератор перенесёт тему в нужный раздел.
Cepguo вне форума Ответить с цитированием
Старый 04.05.2021, 07:09   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от Cepguo Посмотреть сообщение
Столкнулся с тем, что функция SHGetKnownFolderPath даёт ошибку для виртуальных имён типа FOLDERID_ComputerFolder.
О чем, кстати, прямым текстом написано в документации.
waleri вне форума Ответить с цитированием
Старый 04.05.2021, 09:45   #3
Cepguo
Пользователь
 
Регистрация: 03.04.2015
Сообщений: 31
По умолчанию

Но там не пишут, как решить эту проблему ...
Cepguo вне форума Ответить с цитированием
Старый 08.05.2021, 01:03   #4
Cepguo
Пользователь
 
Регистрация: 03.04.2015
Сообщений: 31
По умолчанию

исправил ошибку с FOLDERID_ControlPanelFolder:
Код:
String _fastcall GetKnownFolderPath(KNOWNFOLDERID FolderID)
{
  wchar_t Path[4096] = {};
  LPWSTR ptrPath = NULL;
  PIDLIST_ABSOLUTE ptrIDList = NULL;
  IShellItem *ptrShellItem = NULL;
  try
  { HRESULT OK;
    if(FolderID==FOLDERID_Desktop)
    { OK = E_FAIL;
    }
    else
    { OK = SHGetKnownFolderPath(FolderID,0,NULL,&ptrPath);
    }
    if(OK==S_OK)
    { wcscpy(Path,ptrPath);
      return Path;
    }
    OK = SHGetKnownFolderIDList(FolderID,0,NULL,&ptrIDList);
    if(OK!=S_OK) return "";
    SIGDN SigDN;
    if(FolderID==FOLDERID_ControlPanelFolder)
    { SigDN = SIGDN_DESKTOPABSOLUTEEDITING;
    }
    else SigDN = SIGDN_NORMALDISPLAY;
    OK = SHGetNameFromIDList(ptrIDList,SigDN,&ptrPath);
    if(OK==S_OK) 
    { if(FolderID==FOLDERID_ControlPanelFolder) 
      { LPWSTR ptrStr = wcschr(ptrPath,'\\');
        int N;
        if(ptrStr) N = ptrStr-ptrPath;
        else N = wcslen(ptrPath);
        wcsncpy(Path,ptrPath,N);
      }
      else wcscpy(Path,ptrPath);
    }
    return Path;
  }
   __finally
  {
    if(ptrPath) CoTaskMemFree(ptrPath);
    if(ptrIDList) ILFree(ptrIDList);
    if(ptrShellItem) ptrShellItem->Release();
  }
  return Path;
}
Cepguo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск