Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen) (https://www.delphipraxis.net/170682-laden-und-speichern-von-icons-icon-parser-fuer-icon-dateien-oder-resourcen.html)

ringli 1. Jan 2013 17:50

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)
 
Ich habe mal versucht mit Hilfe der Unit das MAINICON einer bestehenden Delphi Anwendung zu ändern. Dazu habe ich den Beispielcode von Bummi in leicht abgeänderter Form verwendet. Allerdings gelingt es mir nicht das MAINICON zu ändern. Weder mit einer ICO-Datei noch mit einem Icon aus einer anderen Anwendung. Wahrscheinlich sehe ich meinen Fehler nur nicht. Könnte mir jemand auf die Sprünge helfen?
Delphi-Quellcode:
uses
  dxIconUtils;

procedure TForm2.Button1Click(Sender: TObject);
var
 ir:TdxIconResource;
 hModule: THandle;
begin
   ir:=TdxIconResource.Create;
   //ir.CreateIconHandles := true;

   //ir.LoadFromFile('Testicon.ico');

  hModule := LoadLibraryEx('TestPE.exe', 0, LOAD_LIBRARY_AS_DATAFILE);
  if (hModule <> 0) and (hModule <> INVALID_HANDLE_VALUE) then
  try
    ir.LoadFromResource(hModule, 'MAINICON');
  finally
    FreeLibrary(hModule);
  end;

  ir.SaveToResource('AppWithNewIcon.exe', 'MAINICON');

  ShowMessage(IntToStr(ir.ImageCount)); // Anzahl enthaltener Icons wird angezeigt bspw. 9, 10 etc.

  ir.Free;
end;
BTW: Wie kann man bei der Verwendung von IconDLL's etc. die Nummer des zu verwendenen Icons angeben, da hier der Pfad zur Datei ja immer der selbe ist?

Zacherl 1. Jan 2013 17:56

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)
 
Könnte es eventuell sein, dass der Windows Icon Cache noch das alte Icon beinhaltet und deshalb keine Änderung sichtbar ist? Der Code sieht eigentlich gut aus. Was sagt denn GetLastError() nach dem Aufruf von SaveToResource()?

Für Icon DLLs oder EXEn mit ordinalen Resourcenbezeichnern, kannst du die entsprechende Nummer einfach in PChar casten:
Delphi-Quellcode:
LoadFromResource(hModule, PChar(1337));

ringli 1. Jan 2013 18:11

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)
 
Also der Aufruf von GetLastError gibt Fehler 5 (Zugriff verweigert) aus. Die Datei ist aber definitiv nicht im Zugriff. Virenscanner habe ich grade testweise deaktiviert. Das Ergebnis ist dasselbe. Es sei denn Windows hat sich verschluckt. Das werde ich gleich nochmal ausprobieren.

ringli 1. Jan 2013 18:24

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)
 
So, ein Neustart von Windows hat nichts gebracht. Den IconCache schliesse ich mal aus, da ich die zu modifizierende Datei nach der Änderung in einem Resourcenviewer öffne um die Änderung zu betrachten.

Ich bin ehrlich gesagt ratlos. :?

Zacherl 1. Jan 2013 18:27

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)
 
Zitat:

Zitat von ringli (Beitrag 1197301)
Also der Aufruf von GetLastError gibt Fehler 5 (Zugriff verweigert) aus. Die Datei ist aber definitiv nicht im Zugriff. Virenscanner habe ich grade testweise deaktiviert. Das Ergebnis ist dasselbe. Es sei denn Windows hat sich verschluckt. Das werde ich gleich nochmal ausprobieren.

Schau mal im Debugger per Single Step, an welcher Stelle innerhalb von SaveToResource() der Fehler auftritt. Und nimm vielleicht testweise mal absolute Pfade, statt der Relativen.

ringli 1. Jan 2013 18:50

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)
 
Also der Fehler tritt auf beim Aufruf von DeleteExistingIconResource innerhalb der SaveToResource-Funktion. Hilft dir das weiter? Die Pfade sind absolut. Ich habe die nur fürs Forum auf das wesentliche gekürzt.

Zacherl 1. Jan 2013 19:24

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)
 
Zitat:

Zitat von ringli (Beitrag 1197304)
Also der Fehler tritt auf beim Aufruf von DeleteExistingIconResource innerhalb der SaveToResource-Funktion. Hilft dir das weiter? Die Pfade sind absolut. Ich habe die nur fürs Forum auf das wesentliche gekürzt.

Kannst du deine Testanwendung + Source und den 2 Binaries mal hier hochladen? Ansonsten debugge mal bitte weiter, bei welchem API Aufruf innerhalb der DeleteExistingIconResources() Funktion der Fehler auftritt.

ringli 2. Jan 2013 16:45

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)
 
Also ich bin nicht weitergekommen beim Debuggen. Habe jetzt auch noch ein paar andere Testdateien ausprobiert und erhalte immer "Zugriff verweigert". Anbei das gewünschte Testprojekt.Vielleicht findest du ja etwas oder es funktioniert sogar auf Anhieb.

Zacherl 2. Jan 2013 19:07

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier schonmal ein temporärer Bugfix für das Problem. Werde den Code nochmal etwas überarbeiten, da die momentane Lösung etwas unsauber ist:
1) Die EnumResource* Callbacks hatten einen Fehler, bei dem Strings nicht korrekt nullterminiert wurden
2) Ich hatte versucht EndUpdateResource() aufzurufen, während die Datei noch per LoadLibraryEx() geladen war. Daher kam auch die "Zugriff verweigert" Meldung.

Allerdings wurde das Delphi Icon bei mir auch nach diesen Änderungen nicht korrekt übernommen. Die CaCV.exe hatte danach einfach überhaupt kein Icon mehr. Warum das so ist, kann ich mir allerdings auch nicht erklären. Habe es daraufhin mal mit einem anderen Icon probiert und das funktioniert wunderbar (2 von 3 Resourcen Editoren hatten mit dem alten Delphi Icon, das du versuchst hinzuzufügen, ebenfals Probleme).

ringli 2. Jan 2013 19:34

AW: Laden und Speichern von Icons (Icon Parser, für Icon Dateien oder Resourcen)
 
So wie es aussieht, funktioniert es erstmal. :) Danke für den Bugfix.

Wenn du schon beim Überarbeiten bist könntest du nochmal nachsehen warum die 256 x 256 Pixel Icons nicht mit übernommen werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:34 Uhr.
Seite 2 von 4     12 34      

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