Problem mit SHFILEINFO Funktion



  • Hallo,

    bin recht neu hier in dem Forum und möchte zuerst einmal alle Begrüßen 🙂

    Habe ein Problem mit der WINAPI-Funktion SHFILEINFO, bei der ich nicht weiterkomme.

    Und zwar habe ich folgende Funktion, zum auslesen des aktuellen Dateiicons, geschrieben:

    int	SetIcon()
    {
    
    	SHFILEINFO sfi;
    	ZeroMemory(&sfi, sizeof(SHFILEINFO));
    
    	SHGetFileInfo(
    		"Test.xls", 
    		FILE_ATTRIBUTE_NORMAL, 
    		&sfi, 
    		sizeof(sfi), 
    		SHGFI_USEFILEATTRIBUTES|SHGFI_ICON|SHGFI_SMALLICON);
    
    	if (sfi.hIcon)
    	{
    		return 1;
    	}
    
    	return -1;
    }
    

    Also im Beispiel habe ich einfach Test.xls als die jeweilige Datei eingefügt.

    Rufe ich nun die folgende Funktion z.B. 10.000 x auf können meine Fenster nicht mehr richtig angezeigt werden. Das Problem tritt hierbei jedoch nur bei den FLAGS: SHGFI_ICON|SHGFI_SMALLICON auf. Lasse ich diese weg funktioniert alles tadellos (aber dann habe ich ja keine icons...).

    Jemand eine Ahnung an was es liegen könnte?
    Gibt es eine andere Möglichkeit an die von Windows Standardmäßig angezeigten Icons zu kommen?

    Bin für jede Hilfe dankbar und hoffe das schon mal jemand das gleiche Problem hatte und mir weiterhelfen kann.

    Gruß
    Daniel



  • Aus der MSDN Library:

    If SHGetFileInfo returns an icon handle in the hIcon member of the SHFILEINFO structure pointed to by psfi, you are responsible for freeing it with DestroyIcon when you no longer need it.



  • Hi,

    danke für die schnelle Antwort.

    Wenn ich mit DestroyIcon meine Handles "aufräume" tritt der Fehler nicht mehr auf.
    Aber da ich eine Auflistung mit über 1000 Dateien anzeigen will, bräuchte ich über 1000 Handles.

    Bin noch recht neu in der WINAPI, bin also nicht ganz 100% vertraut damit wie man handles am besten einsetzt...



  • Hab mir deinen Code nicht genau angeschaut, aber vielleicht hilft dir das hier weiter?!



  • Ja, ist ein sehr guter Beitra. Danke.

    Falls noch weitere Probleme auftreten sollten, nachdem ich das Tutorial umgesetzt habe melde ich mich nochmals.
    Danke für eure Hilfe. 🙂


Anmelden zum Antworten