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/)
-   -   UpdateResource (XML) (https://www.delphipraxis.net/192212-updateresource-xml.html)

DeddyH 29. Mär 2017 17:10

UpdateResource (XML)
 
Ich habe eine Exe, die ich durch eine andere Exe konfigurieren möchte. Als Konfigurationsformat verwende ich XML, welches ich dann in die zu konfigurierende Exe packe. Soweit, so gut, funktioniert auch vordergründig. Nun habe ich evtl. auch noch Binärgedöns (z.B. Grafiken). Also dachte ich mir, das kann ja mit in die XML, einfach Base64-kodieren und feddich is der Lack. Das klappt aber überhaupt nicht, nach EndUpdateResource ist die Exe inne Futt, wie der Sauerländer sagt. Da ich die XML auch noch zwecks späterer Verwendung auf der Festplatte ablege, hab ich mir flugs den ResourceHacker geschnappt und sie dann damit eingefügt, das funktioniert. Hier mein Code:
Delphi-Quellcode:
  Stream := TMemoryStream.Create;
  try
    XML.SaveToStream(Stream);
    ResHandle := BeginUpdateResource(PChar(Filename), false);
    if ResHandle <> 0 then
      try
        Success := UpdateResource(ResHandle, RT_RCDATA, 'config', MakeLangID(LANG_NEUTRAL, SUBLANG_DEFAULT), Stream.Memory, Stream.Size);
      finally
        EndUpdateResource(ResHandle, not Success);
      end;
  finally
    Stream.Free;
  end;
Hat jemand eine Idee, was ich falsch mache? Hülfee!!!einseinself

nahpets 29. Mär 2017 17:40

AW: UpdateResource (XML)
 
Kämpfe immer wieder mit Stream, meist hilft sowas:
Delphi-Quellcode:
XML.SaveToStream(Stream);
Stream.Position := 0;
Nach dem SaveToStream ist dessen Position (vermutlich) immer am Ende des Streams und von der Position aus wird dann weiter gearbeitet. Das dürfte dann hier bei UpdateResource ziemlich in die Hose gehen.

Ist jetzt mal so vermutet ;-)

DeddyH 29. Mär 2017 17:44

AW: UpdateResource (XML)
 
Das hatte ich auch schon versucht, leider war es das nicht. Trotzdem Danke.

Der schöne Günther 29. Mär 2017 18:55

AW: UpdateResource (XML)
 
Mir sind noch zwei Dinge zu UpdateResource aufgefallen. Sie lösen das Problem zwar nicht, aber vielleicht geht es in die Richtung:

Die Doku zu den letzten beiden Parametern sagt:
Zitat:

lpData [in, optional]
Type: LPVOID

The resource data to be inserted into the file indicated by hUpdate. If the resource is one of the predefined types, the data must be valid and properly aligned. Note that this is the raw binary data to be stored in the file indicated by hUpdate, not the data provided by LoadIcon, LoadString, or other resource-specific load functions. All data containing strings or text must be in Unicode format. lpData must not point to ANSI data.

If lpData is NULL and cbData is 0, the specified resource is deleted from the file indicated by hUpdate.
cbData [in]
Type: DWORD

The size, in bytes, of the resource data at lpData.
1) Strings müssen zwingend Unicode sein. Ich habe es versucht, macht keinen Unterschied.
2) Die Größe des Streams nimmt ein DWORD auf, TStream.Size ist aber ein Int64. Also aufpassen dass du nicht mehr alsa 4GB reinstecken willst ;-)

Ich sehe nur dass es mit kleinen Dateien funktioniert, will ich eine 5-10 MB große Textdatei reinstecken, ist die exe kaputt.

Hier brabbelt jemand etwas von einem angeblich sehr kleinen Limit, aber das kann doch nicht sein?
http://stackoverflow.com/q/25748057/2298252

DeddyH 29. Mär 2017 19:01

AW: UpdateResource (XML)
 
Danke, den Thread hatte ich auch schon gelesen, außerdem sagt da ja auch jemand, dass er es mit 5000 Zeichen ohne Probleme hinbekommen hat. Nach meiner Kenntnis gibt es kein festes Limit für RT_RCDATA und wie gesagt, mit dem ResourceHacker geht es ja. Ich muss irgendwo einen blöden Fehler machen.

DeddyH 31. Mär 2017 09:18

AW: UpdateResource (XML)
 
Update: in einem Foreneintrag von 2003 hat Mathias Rauen (madExcept) geschrieben, dass UpdateResource gern einmal die Delphi-Kompilate mit Debug-Infos zerhaut. Also habe ich beide Exen einmal in der Release-Konfiguration erstellt. Damit scheint es zu funktionieren :-D

There must man first once upon come.

Der schöne Günther 31. Mär 2017 09:31

AW: UpdateResource (XML)
 
Ich habe es natürlich auch mit einer Delphi-Exe mit Debug-Infos versucht, das erklärt das wohl :roteyes:

DeddyH 31. Mär 2017 09:35

AW: UpdateResource (XML)
 
Dachte ich mir, kann ja auch keiner ahnen. Danke fürs Nachvollziehen :cheers:


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