Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Resource löschen klappt - EXE wird aber nicht kleiner (https://www.delphipraxis.net/135129-resource-loeschen-klappt-exe-wird-aber-nicht-kleiner.html)

moelski 5. Jun 2009 09:33


Resource löschen klappt - EXE wird aber nicht kleiner
 
Moin !

Ich habe in meinem Installer ein ZIP als Resource eingebunden. Klappt auch wundelbar.
Nun möchte ich aber das ZIP aus dem Installer entfernen (weil ich ihn auch direkt als Unistaller nutzen möchte).

Nun verwende ich folgenden Code:
Delphi-Quellcode:
    if FileExists('Uninstall.exe') then
    begin
      hInst := BeginUpdateResource(Pchar('Uninstall.exe'), false);
      if hInst > 0 then
        try
          UpdateResource(hInst, RT_RCDATA, 'INSTALLZIP', LANG_NEUTRAL, NIL, 0);
        finally
          EndUpdateResource(hInst, false);
        end;
    end;
Der löscht mir auch die Resource raus (kann man im Res Editor sehen), aber die Dateigröße bleibt gleich.

Kann mir jemand sagen wie ich eine Resource lösche (oder eher besser den Inhalt auf 0 Byte setze) und wo sich dann aber auch die EXE Datei in der Größe anpasst?

jaenicke 5. Jun 2009 09:43

Re: Resource löschen klappt nur teilweise
 
Am besten häng die Dateien nur an, dann musst du nicht mit Ressourcen arbeiten. Dafür habe ich hier eine einfache Streamklasse veröffentlicht. ;-)
http://www.delphipraxis.net/internal....php?p=1043105
Da der Installer ohnehin Adminrechte hat, ist das auch problemlos damit möglich.

Beim Übernehmen der Anhangsdaten muss ggf. etwas angepasst werden, aber es ist ja Open Source.

Das mit den Ressourcen werde ich mir dennoch einmal anschauen, aber ich halte diese Lösung für einen Installer für weniger praktikabel.

moelski 5. Jun 2009 09:47

Re: Resource löschen klappt nur teilweise
 
Moin !

Zitat:

, aber ich halte diese Lösung für einen Installer für weniger praktikabel
Nunja, ich sag mal so ... Es funktioniert.
So übel finde ich die Lösung mit Resourcen gar nicht und ich möchte jetzt auch nicht alles wieder umschreiben.

Ich glaube mein Problem liegt daran das die ImageSize neu berechnet und gesetzt werden muss für die EXE.
Aber habe noch keinen Schimmer wie man das anstellen kann. :gruebel:

Der Resource Tuner macht nämlich genau das und da passt am Ende dann auch die Größe wieder.

jaenicke 5. Jun 2009 10:44

Re: Resource löschen klappt - EXE wird aber nicht kleiner
 
Wie wäre es, wenn du den Rückgabewert der Funktionen nicht ignorierst? Das sagt mir nämlich, dass da ein "falscher Parameter" bei UpdateResource wäre, was dann bei EndUpdateResource zu einem internen Fehler führt. Wobei ich das hier gerade mit Vista teste, XP müsste ich in einem virtuellen PC erst starten.
Delphi-Quellcode:
        if UpdateResource(hInst, RT_RCDATA, 'INSTALLZIP', LANG_NEUTRAL, NIL, 0) then
          ShowMessage('erfolgreich')
        else
          ShowMessage(SysErrorMessage(GetLastError()));
      finally
        if EndUpdateResource(hInst, false) then
          ShowMessage('erfolgreich')
        else
          ShowMessage(SysErrorMessage(GetLastError()));
      end;

moelski 5. Jun 2009 10:53

Re: Resource löschen klappt - EXE wird aber nicht kleiner
 
Meldet beides "erfolgreich".

Das hätte ich mir auch denken können denn wie geschrieben kann man ja danach im Resource Editor sehen das die Resource wirklich weg ist. Und die EXE lässt sich dann auch noch starten.

jaenicke 5. Jun 2009 11:02

Re: Resource löschen klappt - EXE wird aber nicht kleiner
 
Hmm, dann weiß ich auch nicht, ob man da etwas dran ändern kann. :stupid:

moelski 5. Jun 2009 11:05

Re: Resource löschen klappt - EXE wird aber nicht kleiner
 
Evtl. hat ja noch jemand hier ne Idee.
Wie gesagt ich vermute man muss die "SizeOfImage" anpassen.
Aber ich kann dazu in der MSDN nix finden und auch eine Suche im Web/Forum hat mich noch nicht weitergebracht.

jaenicke 5. Jun 2009 11:36

Re: Resource löschen klappt - EXE wird aber nicht kleiner
 
Nur weil man den Wert im PE-Header anpasst, ändert sich die Größe der Datei ja nicht. Die Frage ist was beim Löschen der Ressource dann eigentlich gemacht wird. Hast du einmal mit einem Hexeditor geschaut, ob die Ressource weiter enthalten ist?
Zudem: Was passiert, wenn du die Daten der Ressource mit Daten mit nur einem Byte Größe ersetzt? Und wenn das nicht klappt: Was, wenn die Daten größer sind, zumindest dann muss sich die Größe ja ändern.

moelski 5. Jun 2009 11:43

Re: Resource löschen klappt - EXE wird aber nicht kleiner
 
Moin !

Zitat:

Die Frage ist was beim Löschen der Ressource dann eigentlich gemacht wird
Eher as noch gemacht werden muss ...

Zitat:

Hast du einmal mit einem Hexeditor geschaut, ob die Ressource weiter enthalten ist?
Nein, aber da sich die Dateigröße kein Byte ändert ist entweder der Platz noch reseviert, oder aber der Eintarg für die Resource ist noch weg aber die Daten noch da.

Zitat:

Was passiert, wenn du die Daten der Ressource mit Daten mit nur einem Byte Größe ersetzt
Die Größe bleibt.

Zitat:

Was, wenn die Daten größer sind, zumindest dann muss sich die Größe ja ändern.
Öhm das habe ich jetzt noch nicht getestet. Ist ja auch genau der Gegensatz zu dem was ich brauche.
Kann ich aber mal spasshalber testen.

moelski 5. Jun 2009 11:52

Re: Resource löschen klappt - EXE wird aber nicht kleiner
 
Moin !

Wenn die hinzuzufügenden Daten größer sind als die jetzigen Daten, dann wird die EXE nach dem Update größer.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 Uhr.
Seite 1 von 2  1 2      

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