auf LazarusResources mit anderem Programm zugreifen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
markkowalt
Beiträge: 32
Registriert: Sa 13. Aug 2011, 16:15

auf LazarusResources mit anderem Programm zugreifen

Beitrag von markkowalt »

Hallo,

kann man auf eine Lazarus-Resource, die ich mit LazarusResources.Find(resname); auch mit einem anderen Programm zugreifen und diese ändern ?

Meine Idee ist es, mit einem Programm gewisse Daten von einem anderen Programm zu ändern, die als LazarusResource vorliegen.

Danke für Hilfe

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: auf LazarusResources mit anderem Programm zugreifen

Beitrag von Socke »

markkowalt hat geschrieben:kann man auf eine Lazarus-Resource, die ich mit LazarusResources.Find(resname); auch mit einem anderen Programm zugreifen und diese ändern ?
Um darauf zuzugreifen müsste dein Programm eigene Funktionen mitbringen und diese nach außen verfügbar machen. Windows-Programme können wie Bibliotheken einen exports-Abschnitt besitzten.

Ändern kannst du die Ressourcen mit vertretbarem Aufwand nicht (du müsstest die Ressource als Bestandteil der Programmdatei verändern, was sehr unzuverlässig ist).

Wenn die Ressourcen aber als Windows-Ressourcen in die Programmdatei hineingelinkt werden, kann jedes Programm von außen über die Windows-API lesend darauf zugreifen. Ob die geändert werden können, müsstest du dann noch selbst herausfinden. Unter Linux sind die Ressourcen im Windows-Stil eine FPC-Besonderheit; hier wird traditionell alles im Dateisystem als eigene Dateien abgelegt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: auf LazarusResources mit anderem Programm zugreifen

Beitrag von DiBo33 »

Ob die geändert werden können, müsstest du dann noch selbst herausfinden.
Sollte funktionieren, kann man ja mit ResourceHacker austesten.

Ansonsten, so ein LazResourceHacker könnte manchmal schon sehr nützlich sein.

markkowalt
Beiträge: 32
Registriert: Sa 13. Aug 2011, 16:15

Re: auf LazarusResources mit anderem Programm zugreifen

Beitrag von markkowalt »

Danke für die Antworten.

Habe es mit dem mehr oder weniger bekannten ResourceHacker mal getestet, und auch meine Resourcen gefunden.

Hier kann man sehen, wie es im ResourceHacker angezeigt wird:
Bild

Hier ist meine Funktion, mit der ich die Resource in eine exe einfüge:

Code: Alles auswählen

function SetRes(filename, resname, resvalue: string; resid: word): boolean;
var
  hUpdate: THandle;
  Size:    DWord;
begin
  hUpdate := BeginUpdateResource(PChar(filename), Form1.CheckBox1.Checked);
  if (hUpdate <> 0) and (hUpdate <> INVALID_HANDLE_VALUE) then
  begin
    try
      Size   := Succ(Length(resvalue)) * SizeOf(char);
      Result := UpdateResource(hUpdate, RT_RCDATA, PChar(resname),
        resid, PChar(resvalue), Size);
    finally
      EndUpdateResource(hUpdate, False);
    end;
  end;
end;
Folgender Aufruf passt zum Screenshot:

Code: Alles auswählen

SetRes('proj2.exe', '99303', 'AFLKD', 5);
Wie kann ich die Resource nun mit dem Programm auslesen, in das sie auch geschrieben worden ist (es ist dann ja die eigene Resource) ?

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: auf LazarusResources mit anderem Programm zugreifen

Beitrag von DiBo33 »

Wie kann ich die Resource nun mit dem Programm auslesen, in das sie auch geschrieben worden ist (es ist dann ja die eigene Resource) ?
Ganz normal, wie du jede andere Resource auch ausliest?

markkowalt
Beiträge: 32
Registriert: Sa 13. Aug 2011, 16:15

Re: auf LazarusResources mit anderem Programm zugreifen

Beitrag von markkowalt »

Es ist ja aber keine Lazarusresource, die man über

Code: Alles auswählen

LazarusResources.Find(resname);
finden kann.

Folgende Funktion funktioniert leider nicht:

Code: Alles auswählen

function GetResValue(resid: word): string;
var
  RS: TResourceStream;
begin
  try
    RS := TResourceStream.CreateFromID(hinstance, resid, RT_RCDATA);
    RS.Free;
    ShowMessage('gefunden');
    SetString(Result, RS.Memory, RS.Size);
  except
// error-handling
    Result := '';
  end;
end;
Fehlermeldung
der angegebene ressourcentyp wurde nicht in der image-datei gefunden

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: auf LazarusResources mit anderem Programm zugreifen

Beitrag von DiBo33 »

Schau mal ob dir FPC-Resource hier weiter hilft
http://wiki.lazarus.freepascal.org/Lazarus_Resources" onclick="window.open(this.href);return false;

markkowalt
Beiträge: 32
Registriert: Sa 13. Aug 2011, 16:15

Re: auf LazarusResources mit anderem Programm zugreifen

Beitrag von markkowalt »

Ich arbeite ja nicht mit Lazarusresourcen.

Wie kann ich denn die Resource auslesen, die ich in die exe-Datei geschrieben habe ?
Mit dem Resource Hacker kann ich sie mir ja anzeigen lassen.

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: auf LazarusResources mit anderem Programm zugreifen

Beitrag von Socke »

markkowalt hat geschrieben: Folgender Aufruf passt zum Screenshot:

Code: Alles auswählen

SetRes('proj2.exe', '99303', 'AFLKD', 5);
markkowalt hat geschrieben:Folgende Funktion funktioniert leider nicht:

Code: Alles auswählen

function GetResValue(resid: word): string;
var
  RS: TResourceStream;
begin
  try
    RS := TResourceStream.CreateFromID(hinstance, resid, RT_RCDATA);
// ...
Fällt dir etwas auf? Du verwendest '99303' als Ressourcennamen und nicht als ID. Du musst einfach den entsprechenden Konstruktor der Klasse TResourceStream verwenden.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

markkowalt
Beiträge: 32
Registriert: Sa 13. Aug 2011, 16:15

Re: auf LazarusResources mit anderem Programm zugreifen

Beitrag von markkowalt »

Habe es mit Create statt CreateFromId versucht, aber es funktioniert nicht.
Mit Hilfe vom Resource Hacker konnte ich sicherstellen, dass die Daten reingeschrieben worden sind.

Bild

Hier sind die Prozeduren/Funktionen:

Programm (A), das die Daten in das andere Programm (B) schreibt.
A:

Code: Alles auswählen

function SetRes(filename, resname, resvalue: string; resid: word): boolean;
var
  hUpdate: THandle;
  Size:    DWord;
begin
  hUpdate := BeginUpdateResource(PChar(filename), Form1.CheckBox1.Checked);
  if (hUpdate <> 0) and (hUpdate <> INVALID_HANDLE_VALUE) then
  begin
    try
      Size   := Succ(Length(resvalue)) * SizeOf(char);
      Result := UpdateResource(hUpdate, RT_RCDATA, PChar(resname),
        resid, PChar(resvalue), Size);
    finally
      EndUpdateResource(hUpdate, False);
    end;
  end;
end;
 
SetRes(f, Edit1.Text, Edit2.Text, 0);  // liefert True

B:

Code: Alles auswählen

function TForm1.GetResValue(resname: string): string;
var
  RS: TResourceStream;
begin
  try
    RS := TResourceStream.Create(hinstance, resname, RT_RCDATA);
    RS.Free;
    ShowMessage('gefunden');
    SetString(Result, RS.Memory, RS.Size);
  except
    // error handling
    Result := '';
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(GetResValue(Edit1.Text));
end;

Es funktioniert einfach nicht :x

markkowalt
Beiträge: 32
Registriert: Sa 13. Aug 2011, 16:15

Re: auf LazarusResources mit anderem Programm zugreifen

Beitrag von markkowalt »

Wenn es jemanden interessiert:
Hier der gesamte Quellcode. (Anhang)
Dateianhänge
120314_Build.zip
A schreibt Daten in B. (scheint zu klappen)
B soll diese lesen (geht aber nicht...)
(2.33 MiB) 85-mal heruntergeladen

Antworten