Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Icon einer exe austauschen (https://www.delphipraxis.net/15679-icon-einer-exe-austauschen.html)

jonny 2. Feb 2004 17:42


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!

hboy 2. Feb 2004 17:53

Re: Icon einer exe austauschen
 
das icon ist in der Ressource drin

du brauchst eine .rc datei zb. mainicon.rc

Delphi-Quellcode:
MAINICON ICON eigenes.ico
und dann in der project1.pas

Delphi-Quellcode:
{$R 'Project1.res' 'mainicon.rc'}
anstelle dem

{$R *.res}

MrKnogge 2. Feb 2004 17:58

Re: Icon einer exe austauschen
 
Er meint eine Compilierte Datei !
Such mal nach RessourceUpdate

jonny 2. Feb 2004 17:58

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.

jonny 2. Feb 2004 18:01

Re: Icon einer exe austauschen
 
Zitat:

Zitat von MrKnogge
Er meint eine Compilierte Datei !
Such mal nach RessourceUpdate

habe gesucht und ich finde nur diesen Thread hier!

Chewie 2. Feb 2004 18:03

Re: Icon einer exe austauschen
 
Zitat:

Zitat von jonny
Zitat:

Zitat von MrKnogge
Er meint eine Compilierte Datei !
Such mal nach RessourceUpdate

habe gesucht und ich finde nur diesen Thread hier!

Vielleicht wäre eine Suche nach Hier im Forum suchenResourceUpdate erfolgreicher ;)

Edit: Hmm, doch nicht. :?

Ah, aber Hier im Forum suchenUpdateResource :-D

MrKnogge 2. Feb 2004 18:05

Re: Icon einer exe austauschen
 
Mist, ich auch. Hat dann aber mit "Ressource DLL" geklappt:
tadaaaa

@Chewie
:oops: Verdammte Rechtschreibung !

hboy 2. Feb 2004 18:06

Re: Icon einer exe austauschen
 
ops. das Tauschen einer existierenden ressource geht nicht oder nur mit decompilieren oder ?

Matze 2. Feb 2004 18:06

Re: Icon einer exe austauschen
 
Irgendwie ist das das falsche Forum ;)

Gehört wohl eher nach K&T ;)

Matze 2. Feb 2004 18:07

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.

hboy 2. Feb 2004 18:08

Re: Icon einer exe austauschen
 
can you google? da gibts bestimmt irgendwelle toolz

MrKnogge 2. Feb 2004 18:09

Re: Icon einer exe austauschen
 
Zitat:

Zitat von hboy
ops. das Tauschen einer existierenden ressource geht nicht oder nur mit decompilieren oder ?

doch, eben mit UpdateResource

[Nachtrag]
Der Resourcehacker von dem Matze sprach.

jonny 2. Feb 2004 18:33

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;

jonny 3. Feb 2004 02:38

Re: Icon einer exe austauschen
 
OK habe das ganze jetzt so abgeändert:

Delphi-Quellcode:
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;
Das Programm löscht alle alten Icons in der Exe so wie es soll und erstellt nur ein Symbol und das ist leer.
-Wieso ist das leer?
-Und Wieso wird nur ein Symbol erstellt?

Bitte um Hilfe!

TStringlist 3. Feb 2004 13:47

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 Code-Beispiel, bei dem z.B. auch diese Parameter ok sind.

jonny 3. Feb 2004 14:01

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.

TStringlist 3. Feb 2004 17:04

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;

jonny 4. Feb 2004 00:25

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.

jonny 5. Feb 2004 18:13

Re: Icon einer exe austauschen
 
Weiss das echt keiner warum das so ist?
@TStringList: Ist es bei dir nicht so?

TStringlist 5. Feb 2004 20:42

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