![]() |
Exe mit zwei unterschiedlichen Icons
Ich hab wieder mal ein saudoofes Problem :-)
Vorbedingungen: Ich habe eine .exe die im Endeffekt zweimal brauche (aber nur einmal kompiliert wird). Diese Exe hat ganz normal über über Delphi ein Programm-Icon was ja in die .exe einkompliert wird. Danach wird die .exe per Batch kopiert/dupliziert. Jetzt möchte ich das diese .exe ein anderen Icon hat. Klaro händisch könnte man das mit dem ResHacker machen, ich würde das aber gerne auch in die batch mit einbauen, das es automatisch geht. Hat jemand ne Idee wie man sowas realisieren könnten?? |
Re: Exe mit zwei unterschiedlichen Icons
Hallo
Bei ![]()
Delphi-Quellcode:
unit IconModifyUnit;
interface uses Windows, SysUtils, Classes ; type TIconModifier = Class(TComponent) private FSourceFile : String ; FDestFile : String ; procedure SetSourceFile(AFile: String) ; procedure SetDestFile(AFile: String) ; function ModifyIconForNt(SourceIndex, DestIndex: Cardinal = 1): Boolean ; function ModifyIconFor9x(SourceIndex, DestIndex: Cardinal = 1): Boolean ; public property SourceFile: String Read FSourceFile Write SetSourceFile ; property DestFile : String Read FDestFile Write SetDestFile ; function ModifyIcon(SourceIndex, DestIndex: Cardinal = 1): Boolean ; end; implementation procedure TIconModifier.SetSourceFile(AFile: String); begin FSourceFile := AFile ; end; procedure TIconModifier.SetDestFile(AFile: String); begin FDestFile := AFile ; end; function TIconModifier.ModifyIconForNt(SourceIndex, DestIndex: Cardinal = 1): Boolean ; var hModule : Cardinal ; hResFind : Cardinal ; hResLoad : Cardinal ; pResLock : PChar ; hResUpdate: Cardinal ; begin Result := false ; hModule := LoadLibrary(PChar(FSourceFile)); if hModule = 0 then Exit ; try hResFind := FindResource(hModule, MakeIntResource(SourceIndex+1), RT_ICON) ; if hResFind = 0 then Exit ; hResLoad := LoadResource(hModule, hResFind) ; if hResLoad = 0 then Exit ; pResLock := LockResource(hResLoad) ; if pResLock = nil then Exit ; hResUpdate := BeginUpdateResource(PChar(FDestFile), false) ; if hResUpdate = 0 then Exit ; if not UpdateResource(hResUpdate, RT_ICON, MakeIntResource(DestIndex + 1), 0, //local language pResLock, SizeofResource(hModule, hResFind)) then Exit ; if not EndUpdateResource(hResUpdate, false) then Exit ; finally FreeLibrary(hModule) ; end; Result := true ; end; function TIconModifier.ModifyIconFor9x(SourceIndex, DestIndex: Cardinal = 1): Boolean ; begin Result := false ; end; function TIconModifier.ModifyIcon(SourceIndex, DestIndex: Cardinal = 1): Boolean ; begin Result := false ; if Win32PlatForm = VER_PLATFORM_WIN32_NT then Result := ModifyIconForNt(SourceIndex, DestIndex) else Result := ModifyIconFor9x(SourceIndex, DestIndex) ; // not implement now. end; end. example : use IconModifyUnit ; procedure TForm1.Button1Click(Sender: TObject); var im : TIconModifier ; source, dest: String ; begin if OpenDialog1.Execute then source := OpenDialog1.FileName else Exit ; if OpenDialog2.Execute then dest := OpenDialog2.FileName else Exit ; im := TIconModifier.Create(Self) ; im.SourceFile := source ; //a file includes source icon(s), exe or dll format. im.DestFile := dest ; //file includes icon which will be modified. exe or dll. if im.ModifyIcon(1) then MessageBox(Handle,'successful.', 'info', MB_OK + MB_ICONINFORMATION) else MessageBox(Handle,'fail.', 'info', MB_OK + MB_ICONINFORMATION) ; im.Free ; end. |
Re: Exe mit zwei unterschiedlichen Icons
Der Reshacker (getestet mit Version 3.4) arbeitet auch mit Parametern, du mußt der Batch Datei folgende Zeile hinzufügen und die Pfade anpassen:
"ResHacker.exe" -modify "Project1.exe", "ProjectNewIcon.exe", "IconNeu.ico", icon, MAINICON, Folgende Pfade müssen dabei angepasst werden (oder auch nicht): "ResHacker.exe" = Pfad zu Reshacker "Project1.exe" = originale EXE Datei "ProjectNewIcon.exe" = neue EXE Datei mit neuem Icon "IconNeu.ico" = Pfad zum neuen Icon gleicher Größe Die EXE Datei wird dabei automatisch dupliziert. |
Re: Exe mit zwei unterschiedlichen Icons
Perfekt, die Lösung mit Reshacker ist ideal! 1000 Dank!
Hatte gar nicht gesehen das das Kommandozeilen Parameter hat :wall: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:07 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-2025 by Thomas Breitkreuz