VB 5/6-Tipp 0027: Icon einer Dateiendung anzeigen
von ActiveVB
Beschreibung
Das Auslesen eines dateizugehörigen Icons kann recht einfach mit der Funktion SHGetFileInfo realisiert werden. Damit ist es zum Beispiel möglich Treeviews mit Symbolen zu füllen, ähnlich dem Windows-Explorer.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: | Download: |
'Dieser Quellcode stammt von http://www.activevb.de 'und kann frei verwendet werden. Für eventuelle Schäden 'wird nicht gehaftet. 'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. 'Ansonsten viel Spaß und Erfolg mit diesem Source! '------------- Anfang Projektdatei Project1.vbp ------------- '--------- Anfang Formular "form1" alias FORM1.FRM --------- ' Steuerelement: Dateiauswahlliste "File1" ' Steuerelement: Verzeichnisauswahlliste "Dir1" ' Steuerelement: Festplattenauswahlliste "Drive1" ' Steuerelement: Bildfeld-Steuerelement "Picture1" ' Steuerelement: Bildfeld-Steuerelement "Picture2" ' Steuerelement: Beschriftungsfeld "Label1" Option Explicit Private Declare Function OleCreatePictureIndirect Lib "oleaut32.dll" _ (pDicDesc As IconType, riid As CLSIdType, ByVal fown As Long, _ lpUnk As Object) As Long Private Declare Function SHGetFileInfo Lib "shell32.dll" Alias _ "SHGetFileInfoA" (ByVal pszPath As String, ByVal _ dwFileAttributes As Long, psfi As ShellFileInfoType, ByVal _ cbFileInfo As Long, ByVal uFlags As Long) As Long Const Large As Long = &H100& Const Small As Long = &H101& Const MAXPATH As Long = 260& Private Type IconType cbSize As Long picType As PictureTypeConstants hIcon As Long End Type Private Type CLSIdType id(16) As Byte End Type Private Type ShellFileInfoType hIcon As Long iIcon As Long dwAttributes As Long szDisplayName As String * MAXPATH szTypeName As String * 80 End Type Private Function LoadIcon(Size As Long) As IPictureDisp Dim Result As Long Dim File As String, Slash As String Dim Unknown As IUnknown Dim Icon As IconType Dim CLSID As CLSIdType Dim ShellInfo As ShellFileInfoType If Right$(File1.Path, 1) <> "\" Then Slash = "\" File = File1.Path & Slash & File1.FileName Call SHGetFileInfo(File, 0, ShellInfo, Len(ShellInfo), Size) Icon.cbSize = Len(Icon) Icon.picType = vbPicTypeIcon Icon.hIcon = ShellInfo.hIcon CLSID.id(8) = &HC0 CLSID.id(15) = &H46 Result = OleCreatePictureIndirect(Icon, CLSID, 1, Unknown) Set LoadIcon = Unknown End Function Private Sub Dir1_Change() File1.Path = Dir1.Path End Sub Private Sub Drive1_Change() Dir1.Path = Drive1.Drive End Sub Private Sub File1_Click() Picture1.Picture = LoadIcon(Large) Picture2.Picture = LoadIcon(Small) End Sub Private Sub Form_Load() If File1.ListCount <> -1 Then File1.ListIndex = 0 End Sub '---------- Ende Formular "form1" alias FORM1.FRM ---------- '-------------- Ende Projektdatei Project1.vbp --------------
Tipp-Kompatibilität:
Windows/VB-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 9 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von Verzweifelter am 29.01.2011 um 13:14
Bis hierher ist das Okay aber was mach ich, wenn ich die Icons von Desktop, Arbeitsplatz oder Eigene Dateien auslesen will?
Kommentar von Hardwarehunger am 25.01.2009 um 10:21
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.
Kommentar von McZosch am 07.06.2005 um 16:06
Folgender Code ermittelt das Icon in der gewünschten Größe und lässt SHGetFileInfo annehmen, das die Datei existiert.
So lassen sich für nicht existente Dateien ohne "temporäre Datei"-Frickel-Code die Icons ermitteln.
Const SHGFI_USEFILEATTRIBUTES As Long = &H10
Const FILE_ATTRIBUTE_NORMAL As Long = &H80
Call SHGetFileInfo(FileOrDirectoryOrDrive, FILE_ATTRIBUTE_NORMAL, ShellInfo, Len(ShellInfo), SHGFI_USEFILEATTRIBUTES Or Size)
Kommentar von VB Newbie am 21.11.2004 um 21:44
An alle die nur die Endung eingeben wollen um das entsprechende Icon zu bekommen:
Private Function LoadIcon(Size As Long, Endung As String) As IPictureDisp
Dim Result As Long
Dim File As String, Slash As String
Dim Unknown As IUnknown
Dim Icon As IconType
Dim CLSID As CLSIdType
Dim ShellInfo As ShellFileInfoType
Dim FN As Integer
If Right$(App.Path, 1) <> "\" Then Slash = "\"
If Left(Endung, 1) = "." Then
File = App.Path & Slash & "TEST" & Endung
Else
File = App.Path & Slash & "TEST." & Endung
End If
FN = FreeFile
Open File For Output As #FN
Print #FN, "TEST"
Close #FN
Call SHGetFileInfo(File, 0, ShellInfo, Len(ShellInfo), Size)
Icon.cbSize = Len(Icon)
Icon.picType = vbPicTypeIcon
Icon.hIcon = ShellInfo.hIcon
CLSID.id(8) = &HC0
CLSID.id(15) = &H46
Result = OleCreatePictureIndirect(Icon, CLSID, 1, Unknown)
Set LoadIcon = Unknown
Kill File
End Function
Der macht hier halt einfach ne neue Datei mit der Endung, guckt nach was die fürn Icon hat und löscht sie dann wieder!
Kommentar von pfORchT am 22.08.2004 um 22:04
So viel ich aus dem Quelltext lesen kann, funktioniert es nur bei existierenden Dateien.
Wäre besser, wenn man einfach nur die Endung wie "BMP" eingeben müsste.
Kommentar von ~Sammy~ am 19.04.2004 um 10:51
Also bei mir gehts einwandfrei!
Aber Achtung wenn der Path nicht existiert kommt die Meldung: "ungültiges Bild"
Aber wie kann ich Icons in der größe 48 x 48 Auslesen?
Habe Windows XP
Kommentar von Ebo am 27.10.2003 um 08:31
Funktioniert nicht. Die Loadicon-funktion gibt ein ungültiges Bild zurück.
Kommentar von S-A-M-M am 05.07.2002 um 08:33
Schwer verbesserungsbeduerftig
der sagt unter 2000 ungültiges Bild bei jeder zweiten Datei.
Das funzt nicht.
Kommentar von Torsten am 08.03.2002 um 12:11
Ich habe mal eine Frage:
Ich würde gerne das Icon, das ausgelesen wurde in ein Outlook-Formular einbinden. Aber er meldet mir dann immer wieder ein Automatisierungsfehler. Was mache ich falsch?