Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0027: Icon einer Dateiendung anzeigen

 von 

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:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

OleCreatePictureIndirect, SHGetFileInfoA (SHGetFileInfo)

Download:

Download des Beispielprojektes [2,5 KB]

'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-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

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?