vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Top-Preis! AP-Access-Tools-CD Volume 1  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB & Windows API
ExtractIconEx - Rückgabewert 
Autor: mst547
Datum: 12.11.10 10:26

Hallo!

Ich versuche, Icons aus verschiedenen Dateien auszulesen mit Hilfe der API-Funktion ExtractIconEx. Diese rufe ich einmal auf, um die Anzahl der vorhandenen Icons zu bestimmen und ein weiteres Mal, um die Icons auszulesen:
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
 
Dim lngIcon32() As Long
Dim lngIcon16() As Long
 
Private Sub cmdLaden_Click()
Dim lngAnzahl As Long
Dim lngAnzahlGelesen As Long
 
'Anzahl der Icons auslesen
lngAnzahl = ExtractIconEx(txtDatei.Text, -1, ByVal 0, ByVal 0, 0)
lblAnzahl.Caption = Format(lngAnzahl) & " Icons"
 
If lngAnzahl > 0 Then
    'Icons auslesen
    ReDim lngIcon32(lngAnzahl - 1)
    ReDim lngIcon16(lngAnzahl - 1)
 
    lngAnzahlGelesen = ExtractIconEx(txtDatei.Text, 0, lngIcon32(0), lngIcon16( _
      0), lngAnzahl)
    lblAnzahl.Caption = lblAnzahl.Caption & " - " & Format(lngAnzahlGelesen) & _
    " Icons gelesen"
End If
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
Dim i As Integer
 
If Not Not lngIcon32 Then
    For i = 0 To UBound(lngIcon32)
        If lngIcon32(i) <> 0 Then DestroyIcon (lngIcon32(i))
        If lngIcon16(i) <> 0 Then DestroyIcon (lngIcon16(i))
    Next
End If
End Sub
Soweit funktioniert das alles auch ganz gut, nur bei EXE- und DLL-Dateien, die genau 1 Icon enthalten, tritt folgendes Problem auf: Obwohl der erste Aufruf von ExtractIconEx korrekterweise den Wert 1 zurückliefert (Anzahl der Icons), gibt der zweite Aufruf den Wert 2 zurück (was laut http://msdn.microsoft.com/en-us/library/ms648069(v=VS.85).aspx die Anzahl der gelesenen Icons ist), obwohl im Aufruf angegeben ist, dass nur 1 Icon gelesen werden soll.
Wie ist das möglich?

mfg mst547
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ExtractIconEx - Rückgabewert 
Autor: ModeratorMartoeng (Moderator)
Datum: 12.11.10 15:50

Hihi, das ist ein sehr schöner Denkfehler, danke für diese Frage.

In der Tat befindet sich in solchen Dateien nur eine Icon-Ressource. Wenn Du Deinen Code genau anschaust, siehst Du jedoch, dass Du sowohl die 16x16- als auch die 32x32-Version ausliest. Da hat die Funktion absolut korrekt gehandelt, wenn sie 2 zurückgibt. Wenn Du anstatt lngIcon16 einfach mal beim zweiten Aufruf ByVal 0 übergibst, dann wird die Funktion auch nur 1 zurückgeben.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ExtractIconEx - Rückgabewert 
Autor: mst547
Datum: 13.11.10 13:54

Danke für deine Antwort!

Daran habe ich zunächst auch schon gedacht. Bei DLLs, die mehr als 1 Icon enthalten, gibt die Funktion allerdings beide Male denselben Wert zurück. Da müsste dann ja auch beim zweiten Aufruf der doppelte Wert zurückgegeben werden, oder? Außerdem wird bei ico-Dateien beim zweiten Aufruf auch 1 zurückgegeben, obwohl auch ein 16x16- und ein 32x32-Icon gelesen werden.

Mittlerweile habe ich sogar eine DLL gefunden, bei der der erste Aufruf einen Wert von über 39000 liefert, der zweite Aufruf hingegen 0.

Weiß irgendjemand weitere Erklärungen für diese Phänomene?

mfg mst547
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ExtractIconEx - Rückgabewert 
Autor: ModeratorMartoeng (Moderator)
Datum: 13.11.10 14:50

Hmm, normal hätte das wohl so sein müssen, aber habe jetzt auch mal einige Sachen ausprobiert, da gibt's so einige komische Verhaltensweisen.
Du kannst ja hier mal nachschauen, man muss ja nicht über ExtractIcon gehen.
http://msdn.microsoft.com/en-us/library/ms997538.aspx

Was bastelst Du denn für ein Programm? Es gibt ja auch noch mehr Wege an Icons zu kommen.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ExtractIconEx - Rückgabewert 
Autor: mst547
Datum: 13.11.10 19:44

Naja, ich möchte dem Benutzer die Möglichkeit geben, Icons ins Programm zu laden und diese dann verschiedenen Einträgen zuzuordnen. Dabei soll sich das Programm so flexibel wie möglich verhalten, d. h. von so vielen Quellen wie möglich Icons importieren können. ExtractIconEx bietet sich halt an, weil die Funktion mit verschiedenen gebräuchlichen Icon-Datei-Formaten umgehen kann (ico, dll, exe) und in einem Rutsch alle Icons der Datei eingelesen werden können. Die Icons werden dann in einem Fenster angezeigt und der Benutzer kann entscheiden, welche davon er ins Programm importieren will.

Eine wirkliche Alternative zu ExtractIconEx habe ich dabei nicht gefunden.

mfg mst547
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel