SHGetFileInfo на общедоступном рабочем столе

У меня возникла проблема с использованием 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 работает нормально.


person laura    schedule 13.05.2009    source источник
comment
Попробуйте добавить к пути '\' в конце, чтобы SHGetFileInfo() точно знала, что это путь к папке, а не к файлу.   -  person Remy Lebeau    schedule 17.06.2009
comment
Вы можете использовать PIDL с файлами, кстати. Вызовите SHGetDesktopFolder(), чтобы получить интерфейс IShellFolder верхнего уровня для оболочки, затем передайте PIDL из SHGetSpecialFolderLocation() в его метод BindToObject(), чтобы получить интерфейс IShellFolder для папки, затем вызовите его метод EnumObjects(), чтобы получить IEnumIDList интерфейс, который даст вам относительные PIDL файлов и подпапок. Вам просто нужно будет преобразовать их в абсолютные PIDL при передаче их в SHGetFileInfo(), вот и все.   -  person Remy Lebeau    schedule 17.06.2009


Ответы (1)


У меня такая же проблема. Это можно исправить, вызвав функцию CoInitialize из OLE32.DLL при запуске программы.

CoInitialize(0);
return_value = SHGetFileInfoW(path, attributes, &info, sizeof(SHFILEINFOW), flags);
person Community    schedule 08.02.2010