公共桌面上的SHGetFileInfo

时间:2009-05-13 09:17:30

标签: winapi icons

我在公共桌面上使用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上 - 在XP上使用SHGetFolderPathW填充的路径工作正常

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。它可以通过在程序启动时从OLE32.DLL调用CoInitialize函数来修复。

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