Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   FreePascal UpdateResource: Daten einbinden (https://www.delphipraxis.net/167105-updateresource-daten-einbinden.html)

thomasschaf 13. Mär 2012 16:52

UpdateResource: Daten einbinden
 
Hallo,

ich möchte Daten in einer exe-Datei ändern (die auch von mir stammt).
Dazu will ich diesen Code benutzen:
Delphi-Quellcode:
function SetRes(filename, resname, resvalue: string): boolean;
var
  hUpdate: THandle;
  Size:   DWord;
begin
  hUpdate := BeginUpdateResource(PChar(filename), false); // <-- oder auf true?
  if (hUpdate <> 0) and (hUpdate <> INVALID_HANDLE_VALUE) then
  begin
    try
      Size  := Succ(Length(resvalue)) * SizeOf(char);
      Result := UpdateResource(hUpdate, RT_RCDATA, PChar(resname),
        0, PChar(resvalue), Size);
    finally
      EndUpdateResource(hUpdate, False);
    end;
  end;
end;
Allerdings scheint es so, dass ich keine neuen Datensätze hinzufügen kann, sondern nur bestehende ändern. Ich habe zum Test auf irgendeine exe-Datei den obigen Code angewendet und im Hex-Editor festgestellt, dass die Daten nicht hinzugefügt worden sind.

Wie muss ich mein Programm, in das die Daten geschrieben werden sollen, also darauf vorbereiten/ihm erlauben, in es geschrieben zu werden ?

Vielen Dank

DeddyH 13. Mär 2012 17:32

AW: UpdateResource: Daten einbinden
 
Was sagt denn GetLastError, wenn UpdateResource fehlschlägt? Übrigens ist die "Remarks"-Sektion im MSDN ganz interessant, vielleicht findet man ja dort eine mögliche Ursache.

thomasschaf 13. Mär 2012 17:54

AW: UpdateResource: Daten einbinden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zunächst noch:
1. Idee: siehe Anmerkung im Quelltext, möglicherweise false auf true umstellen ?
2. Idee: Ist es denn überhaupt möglich, solche Daten mit UpdateResource in irgendeine exe-Datei hinzuzufügen ?

Und schließlich:
3. UpdateResource schlägt nicht fehl. Mit meiner Funktion setres bekomme ich True zurück.

Edit:
4. Ich habe herausgefunden, dass die Daten doch in die exe geschrieben werden (fast ganz ans Ende), konnte sie aber nicht finden da der Resourcenname mit Leerzeichen aufgefüllt war.

So sieht es aus: (siehe Anhang)
Dabei ist der Resourcenname "resname1", der zugehörige Wert "resvalue1".

DeddyH 13. Mär 2012 18:05

AW: UpdateResource: Daten einbinden
 
Zu 1: wenn ich das MSDN richtig verstehe, sollte das in Deinem Fall egal sein, da Du ja eh UpdateResource aufrufst.
Zu 2: ich habe dort auf die Schnelle nichts Gegenteiliges gelesen.
Zu 3: auch dann, wenn Du sie mal ordentlich initialisierst?

thomasschaf 13. Mär 2012 18:08

AW: UpdateResource: Daten einbinden
 
Siehe Edit im obigen Post.

Wie kann ich nun die Daten im Programm auslesen, in das sie geschrieben worden sind ?

DeddyH 13. Mär 2012 18:16

AW: UpdateResource: Daten einbinden
 
Zitat:

All data containing strings or text must be in Unicode format. lpData must not point to ANSI data.
Das dürfte ggf. die Länge erklären. Zum Auslesen: ich denke, mit einem TResourceStream (ob es den auch unter Lazarus gibt, weiß ich nicht, vermute es aber einfach mal) sollte das zu bewerkstelligen sein.

thomasschaf 13. Mär 2012 19:02

AW: UpdateResource: Daten einbinden
 
Ja, den gibt es.

Mein Code bis jetzt:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  RS: TResourceStream;
  s: string;
begin
  RS := TResourceStream.Create(HInstance, Edit1.Text, RT_RCDATA);

  SetString(s, RS.Memory, RS.Size);

  ShowMessage(s);
end;
Fehlermeldung:
Resource "...(der Name von Edit1.Text)" not found.

Warum wird sie nicht gefunden ?
Es ist definitiv der gleiche Name, den die gesuchte Resource hier trägt und die, die ich eingetragen habe.

Edit:
Die Fehlermeldung über Getlasterr.r:
Der angegebene Ressourcentyp wurde nicht in der Image-Datei gefunden.


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