我在公共桌面上使用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填充的路径工作正常
答案 0 :(得分:1)
我遇到了同样的问题。它可以通过在程序启动时从OLE32.DLL调用CoInitialize函数来修复。
CoInitialize(0);
return_value = SHGetFileInfoW(path, attributes, &info, sizeof(SHFILEINFOW), flags);