У меня возникла проблема с использованием SHGetFileInfo на общедоступном рабочем столе и файлов на общедоступном рабочем столе. Я сосредоточусь на фактической папке рабочего стола (CSIDL_COMMON_DESKTOPDIRECTORY или обычно «C:\Users\Public\Desktop»). Кроме того, я начал наблюдать такое поведение только недавно, но я не могу точно определить изменение, которое сделало его неисправным. Фактический вызов ShGetFileInfo не изменился (насколько я могу судить).
Итак, у меня есть это (я пропустил промежуточные проверки ошибок, чтобы сократить - вызовы функций возвращаются с успехом):
SHFILEINFOW info;
uint32_t return_value = 0;
uint32_t flags = SHGFI_TYPENAME|SHGFI_ICON|SHGFI_SMALLICON|SHGFI_SYSICONINDEX;
uint32_t attributes = FILE_ATTRIBUTE_NORMAL;
wchar_t *path = L"C:\\Users\\Public\\Desktop";
return_value = SHGetFileInfoW(path, attributes, &info, sizeof(SHFILEINFOW), flags);
printf("[%ls] %u ", path, return_value);
Это возвращает 0 в качестве возвращаемого значения. Если я заполняю путь, используя:
SHGetFolderPathW(NULL, CSIDL_COMMON_DESKTOPDIRECTORY, NULL, 0, path)
Я получаю тот же результат. Но если я использую pidl, например:
LPITEMIDLIST pidl = NULL;
SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_DESKTOPDIRECTORY, &pidl);
return_value = SHGetFileInfoW((LPCWSTR) pidl, attributes, &info, sizeof(SHFILEINFOW), flags | SHGFI_PIDL);
Затем я получаю то, что и ожидал, дескриптор списка системных значков.
Я не могу сказать, что я делаю неправильно, и это происходит только в этой конкретной папке. На самом деле мне нужны значки для элементов внутри каталога, поэтому использование pidl сейчас не вариант. Любые идеи о том, каков ожидаемый способ получения значков с общего рабочего стола?
--
Я должен упомянуть, что такое поведение происходит в Windows Vista — использование пути, заполненного SHGetFolderPathW, в XP работает нормально.