SHGetFileInfo на общедоступном рабочем столе - PullRequest
0 голосов
/ 13 мая 2009

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

1 Ответ

1 голос
/ 08 февраля 2010

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

CoInitialize(0);
return_value = SHGetFileInfoW(path, attributes, &info, sizeof(SHFILEINFOW), flags);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...