![]() |
Icon einer exe austauschen
Hallo ich habe mal eine Frage:
Wie kann ich Das hauptIcon einer Compilierten DAtei (exe) ersetzen? Danke schon mal im vorraus! |
Re: Icon einer exe austauschen
das icon ist in der Ressource drin
du brauchst eine .rc datei zb. mainicon.rc
Delphi-Quellcode:
und dann in der project1.pas
MAINICON ICON eigenes.ico
Delphi-Quellcode:
anstelle dem
{$R 'Project1.res' 'mainicon.rc'}
{$R *.res} |
Re: Icon einer exe austauschen
Er meint eine Compilierte Datei !
Such mal nach RessourceUpdate |
Re: Icon einer exe austauschen
Ich will das Icon nicht in meinem Programm ändern sondern in einer Fremden Exe-Datei die ich nicht als Quellcode habe.
|
Re: Icon einer exe austauschen
Zitat:
|
Re: Icon einer exe austauschen
Zitat:
![]() Edit: Hmm, doch nicht. :? Ah, aber ![]() |
Re: Icon einer exe austauschen
Mist, ich auch. Hat dann aber mit "Ressource DLL" geklappt:
![]() @Chewie :oops: Verdammte Rechtschreibung ! |
Re: Icon einer exe austauschen
ops. das Tauschen einer existierenden ressource geht nicht oder nur mit decompilieren oder ?
|
Re: Icon einer exe austauschen
Irgendwie ist das das falsche Forum ;)
Gehört wohl eher nach K&T ;) |
Re: Icon einer exe austauschen
Also, mit einem Resourcen Hacker kommt man an Resourcen, aber ob das umgekehrt auch so einfach geht, weiß ich auch nicht.
|
Re: Icon einer exe austauschen
can you google? da gibts bestimmt irgendwelle toolz
|
Re: Icon einer exe austauschen
Zitat:
[Nachtrag] Der ![]() |
Re: Icon einer exe austauschen
Also hab jetzt folgendes gefunden. Wie ändere ich jetzt aber das HauptIcon?
Delphi-Quellcode:
var
stream : TFilestream; hInst: THandle; ptr : Pointer; begin Stream := TFileStream.Create('C:\test.bmp',fmOpenRead); getmem (ptr,Stream.size+1); try Stream.Seek(soFromBeginning,0); stream.read(ptr^,Stream.size); // <== hInst:=BeginUpdateResource(Pchar(Test.exe), False); if hInst > 0 then begin UpdateResource(hInst, RT_Bitmap,'Test', MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),ptr^,Stream.size); // <== EndUpdateResource(hInst, False); end; finally freemem (ptr,Stream.size+1); stream.Free; end; end; |
Re: Icon einer exe austauschen
OK habe das ganze jetzt so abgeändert:
Delphi-Quellcode:
Das Programm löscht alle alten Icons in der Exe so wie es soll und erstellt nur ein Symbol und das ist leer.
procedure TForm1.Button7Click(Sender: TObject);
var Ico: TIcon; Stream : TMemoryStream; hInst: THandle; ptr : Pointer; begin Ico:=TIcon.Create; Ico.LoadFromFile('c:\icon.ico'); Stream := TMemoryStream.Create; Ico.SaveToStream(Stream); Ico.Free; getmem (ptr, Stream.size + 1); try Stream.Seek(soFromBeginning, 0); Stream.read(ptr^, Stream.size); hInst:=BeginUpdateResource(Pchar('C:\MeineExe.exe'), False); if hInst > 0 then begin UpdateResource(hInst, RT_GROUP_ICON, 'MAINICON', 1031, ptr, Stream.size); EndUpdateResource(hInst, False); end; finally freemem (ptr, Stream.size + 1); stream.Free; end; end; -Wieso ist das leer? -Und Wieso wird nur ein Symbol erstellt? Bitte um Hilfe! |
Re: Icon einer exe austauschen
Hi,
beim Ico.SaveToStream kommt nicht nur die reine Icon im Stream raus, sondern gleich ein ganzer 1 Icon großer Icon-File! ...und Icon-Files sind so aufgebaut, dass sie normalerweise mehrere Icons gleichzeitig beinhalten können. Demzufolge haben sie also auch einen Daten-Head (indem u.a. auch die Anzahl der Icons pro aktuellem File festgehalten ist). Ferner kommt danach pro Icon nochmal ein extra Datensatz, indem bestimmte Infos über eine jeweilige Icon selbst angesiedelt sind. Lange Rede kurzer Sinn: Diese eigentlichen File-Daten haben in der Resource nachher natürlich nichts zu suchen. Du solltest also zuerst ermitteln, wo deine Icon im Stream tatsächlich steht (das ist nach SaveToStream --> immer nur ein 1 Icon großer Icon-File --> Offset:=22), dann Pointer drauf und die Längenangabe entsprechend modifizieren. Außerdem scheinen mir auch deine Parameter für die UpdateResource-Funktion noch nicht so ganz zu stimmen. Hier mal ein funktionierendes ![]() |
Re: Icon einer exe austauschen
Das Beispiel hatte ich schon im Google gefunden und auch ausprobiert es hat beim ersten mal funktioniert dannach ging das nicht mehr ohne das ich den Code verändert hatte wurde nichts mehr in der Exe verändert.
|
Re: Icon einer exe austauschen
Also gut, richtig ausprobiert hatte ich das Beispiel so direkt auch nicht, sondern ich hatte nur die Informationen übernommen, die mir selbst noch bezüglich dieser Technik gefehlt haben ...und dann lief mein Prog auch. (Also dachte ich natürlich, dass das bei diesem Code-Beispiel dann eigentlich sowieso der Fall wäre...). *g*
Hier hast du mal meinen Code. Habe das Testprogramm gerade nochmal kurz angeschmissen und gecheckt. Ein Icon-Austausch, auch beliebig oft hintereinander, ist damit eigentlich kein Problem.
Code:
type
... TIconDir = packed record // die 3 Anfangswörter eines IconFiles idReserved: Word; // Reserved (must be 0) idType: Word; // Resource Type (1 for icons) idCount: Word; // How many images? end; TIconDirEntry = packed record // An entry for each image bWidth: Byte; // Width, in pixels, of the image bHeight: Byte; // Height, in pixels, of the image bColorCount: Byte; // Number of colors in image (0 if >=8bpp) bReserved: Byte; // Reserved ( must be 0) wPlanes: Word; // Color Planes wBitCount: Word; // Bits per pixel dwBytesInRes: DWord; // How many bytes in this resource? dwImageOffset: DWord; // Where in the file is this image? end; . . . procedure TForm1.ExchangeIcon (Ikone : TIcon); const Filename = 'C:\Programme\Borland\Delphi7\Projects\Probs\IconOverwrite\FileXY.exe'; var URHandle : HWnd; MemStream : TMemoryStream; begin URHandle := BeginUpdateResource(PChar(Filename),FALSE); if URHandle = 0 then begin showMessage('keine UR-Handle erhaltbar!'); exit; end; MemStream := TMemoryStream.Create; try Ikone.SaveToStream(MemStream); // im Stream entsteht da immer die 1-Icon-Filestruktur! UpdateResource(URHandle, RT_ICON, MakeIntResource(1), // = OrdnerNummer (siehe im ResourceHacker) 1031, Pointer(longint(MemStream.Memory) + SizeOf(TIconDir) + SizeOf(TIconDirEntry)), MemStream.Size - SizeOf(TIconDir) - SizeOf(TIconDirEntry)); finally EndUpdateResource(URHandle, False); MemStream.free; end; end; |
Re: Icon einer exe austauschen
OK Das Icon der Exe kann ich jetzt ändern aber warum hat das Icon nicht soviele Farben wie das Original? Ich habe ein IconFile mit mehreren Icons Drin von 128x128 bis 32x32 und alle TrueColor und wenn ich das Icon nun in die ese schreibe ist das Symbol der Exe so Farblos (höchstens 16 Farben). Ich habe die Exe auch mit dem ResHacker aufgemacht und es sehen alle von mir eingefügten Icons so aus von 128x128 bis 16x16. Woran liegt das ich benutze die Obere Routine um Icons einzufügen.
Ach ja bevor ich es vergesse Danke an TStringList und an alle anderen die sich für mich bemüht haben. |
Re: Icon einer exe austauschen
Weiss das echt keiner warum das so ist?
@TStringList: Ist es bei dir nicht so? |
Re: Icon einer exe austauschen
Wird bei mir dann wohl genauso sein. Aber ich finde es auch schon komisch, dass auch der Delphi-eigene Icon-Editor selbst schon immer nur max. 16 Farben zur Editierung anbietet. Da muss doch wenigstens irgendwie +-teilweise eine offizielle Farbbeschränkung für Icons dahinterstecken (wenigstens für diejenigen, welche dann auch pro File im Explorer abgebildet werden). Ansonsten würde Borland doch auch selbst garantiert niemals eine solche Einschränkung zulassen.
Bezüglich der Icons die dann auf dem Desktop abgebildet werden sieht es allerdings tatsächlich irgendwie so aus, als hätten die mehr als 16 unterschiedliche Farben. Hatte dieses (mit mehr als 16 Farben) jetzt aber selbst auch gar nicht mehr groß ausprobiert, weil das für mich 'damals' auch einfach nicht so wichtig war und ich auch auf die Schnelle gar keine Möglichkeit dazu hatte, da echte Icons mit mehr als 16 Farben überhaupt groß zu erzeugen. Aber wenn du da mal etwas genaueres rauskriegen würdest, dann würde mich das durchaus auch interessieren. :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz