我在公用桌面上使用SHGetFileInfo和公用桌面上的文件时遇到问题。我将重点介绍实际的桌面文件夹(CSIDL\u COMMON\u 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填充的路径可以很好地工作