AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Icon einer exe austauschen

Ein Thema von jonny · begonnen am 2. Feb 2004 · letzter Beitrag vom 5. Feb 2004
Antwort Antwort
Seite 2 von 2     12   
hboy

Registriert seit: 16. Jan 2004
364 Beiträge
 
#11

Re: Icon einer exe austauschen

  Alt 2. Feb 2004, 17:08
can you google? da gibts bestimmt irgendwelle toolz
Power is nothing without TControl
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#12

Re: Icon einer exe austauschen

  Alt 2. Feb 2004, 17:09
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.
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
jonny

Registriert seit: 15. Dez 2003
235 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: Icon einer exe austauschen

  Alt 2. Feb 2004, 17:33
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;
  Mit Zitat antworten Zitat
jonny

Registriert seit: 15. Dez 2003
235 Beiträge
 
Delphi 7 Enterprise
 
#14

Re: Icon einer exe austauschen

  Alt 3. Feb 2004, 01:38
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!
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#15

Re: Icon einer exe austauschen

  Alt 3. Feb 2004, 12:47
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.
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
jonny

Registriert seit: 15. Dez 2003
235 Beiträge
 
Delphi 7 Enterprise
 
#16

Re: Icon einer exe austauschen

  Alt 3. Feb 2004, 13:01
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.
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: Icon einer exe austauschen

  Alt 3. Feb 2004, 16:04
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;
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
jonny

Registriert seit: 15. Dez 2003
235 Beiträge
 
Delphi 7 Enterprise
 
#18

Re: Icon einer exe austauschen

  Alt 3. Feb 2004, 23:25
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.
  Mit Zitat antworten Zitat
jonny

Registriert seit: 15. Dez 2003
235 Beiträge
 
Delphi 7 Enterprise
 
#19

Re: Icon einer exe austauschen

  Alt 5. Feb 2004, 17:13
Weiss das echt keiner warum das so ist?
@TStringList: Ist es bei dir nicht so?
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#20

Re: Icon einer exe austauschen

  Alt 5. Feb 2004, 19:42
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.
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz