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 Wie füge ich Ressourcen einer PE-Anwendung hinzu? (https://www.delphipraxis.net/128284-wie-fuege-ich-ressourcen-einer-pe-anwendung-hinzu.html)

rollstuhlfahrer 27. Jan 2009 13:24


Wie füge ich Ressourcen einer PE-Anwendung hinzu?
 
HI,

ich habe mir eine DLL angelegt, in der ich viele nützliche Icons für Verknüpfungen habe, angelegt. Jetzt kommen hin und wieder Icons dazu, die auch in die DLL sollen, ohne dass jedes Mal kompiliert wird. Wie man Ressourcen ändert hab ich schon gefunden. Ein Beispiel für C gibts hier. Allerdings wird nicht beschrieben, wie man Ressourcen hinzufügt. :twisted: Und genau das ist meine Frage: Wie füge ich Ressourcen einer Win32-Anwendung (*.DLL und/oder *.EXE) hinzu?

Bernhard

DeddyH 27. Jan 2009 13:26

Re: Wie füge ich Ressourcen einer PE-Anwendung hinzu?
 
Wenn es nicht aus Delphi heraus sein muss: Resource Hacker

Apollonius 27. Jan 2009 15:19

Re: Wie füge ich Ressourcen einer PE-Anwendung hinzu?
 
Das Hinzufügen funktioniert genau wie das Ändern mit der Funktion UpdateResource.

rollstuhlfahrer 27. Jan 2009 16:18

Re: Wie füge ich Ressourcen einer PE-Anwendung hinzu?
 
Ich hab das jetzt mal probert, aber ohne Erfolg.

Delphi-Quellcode:
{1. Open the "*.ico" file with read-only access - CreateFile.
 2. Querry the size of the file - GetFileSize.
 3. Allocate a buffer for the file - mallloc.
 4. Read file into the buffer - ReadFile. }

procedure TForm1.Button1Click(Sender: TObject);
var
  Exe: PChar;
  EHandle: THandle;
//  hicon: THandle;
  iconStream: TMemoryStream;
  iconsize: Cardinal;
  buffer: Pointer;
//  dummy: cardinal;
begin
(*  hicon := CreateFile('icon.ico', GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  iconsize := GetFileSize(hicon, nil);       // für Dateien
  buffer := AllocMem(iconsize);
  ReadFile(hicon, buffer, iconsize, dummy, nil);*)

  iconStream := TMemoryStream.Create;
  Application.Icon.SaveToStream(iconStream);

  iconsize := iconStream.Size;
  iconStream.Position := 0;
  buffer := AllocMem(iconsize);
  iconstream.Read(buffer, iconsize);   // geladen ?

  iconStream.Free;


  Exe := 'Test.exe';

  EHandle := BeginUpdateResource(Exe, false);
  UpdateResource(Ehandle, RT_ICON, 'neuesIcon', LANG_NEUTRAL, Buffer, iconsize);
try
  EndUpdateResource(EHandle, false);
except
  ShowMessage('ERROR');
end;
end;
Am Ende der Prozedur kommt eine Exception des Typs EPrivilege, die aber von dem Try-Except-Block nicht abgefangen wird, da sie wohl später auftritt. Was hab ich falsch gemacht? Die Ressource ist nicht in der Testanwendung drin.

@DeddyH: Mit nem Ressource-Hacker kann ich das auch. Es muss (besser: sollte) aber in Delphi sein. Und da ein Ressource-hacker das kann, geht das über Delphi auch. Die Frage ist bloß, wie!

Ich hab mir mal deinen Link angeguckt. Da gibts nen Link auf nen RessourceEditor mit Quelltext. Ich blick da überhaupt nicht durch. Kann auch daran liegen, dass ich nur D7 hab.

Bernhard

Apollonius 27. Jan 2009 16:26

Re: Wie füge ich Ressourcen einer PE-Anwendung hinzu?
 
Icon-Daten sehen als Ressourcen anders aus als auf der Festplatte. Versuche es doch erst mal mit Rohdaten.

rollstuhlfahrer 28. Jan 2009 07:14

Re: Wie füge ich Ressourcen einer PE-Anwendung hinzu?
 
Zitat:

Zitat von Apollonius
Icon-Daten sehen als Ressourcen anders aus als auf der Festplatte. Versuche es doch erst mal mit Rohdaten.

Sorry, aber ich kann damit nichts anfagen. Was meinst du damit?

Ich hab jetzt mal die Routine mit den Dateidaten probiert. -> Es kommt aber nur die übliche Zugriffsverletzung.

Bernhard

Apollonius 28. Jan 2009 17:04

Re: Wie füge ich Ressourcen einer PE-Anwendung hinzu?
 
Icon-Ressourcen haben nicht das selbe Format wie .ico-Dateien. Deshalb kannst du auch nicht einfach einen ResourceStream und die Methode TIcon.LoadFromStream verwenden, um ein Icon aus einer Ressource zu laden.

rollstuhlfahrer 31. Jan 2009 20:34

Re: Wie füge ich Ressourcen einer PE-Anwendung hinzu?
 
Zitat:

Zitat von Apollonius
Icon-Ressourcen haben nicht das selbe Format wie .ico-Dateien. Deshalb kannst du auch nicht einfach einen ResourceStream und die Methode TIcon.LoadFromStream verwenden, um ein Icon aus einer Ressource zu laden.


ok, ich hab jetzt mal geguckt, was ich so mit dem Codeschnipsel anfangen kann. Also hab ich versucht die Datei Project1.cfg (normale Textdatei, von D7 generiert) in meine leere VCL-Exe zu integrieren. (kein Icon, RCData). Dies endete 1x erfolgreich, ließ sich aber nicht mehr reproduzieren. Ich lande nun immer wieder bei der Fehlermeldung:
Zitat:

Zitat von Delphi Exception
---------------------------
Project1
---------------------------
Zugriffsverletzung bei Adresse 7C870669 in Modul 'kernel32.dll'. Lesen von Adresse 3841242D.
---------------------------
OK
---------------------------

Code:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Exe: PChar;
  EHandle: THandle;
  hicon: THandle;
  iconStream: TMemoryStream;
  iconsize: Cardinal;
  buffer: Pointer;
  dummy: cardinal;
begin
  hicon := CreateFile({'icon.ico'} 'Project1.cfg', GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  iconsize := GetFileSize(hicon, nil);       // für Dateien
  buffer := AllocMem(iconsize);
  ReadFile(hicon, buffer, iconsize, dummy, nil);

(*  iconStream := TMemoryStream.Create;
  iconStream.LoadFromFile('Project1.cfg');

  iconsize := iconStream.Size;
  iconStream.Position := 0;
  buffer := AllocMem(iconsize);
  iconstream.Read(buffer, iconsize);   // geladen ?

  iconStream.Free;     *)


  Exe := 'Test.exe';

  EHandle := BeginUpdateResource(Exe, false); // <> 0
  UpdateResource(Ehandle, RT_RCDATA, 'neuesIcon', LANG_NEUTRAL, Buffer, iconsize);
try
  EndUpdateResource(EHandle, false);
except
  ShowMessage('ERROR');
end;

end;
Was läuft da nicht richtig?

Bernhard

Zacherl 31. Jan 2009 21:11

Re: Wie füge ich Ressourcen einer PE-Anwendung hinzu?
 
Icons kannst du nicht einfach über UpdateResource ändern. Das ganze ist nicht trivial. Aber such mal nach IconChanger, da findest du paar Delphi Sourcen.

rollstuhlfahrer 31. Jan 2009 21:30

Re: Wie füge ich Ressourcen einer PE-Anwendung hinzu?
 
Zitat:

Zitat von Zacherl
Icons kannst du nicht einfach über UpdateResource ändern.

Alles andere will auch nicht so recht. Dann werd ich halt immer neu kompilieren müssen.
Ab welchem Delphi gibts eigentlich eine TRessource (o.ä.) Komponente, die das ändern managed?
Im XN Resource Editor wird ja eine entsprechende Komponente verwendet.

Bernhard


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:21 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