我正在嘗試使用SHGetFileInfo
獲取文件和文件夾的圖標。我注意到它在一種情況下不起作用:位於我的用戶配置文件夾中的OneDrive文件夾。在這種情況下,調用的SHGetFileInfo成功,但我得到了默認圖標的可執行文件:SHGetFileInfo返回OneDrive文件夾的錯誤圖標
這裏是我如何調用該函數:
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);
這裏是怎麼了繪製的圖標:http://pastebin.com/bdTvEQT5
012:case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
ImageList_Draw(imageList, shfi.iIcon, hdc, 0, 0, ILD_NORMAL);
EndPaint(hwnd, &ps);
}
break;
我上引擎收錄做了簡短的自包含例如用於該應用
在這個簡短的獨立示例中,爲了簡潔,我省略了任何錯誤檢查代碼。另外,爲了示例的目的,我對文件夾的位置進行了硬編碼。在我的真實應用程序中,我列舉了文件系統中的文件夾,這就是我如何獲取OneDrive文件夾的位置。圖標提取代碼需要與枚舉的任何文件夾一起使用。
我在做什麼錯?
您正在傳遞錯誤的FILE_ATTRIBUTE_NORMAL標誌,但有幸忘記設置SHGFI_USEFILEATTRIBUTES標誌,因此將被忽略。 * OneDrive *文件夾不是文件。你需要回到文檔。 – IInspectable
您不檢查返回值,因此不知道API調用是否成功 –
請不要將您的代碼託管在外部站點上。它屬於複製/粘貼在實際問題中。 –