Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Icon einer Anwendung ändern (UpdateResource) (https://www.delphipraxis.net/101568-icon-einer-anwendung-aendern-updateresource.html)

Neutral General 15. Okt 2007 17:03


Icon einer Anwendung ändern (UpdateResource)
 
Hi,

Wenn ich eine .rc Datei erstelle mit folgendem Inhalt

Zitat:

Icon ICON Icon.ico
und diese dann compiliere und in mein Projekt einbaue dann hat danach meine Exe dieses Icon (zumindest nonVCL).
Mit dem Resourcen-Hacker hab ist das Icon zu finden unter:

Zitat:

Icon Group -> ICON -> 1031
Wenn ich auf diesen Eintrag klicke wird mir auch das Icon angezeigt mit folgenden Zusatzinformationen:

Zitat:

32 x 32 (16 colors) - Ordinal name: 1
16 x 16 (16 colors) - Ordinal name: 2
Wenn ich nun das Gleiche mit UpdateResource machen will, nämlich so:

Delphi-Quellcode:
var h: THandle;
    sFile: TFileStream;
    Data: Pointer;
begin
  h := BeginUpdateResource(PChar(Filename),false);
  sFile := TFileStream.Create(IconPfad,fmOpenRead);
  try
    size := sFile.Size;
    GetMem(Data,size);
    sFile.Read(Data^,size);
    UpdateResource(h,RT_GROUP_ICON,'ICON',MakeLangID(LANG_GERMAN,SUBLANG_GERMAN),Data,size);
    FreeMem(Data);
  finally
    sFile.Free;
  end;
  EndUpdateResource(h,false);
end;
Dann funktionierts nicht. Im Explorer wird das Icon nicht angezeigt und mim ResourceHacker habe ich unter dem Selben Eintrag wie eben folgendes stehn:

Zitat:

32 x 32 (1 colors) - Ordinal name: 38
0 x 0 (1 colors) - Ordinal name: 0
Und das Icon wird nicht angezeigt. :gruebel:
Achja: Die Dateinamen und Pfäde stimmen...

Gruß
Neutral General

Apollonius 15. Okt 2007 17:09

Re: Icon einer Anwendung ändern (UpdateResource)
 
Zitat:

Zitat von MSDN
Each call to UpdateResource contributes to an internal list of additions, deletions, and replacements but does not actually write the data to the executable file. The application must use the EndUpdateResource function to write the accumulated changes to the executable file.

Also auf jeden Fall EndUpdateResource aufrufen.

Neutral General 15. Okt 2007 17:10

Re: Icon einer Anwendung ändern (UpdateResource)
 
Joo.. hab ich vergessen mit reinzukopieren. Hab ich aber in meinem Quellcode stehn.

Neutral General 16. Okt 2007 13:55

Re: Icon einer Anwendung ändern (UpdateResource)
 
Ich würde jetzt gerne mal pushen.. Also ich habe mir auch mal das hier runtergeladen und versucht:

http://assarbad.net/stuff/!import/mo...n_resource.rar

Ok damit kann man Icons hinzufügen aber halt in der Gruppe "ICONS" (RT_ICON) Soweit ich aber weiß muss das Symbol für die Exe Datei unter "ICON GROUPS" (RT_GROUP_ICON). Wenn ich es jetzt noch schaffen würde dahin ein funktionierendes Icon zu laden dann wär alles gut.

Gruß
Neutral General

Flocke 16. Okt 2007 15:07

Re: Icon einer Anwendung ändern (UpdateResource)
 
Zitat:

Zitat von Neutral General
Ok damit kann man Icons hinzufügen aber halt in der Gruppe "ICONS" (RT_ICON) Soweit ich aber weiß muss das Symbol für die Exe Datei unter "ICON GROUPS" (RT_GROUP_ICON). Wenn ich es jetzt noch schaffen würde dahin ein funktionierendes Icon zu laden dann wär alles gut.

Leider ist es eine Kombination aus RT_ICON und RT_GROUP_ICON: in RT_GROUP_ICON wird das Verzeichnis der Einzelbilder abgelegt, dass dann mit seinen Einträgen jeweils auf eine RT_ICON-Ressource verweist. Ich habe hier das Dateiformat beschrieben. Im Unterschied dazu ist ein Eintrag in einem Resource-Header etwas kleiner:
Delphi-Quellcode:
type
  TIconResDirEntry = packed record
    bWidth: Byte;
    bHeight: Byte;
    bColorCount: Byte;
    bReserved: Byte;
    wPlanes: Word;
    wBitCount: Word;
    dwBytesInRes: Longint;
    nId: Word;
  end;
Ein Eintrag in RT_GROUP_ICON besteht aus einem TIconDirHdr gefolgt von einem Array aus TIconResDirEntry mit den Ordinalnummer der RT_ICON-Ressourcen in .nId. Diese bestehen dann nur aus den wirklichen Bildinformationen.

Neutral General 16. Okt 2007 15:40

Re: Icon einer Anwendung ändern (UpdateResource)
 
Das heißt man muss da wieder rumschnippeln an der Icon-Datei.. Das ist doch ätzend.. Ich schreibe seit Tagen Tausende von Daten mit Hilfe von UpdateResource in eine Exe und das ohne Probleme und diese besch.. Icons brauchen natürliche ne Sonderbehandlung für die ich mich mim halben Icon Dateiformat auseinandersetzen muss... :?

Flocke 16. Okt 2007 16:21

Re: Icon einer Anwendung ändern (UpdateResource)
 
Zitat:

Zitat von Neutral General
Icons brauchen natürliche ne Sonderbehandlung für die ich mich mim halben Icon Dateiformat auseinandersetzen muss... :?

Tja, ist leider so - und nicht nur das: du musst für neue Icons natürlich auch Nummern wählen, die in RT_ICON noch nicht vergeben sind!

Und wie bereits geschrieben: die Ressourcen in RT_ICON beginnen direkt mit dem TBitmapInfoHeader der Farbbitmap eines jeden Einzelbildes. An denen musst du auch nichts mehr ändern, du kannst sie direkt über .dwImageOffset/.dwBytesInRes aus der Datei laden.


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