【发布时间】:2017-07-16 12:36:17
【问题描述】:
我正在尝试使用SHGetFileInfo 来获取文件和文件夹的图标。我注意到它在一种情况下不起作用:我的用户配置文件文件夹中的 OneDrive 文件夹。在这种情况下,对 SHGetFileInfo 的调用成功,但我得到了可执行文件的默认图标:
这是我调用函数的方式:
HIMAGELIST imageList;
SHFILEINFO shfi;
// Get the path to the OneDrive folder
LPTSTR src = _T("%USERPROFILE%\\OneDrive");
TCHAR dest[MAX_PATH];
ExpandEnvironmentStrings(src, dest, MAX_PATH);
// Load the image from the OneDrive folder
ZeroMemory(&shfi, sizeof(shfi));
imageList = (HIMAGELIST)SHGetFileInfo(
dest,
FILE_ATTRIBUTE_NORMAL,
&shfi,
sizeof(shfi),
SHGFI_ICON | SHGFI_SYSICONINDEX);
这是我绘制图标的方式:
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
ImageList_Draw(imageList, shfi.iIcon, hdc, 0, 0, ILD_NORMAL);
EndPaint(hwnd, &ps);
}
break;
我在 pastebin 上为该应用制作了一个简短的独立示例:http://pastebin.com/bdTvEQT5
在这个简短的独立示例中,为简洁起见,我省略了任何错误检查代码。此外,出于示例的目的,我已经对文件夹的位置进行了硬编码。在我的真实应用程序中,我正在枚举文件系统中的文件夹,这就是我获取 OneDrive 文件夹位置的方式。图标提取代码需要适用于任何枚举的文件夹。
我做错了什么?
【问题讨论】:
-
您传递了(错误的)
FILE_ATTRIBUTE_NORMAL标志,但很幸运忘记设置SHGFI_USEFILEATTRIBUTES标志,因此它被忽略了。 OneDrive 文件夹不是文件。您需要返回文档。 -
你不检查返回值所以不知道API调用是否成功
-
请不要在外部网站上托管您的代码。它属于复制/粘贴在实际问题中。
-
@IInspectable 我知道
FILE_ATTRIBUTE_NORMAL会被忽略,但我不知道该传递什么。我没有忘记使用SHGFI_USEFILEATTRIBUTES,我故意省略了它。如果您知道如何获取 OneDrive 文件夹的图标,请添加答案,我将非常乐意接受。我确实阅读了文档,如果您知道那是什么,请指出我错过的具体内容。 -
@RemyLebeau 代码的相关部分嵌入在这个问题中。我认为整个示例太大而无法放入问题中,因为我不希望问题因为太大而无法阅读而被忽略。