# Icons auslesen und wiedergeben



## Xervek (17. Februar 2006)

Hallo,

nach Suche im Forum habe ich nicht explizit das gefunden, was ich gern hätte. Und zwar möchte ich, das Icon aus einer Datei auslesen. Beispielweise von der WinAmp.exe. Sicher kennt es jeder, daher nehme ich als Beispiel die WinAmp.exe. Dieses Icon möchte ich nun in einem Array speichern (von miraus auch erst einmal nur eine Variable) und anschließend an x-beliebiger Stelle in meinem Programm benutzen.

Kann mir jemand helfen wie soetwas geht?

Liebe Grüße


----------



## Shakie (18. Februar 2006)

Suche das nächste mal nicht nur im Forum, sondern im ganzen Internet:
Api ExtractIconEx
http://www.aboutvb.de/khw/artikel/khwiconfromfiledialog.htm


----------



## Xervek (28. Februar 2006)

Hallo,

hatte jetzt endlich auch die Möglichkeit mich darum zu kümmern. Leider ist es mir damit augenscheinlich nicht möglich explizit ein Icon, welches Windows für eine Datei nutz, zu nutzen. So wie ich es gesagt habe geht das leider nicht. Wenn ich den Pfad zur "WinAmp.exe" angebe bekomme ich zwar keine Meldung mehr wie "Es ist kein Icon vorhanden" allerdings wird mir das Icon welches Windows für WinAmp benutzt auch nicht wiedergegeben.

Mache ich irgendwas falsch?


----------



## Shakie (28. Februar 2006)

Man müsste halt wissen, nach welchem Prinzip Windows das Icon aus einer Exe-Datei aussucht, wenn in der Exe-Datei mehrere Icons drin sind. Vermutlich wird immer das aller erste Icon verwendet.
Und mit der API ExtractIconEx kannst du dir jedes beliebige Icon aus einer Datei ausgeben lassen. Allerdings musst du dich entscheiden, ob du das kleine oder große Icon haben willst. Denn wie du vielleicht schon bemerkt hast wird im Windows Explorer ein unterschiedliches Icon angezeigt, je nach dem ob du im Menü "Ansicht" "Details" oder beispielsweise "Miniaturansicht" ausgewählt hast.
Die Icons unterscheiden sich bei den meisten Exe-Dateien darin, dass die Auflösung einfach anders ist, deswegen ja auch "kleine" oder "große" Icons.


----------



## Xervek (28. Februar 2006)

Hallo,

ich brauche die kleinen Icons. Ich habe mir jetzt angeschaut was du mir gezeigt hast, habe den Code auch in ein Test-Projekt geknallt, folgendermaßen


```
Private Declare Function ExtractIconEx Lib "shell32.dll" Alias "ExtractIconExA" _
  (ByVal lpszFile As String, ByVal nIconIndex As Long, phiconLarge As Long, _
  phiconSmall As Long, ByVal nIcons As Long) As Long
Private Declare Function DrawIconEx Lib "user32.dll" (ByVal hDC As Long, ByVal _
  xLeft As Long, ByVal yTop As Long, ByVal hIcon As Long, ByVal cxWidth As Long, _
  ByVal cyWidth As Long, ByVal istepIfAniCur As Long, ByVal hbrFlickerFreeDraw As _
  Long, ByVal diFlags As Long) As Long
Private Declare Function DestroyIcon Lib "user32.dll" (ByVal hIcon As Long) As Long

Private Const DI_COMPAT = &H4 ' benutzt das als Standard festgelegte benutzerdefinierte Bild
Private Const DI_DEFAULTSIZE = &H8 ' zeichnet das Icon/Cursor mit der Standardgröße
Private Const DI_IMAGE = &H2 ' zeichnet nur die Bilddaten des Icons/Cursors
Private Const DI_MASK = &H1 ' zeichnet nur die Maske des Icons/Cursors
Private Const DI_NORMAL = &H3 ' zeichnet Maske und Bilddaten

Private hSmallIcons() As Long, hLargeIcons() As Long

Private Sub Form_Load()
  Dim RetVal As Long, IconNum As Long

  ' Anzahl Icons in der Datei ermitteln
  IconNum = ExtractIconEx("F:\Wolfenstein - Enemy Territory\ET.exe", -1, 0&, 0&, 0&)
  If IconNum = 0 Then
    MsgBox "Diese Datei hat keine Icons"
    Exit Sub
  End If

  ' Scrollbalken einrichten
  HScroll1.Max = IconNum - 1

  ' Alle Icons der Datei in Arrays speichern
  ReDim hSmallIcons(IconNum - 1)
  ReDim hLargeIcons(IconNum - 1)
  RetVal = ExtractIconEx("F:\Wolfenstein - Enemy Territory\ET.exe", 0&, hLargeIcons(0), _
  hSmallIcons(0), IconNum)
End Sub


' beim Scrollen die Icons auf die Form zeichnen
Private Sub HScroll1_Change()
  Me.Cls
  RetVal = DrawIconEx(Me.hDC, 5, 5, hLargeIcons(HScroll1.Value), 0&, 0&, 0&, 0&, DI_NORMAL)
  DrawIconEx Me.hDC, 5, 40, hSmallIcons(HScroll1.Value), 0&, 0&, 0&, 0&, DI_NORMAL
  Me.Refresh
End Sub


Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  On Error Resume Next

  'vVor dem Beenden Icons zerstören und Ressourcen wieder freigeben
  For i = 0 To UBound(hSmallIcons)
    DestroyIcon hSmallIcons(i)
    DestroyIcon hLargeIcons(i)
  Next i
End Sub
```

Dazu folgendes Modul


```
Declare Function ExtractIconEx Lib "shell32.dll" Alias "ExtractIconExA" (ByVal _
  lpszFile As String, ByVal nIconIndex As Long, phiconLarge As Long, _
  hiconSmall As Long, ByVal nIcons As Long) As Long
```

Das Problem ist nur, ich bekomme nirgends das Icon angezeigt und der Pfad is 100%ig korrekt


----------



## Shakie (1. März 2006)

Ich denke das Problem liegt in dieser Zeile, kann da aber auch nur raten:

```
DrawIconEx Me.hDC, 5, 40, hSmallIcons(HScroll1.Value), 0&, 0&, 0&, 0&, DI_NORMAL
```
Vermutlich malt die API DrawIconEx das Icon schon richtig auf die Form, aber die Form löscht das Icon danach wieder. Stell die Eigenschaft "AutoRedraw" der Form mal auf "TRUE", vielleicht bleibt das Icon dann sichtbar.


----------



## Xervek (1. März 2006)

Hallo,

funktioniert ebenfalls nicht. Habe versucht es in einem Label wiederzugeben, funktioniert nicht, habe versucht es in ner Pic-Box wiederzugeben funktioniert nicht.

Nehme ich eine Datei die keine Icons hat bekomme ich die angegebene Meldung 
"Diese Datei hat keine Icons"

Irgendwie scheint es zu funktionieren, nur gibt mir das Programm das Icon nicht aus.

Noch irgendwelche anderen Ideen?


----------

