Ich versuche, SHGetFileInfo
zu verwenden, um das Symbol für Dateien und Ordner zu erhalten. Ich habe festgestellt, dass es in einem Fall nicht funktioniert: der OneDrive-Ordner, der sich in meinem Benutzerprofilordner befindet. In diesem Fall ist der Aufruf erfolgreich zu SHGetFileInfo, aber ich habe das Standardsymbol für eine ausführbare Datei:SHGetFileInfo gibt das falsche Symbol für den OneDrive-Ordner zurück
Hier ist, wie nenne ich die Funktion:
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);
Und hier ist, wie ich bin zeichnen Sie das Symbol: made
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
ImageList_Draw(imageList, shfi.iIcon, hdc, 0, 0, ILD_NORMAL);
EndPaint(hwnd, &ps);
}
break;
ich ein kurzes umluftunabhängigem Beispiel für die Anwendung auf Pastebin: http://pastebin.com/bdTvEQT5
In diesem kurzen, in sich geschlossenen Beispiel habe ich der Kürze wegen keinen Fehlerüberprüfungscode eingegeben. Außerdem habe ich den Speicherort des Ordners für das Beispiel fest codiert. In meiner realen App zähle ich die Ordner im Dateisystem auf und erhalte so den Speicherort des OneDrive-Ordners. Der Symbolextraktionscode muss mit jedem aufgelisteten Ordner funktionieren.
Was mache ich falsch?
Sie übergeben das (falsche) 'FILE_ATTRIBUTE_NORMAL'-Flag, haben aber das Glück, das' SHGFI_USEFILEATTRIBUTES'-Flag zu setzen, so dass es ignoriert wird. Der Ordner * OneDrive * ist keine Datei. Sie müssen zur Dokumentation zurückkehren. – IInspectable
Sie überprüfen keine Rückgabewerte, daher wissen Sie nicht, ob die API-Aufrufe erfolgreich sind oder nicht –
Bitte hosten Sie Ihren Code nicht auf einer externen Website. Es gehört in die eigentliche Frage kopiert/eingefügt. –