Procedure Gesucht: Icons ALS ICONS aus EXE extrahieren

Du brauchst Grafiken, gute Programme oder Leute die dir helfen? Frag hier.
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Procedure Gesucht: Icons ALS ICONS aus EXE extrahieren

Beitrag von Franky »

Hi Leute.

Nachdem ich mich nunmehr 4 Tage mit dem Mist gequält habe, dürft ihr nun auch mal. ;)

Was ich brauche
Ich suche einen Weg, alle Icons aus einem Executable ALS ICONS zu extrahieren in einen Speicherbereich, also so, dass ich die Sachen mit WriteData in ne Datei schreiben kann.

Was mir vorschwebt ist eine Funktion für PB4.0, die etwa so aussieht

Code: Alles auswählen

LoadIcons(exe.s,Liste.l())
exe.s enthält hierbei den Dateipfad zur Exe, Liste() ist anfangs leer und soll nachher die Adressen zu mittels AllocateMemory oder so erstellten Speicherbereichen enthalten.

Die Speicherbereiche sollen dabei jeweils folgendes enthalten:
-Die Größe des Speicherbereichs in Byte.( als LongWert, als 4 Byte)
-BITMAPINFOHEADER ; Da stehen höhe, breite, all so´n brams drin
-Die Farbpalette mit 256 Farben : 1024 Byte also
-Die FarbIndizees; Halt die Nr, welche der 256 Farben genutzt wird.
-Die Transparenzindizees; Wenn Vorhanden

Bis auf die Größe des Speicherbereichs steht im Exe-File alles direkt hinternander, das heißt, wenn ihr rausfindet, wo es steht, könnt ihr einfach einmal mit CopyMemory arbeiten.

Warum mach ich´s nicht selbst?
Um ganz ehrlich zu sein: Ich habe keine Lust /:->
Wie für die meisten hier is auch für mich Programmieren ein Hobby (noch). Und Hobbys sollen Spass machen. Es macht mir Spass, eigene Algorithmen zu entwickeln, oder Große Konzepte für Programme zu machen. Ich finde es aber nervtötend, mich dahinter zu klemmen, wie irgend eine Exe-Datei aufgebaut ist und mich mit ungenauen Erklärungen herum zu schlagen, zumal die oft in HochEnglisch und mit Bezeichnungen, die ich nicht verstehe versehen sind (0Ch gibt angeblich eine Stelle in einer Datei zurück, nur welche???).
Ich hoffe aber jetzt ganz einfach mal, dass es Leute gibt, die sowas gerne machen (sonst gäbs ja auch keine PDF-Lib oder Konvertierer in andere Grafikformate).

Was springt für euch raus?
Da es zuerst einmal um ein Freewareprogramm geht, kann ich euch nur eine Erwähnung im Impressum anbieten.
Sollte das Programm jemals kommerziell werden (ist immerhin ein Programmkonzept, dass ich noch nirgends sonst gesehen habe), gibt´s natürlich auch Kohle, aber wie gesagt, erstmal ist es Freeware.


Ein paar Tips
So, wie ich es bisher verstanden habe, ist in der ExeDatei vermerkt, wo der ResourceTable anfängt. Im ResourceTable wiederrum steht eine Liste von Resourcen, in der Liste wiederrum ist dann vermerkt, wo das Icon anfängt (die Länge des Bereichs denk ich auch, die ist sonst SizeOf(BitmapInfoHeader)+1024+breite*hoehe/8+breite*hoehe etwa, genaue Formel könnter kriegen, falls ihr so weit kommt, dass ihr die braucht)

ExtractIcon_() sowie ExtractIconEx_()(Danke an Freak) habe ich sehrwohl
gefunden, allerdings geben mir beide nur ein Icon (wenn ich als Index 0 angebe, sonst gibt´s garkeins). Kann auch sein, dass das die Icongroup ist, aber da es sich um ein Handle handelt, kann ich scheinbar nix kopieren, mit Copymemory erhalt ich andauernd einen Invalid Memory Access.

Vielen Dank, dass ihr bis hier unten ausgehalten habt und Danke im Vorraus für Eure Hilfe :)
Mfg Franky
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag von roherter »

Zu ExtractIcon_()
Index -1 gibt dir die anzahl der enthaltenen icon zurück die kannste dann auch abrufen pack mal diesen code und die regedit.exe in einen ordner dann siehst du was ich meine!

Hoffe es hilft ein bischen:

Purebasic 4.0 Beta6

Code: Alles auswählen




;- Window Constants
;
Enumeration
  #Window_0
  #imggad
  #img
EndEnumeration
CreateImage(#img,100,100)
 Result=ExtractIcon_(#Window_0,"regedit.exe",3)
 dra=StartDrawing(ImageOutput(#img))
DrawIcon_(dra,0,0,Result)
StopDrawing()
Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 600, 300, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      ImageGadget(#imggad,0,0,100,100,ImageID(#img))
    EndIf
  EndIf
  
EndProcedure



Open_Window_0()



Repeat ; Start of the event loop
  
  Event = WaitWindowEvent() ; This line waits until an event is received from Windows
  
  WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
  
  GadgetID = EventGadget() ; Is it a gadget event?
  
  EventType = EventType() ; The event type
  
  ;You can place code here, and use the result as parameters for the procedures
  
  If Event = #PB_Event_Gadget
    
  EndIf
  
Until Event = #PB_Event_CloseWindow ; End of the event loop

End
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Antworten