Icon aus exe/dll extrahieren

  • Ich würde gerne Icons aus einer exe datei extrahieren und abspeichern, doch wie soll ich das machen?
    Um die Icons anzuzeigen habe ich schon tausend möglichkeiten gefunden, aber wie kann man sie rausladen?

    Hatte da an dllcall gedacht, z.B:
    DllCall("Shell32", "int", "ExtractIconEx", "str", $sFilename, "int", -1, "ptr", 0, "ptr", 0, "int", 1)

  • Ja, aber ich möchte gerne das mein program die bilder aus exe dateien bekommt.
    Das es programme dafür gibt hilft mir in diesem fall nicht weiter.

  • 8| 7325 Zeilen schwerer Code ohne Beschriftungen

    Da habe ich einfach keine chance was raus zu basteln :(

  • häh?
    Ich würde gerne alle Icons der Desktop Verknüpfungen als JPG Dateien in einem Ordner speichern und KEINE dll datei erstellen.

  • Ach so, als JPG / PNG, das ist einfacher ;)

    Spoiler anzeigen
    [autoit]

    #include<GDIplus.au3>
    Func _GDIPlus_BitmapCreateBitmapFromHICON($hIcon)
    ; Prog@ndy
    Local $result = DllCall($ghGDIPDLL, "int", "GdipCreateBitmapFromHICON", "ptr", $hIcon, "ptr*",0)
    If @error Then Return SetError(1,0,0)
    Return SetError($result[0], 1, $result[2])
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    $File = "C:\Dokumente und Einstellungen\All Users\Desktop\ScITE.lnk"

    [/autoit] [autoit][/autoit] [autoit]

    $ShortCut = FileGetShortcut($File)

    [/autoit] [autoit][/autoit] [autoit]

    $shIcon = DllStructCreate("ptr")
    $result = _WinAPI_ExtractIconEx($ShortCut[4], $ShortCut[5], DllStructGetPtr($shIcon), 0, 1)
    If $result Then
    $hIcon = DllStructGetData($shIcon,1)

    _GDIPlus_Startup()
    $hBitmap = _GDIPlus_BitmapCreateBitmapFromHICON($hIcon)
    _GDIPlus_ImageSaveToFile($hBitmap, @DesktopDir & "\Icontest.jpg")
    _GDIPlus_ImageSaveToFile($hBitmap, @DesktopDir & "\Icontest.png")
    _GDIPlus_ImageSaveToFile($hBitmap, @DesktopDir & "\Icontest.GIF")
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()


    _WinAPI_DestroyIcon($hIcon)
    EndIf

    [/autoit]
  • Ich würde gerne Icons aus einer exe datei extrahieren und abspeichern, doch wie soll ich das machen?
    Um die Icons anzuzeigen habe ich schon tausend möglichkeiten gefunden, aber wie kann man sie rausladen?

    Hatte da an dllcall gedacht, z.B:
    DllCall("Shell32", "int", "ExtractIconEx", "str", $sFilename, "int", -1, "ptr", 0, "ptr", 0, "int", 1)


    Die JPG-Datei habe ich wohl auch überlesen ? ;)

  • ja, anscheinend ;) (ich dachte das es einfacher ist erst das Icon zu bekommen und dann umzuwandeln)

    @progandy:
    _WinAPI_DestroyIcon($hIcon) verurschat bei mitr den Error: ungültiger Cursor Handle

    Doch auch wenn ich diese Funktion, die ja nur zum löschen ist, weglasse, funktioniert das Skript bei den meisten Verknüpfungen nicht. Ich denke das liegt daran das sich die icons in den exe dateien befinden auf die gezeigt wird und nicht in den Verknüpfungen selbst.

  • Habe jetzt die Lösung gefunden, es muss so lauten:

    [autoit]

    #include<GDIplus.au3>
    Func _GDIPlus_BitmapCreateBitmapFromHICON($hIcon)
    ; Prog@ndy
    Local $result = DllCall($ghGDIPDLL, "int", "GdipCreateBitmapFromHICON", "ptr", $hIcon, "ptr*",0)
    If @error Then Return SetError(1,0,0)
    Return SetError($result[0], 1, $result[2])
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    $File = "C:\Dokumente und Einstellungen\All Users\Desktop\ScITE.lnk"

    [/autoit][autoit][/autoit][autoit]

    $ShortCut = FileGetShortcut($File)

    [/autoit][autoit][/autoit][autoit]

    $shIcon = DllStructCreate("ptr")
    $result = _WinAPI_ExtractIconEx($ShortCut[0], $ShortCut[5], DllStructGetPtr($shIcon), 0, 1) ;<-----------$ShortCut[0] statt $ShortCut[4]
    If $result Then
    $hIcon = DllStructGetData($shIcon,1)

    _GDIPlus_Startup()
    $hBitmap = _GDIPlus_BitmapCreateBitmapFromHICON($hIcon)
    _GDIPlus_ImageSaveToFile($hBitmap, @DesktopDir & "\Icontest.jpg")
    _GDIPlus_ImageSaveToFile($hBitmap, @DesktopDir & "\Icontest.png")
    _GDIPlus_ImageSaveToFile($hBitmap, @DesktopDir & "\Icontest.GIF")
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()


    ;_WinAPI_DestroyIcon($hIcon)
    EndIf

    [/autoit]
  • ich würde das so prüfen, da das Icon nicht in der Exe sein muss:

    [autoit]

    $IconPfad = $ShortCut[4]
    If Not FileExists($ShortCut[4]) Then $IconPfad = $ShortCut[0]

    [/autoit]


    udn DestroyIcon sollte drin beliben, aber so:

    [autoit]

    If $hIcon Then _WinAPI_DestroyIcon($hIcon)

    [/autoit]
  • Ja, das Icon wird nicht angezeigt wenn es sich nicht in der exe befindet, aber das wird durch deine änderung nicht besser, denn der link verlink auf die exe und erst dort wird der pfad zur icon datei gefunden, und nicht im link....

  • Der Pfad zum Icon wird nicht in der Exe gefunden, sondern in der Verknüpfung. Deshalb kann man mit $array[4] (Icon File) ja auch die Icon-Datei auslesen.
    $array[0] ist der Pfad zur Exe, daher funktioniert das nur, wenn das icon direkt aus der Exe stammt.
    (Oder hast du Vista und da sind die beiden vertauscht?)

  • Du hast das ganze nicht verstanden:

    Verknüpfung -> Exe
    Exe -> Unterordner .ico datei

    Das heißt ich komme nur an das ico, wenn ich es aus dem Unterordner hole und in der Verknüpfung steht eben nur der link zur exe datei und nicht zum icon file.

  • Trotzdem mus sich der Pfad doch aus der Verknüpfung auslesen lassen??? aber egal wenns für dich funktioniert ;)

  • Nein, so wie ist jetzt ist funktioniert es bei den meisten Verknüpfungen, aber nicht immer.
    Naja, geht dan wohl nciht anders.....