auf LazarusResources mit anderem Programm zugreifen
-
- Beiträge: 32
- Registriert: Sa 13. Aug 2011, 16:15
auf LazarusResources mit anderem Programm zugreifen
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
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
-
- 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
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.markkowalt hat geschrieben:kann man auf eine Lazarus-Resource, die ich mit LazarusResources.Find(resname); auch mit einem anderen Programm zugreifen und diese ändern ?
Ä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
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Re: auf LazarusResources mit anderem Programm zugreifen
Sollte funktionieren, kann man ja mit ResourceHacker austesten.Ob die geändert werden können, müsstest du dann noch selbst herausfinden.
Ansonsten, so ein LazResourceHacker könnte manchmal schon sehr nützlich sein.
-
- Beiträge: 32
- Registriert: Sa 13. Aug 2011, 16:15
Re: auf LazarusResources mit anderem Programm zugreifen
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:

Hier ist meine Funktion, mit der ich die Resource in eine exe einfüge:
Folgender Aufruf passt zum Screenshot:
Wie kann ich die Resource nun mit dem Programm auslesen, in das sie auch geschrieben worden ist (es ist dann ja die eigene Resource) ?
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:

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;
Code: Alles auswählen
SetRes('proj2.exe', '99303', 'AFLKD', 5);
Re: auf LazarusResources mit anderem Programm zugreifen
Ganz normal, wie du jede andere Resource auch ausliest?Wie kann ich die Resource nun mit dem Programm auslesen, in das sie auch geschrieben worden ist (es ist dann ja die eigene Resource) ?
-
- Beiträge: 32
- Registriert: Sa 13. Aug 2011, 16:15
Re: auf LazarusResources mit anderem Programm zugreifen
Es ist ja aber keine Lazarusresource, die man über finden kann.
Folgende Funktion funktioniert leider nicht:
Fehlermeldung
der angegebene ressourcentyp wurde nicht in der image-datei gefunden
Code: Alles auswählen
LazarusResources.Find(resname);
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;
der angegebene ressourcentyp wurde nicht in der image-datei gefunden
Re: auf LazarusResources mit anderem Programm zugreifen
Schau mal ob dir FPC-Resource hier weiter hilft
http://wiki.lazarus.freepascal.org/Lazarus_Resources" onclick="window.open(this.href);return false;
http://wiki.lazarus.freepascal.org/Lazarus_Resources" onclick="window.open(this.href);return false;
-
- Beiträge: 32
- Registriert: Sa 13. Aug 2011, 16:15
Re: auf LazarusResources mit anderem Programm zugreifen
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.
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.
-
- 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
markkowalt hat geschrieben: Folgender Aufruf passt zum Screenshot:Code: Alles auswählen
SetRes('proj2.exe', '99303', 'AFLKD', 5);
Fällt dir etwas auf? Du verwendest '99303' als Ressourcennamen und nicht als ID. Du musst einfach den entsprechenden Konstruktor der Klasse TResourceStream verwenden.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); // ...
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 32
- Registriert: Sa 13. Aug 2011, 16:15
Re: auf LazarusResources mit anderem Programm zugreifen
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.

Hier sind die Prozeduren/Funktionen:
Programm (A), das die Daten in das andere Programm (B) schreibt.
A:
B:
Es funktioniert einfach nicht
Mit Hilfe vom Resource Hacker konnte ich sicherstellen, dass die Daten reingeschrieben worden sind.

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

-
- Beiträge: 32
- Registriert: Sa 13. Aug 2011, 16:15
Re: auf LazarusResources mit anderem Programm zugreifen
Wenn es jemanden interessiert:
Hier der gesamte Quellcode. (Anhang)
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