[beendet]Ressourcen in die ausführbare Datei hinein kompilieren

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
oliver2104
Beiträge: 42
Registriert: Sa 26. Dez 2020, 13:22

[beendet]Ressourcen in die ausführbare Datei hinein kompilieren

Beitrag von oliver2104 »

Hallo,
habe mir mit dem Kommando lazres eine Ressourcendatei erstellt.
Jetzt sollte man lt. Doku die Unit: LResources unter uses anführen.
LResources braucht dann auch noch LCLBase.
Mein Projekt ist aber ein einfaches Kommandozeilenprogramm und L* units bräuchte ich gar nicht.
Gibt es für Kommandozeilenprogramme keine entsprechende Unit für Ressourcen ?
Zuletzt geändert von oliver2104 am Di 5. Nov 2024, 12:31, insgesamt 1-mal geändert.

Benutzeravatar
Zvoni
Beiträge: 182
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Ressourcen in die ausführbare Datei hinein kompilieren

Beitrag von Zvoni »

Hä?

Code: Alles auswählen

{$R MeineDatei.res}
oder meinst du lrs-Dateien?
https://wiki.freepascal.org/Lazarus_Resources
To use a Lazarus resource file in your project, include the file with the $I compiler directive in the initialization section of your unit.
EDIT: bzw. Wenn es kein GUI-Programm ist
Adding resources to your program

Let's review the situation when you need to store some data inside your executable and during the program run you want to extract this data from it.

First we need to tell the compiler what files to include in the resource. We do this in a .rc (resource script) file: mydata.rc file:

MYDATA RCDATA "mydata.dat"

Here MYDATA is the resource name, RCDATA is the type of resource (look here http://msdn.microsoft.com/en-us/library ... S.85).aspx for explanation of possible types) and "mydata.dat" is your data file.

Let's instruct the compiler to include the resource into your project:

program mydata;

{$R mydata.rc}
begin
end.

Behind the scenes, the FPC compiler actually instructs the resource compiler distributed with FPC to follow the .rc script to compile your data files into a binary .res resource file. The linker will then include this into the executable. Though this is transparent to the programmer, you can, if you want to, create your own .res file with e.g. the Borland resource compiler. Instead of using {$R mydata.rc} you'd use {$R mydata.res}.
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

oliver2104
Beiträge: 42
Registriert: Sa 26. Dez 2020, 13:22

Re: Ressourcen in die ausführbare Datei hinein kompilieren

Beitrag von oliver2104 »

Danke für die Antwort,
es geht um ein SDL2 Projekt (das bräuchte keine LCL Komponenten)
Was es aber braucht sind einige (*.mp3, *.png und *.ttf) Dateien.
Die möchte ich gerne mit hinein kompilieren. Wie ist eigentlich egal.

Hab's jetzt mal mit lazres und einer filelist probiert und darauf eine *.lrs Datei erhalten.

Wüsste z.b. jetzt aber nicht wie ich aus meinen Ressourcen (ca. 20 Dateien)
eine *.res oder *.rc Datei erstellen soll.

Das Problem ist oft, aus der Vielzahl der Infos im Net, die passende Doku zu finden.

wp_xyz
Beiträge: 5050
Registriert: Fr 8. Apr 2011, 09:01

Re: Ressourcen in die ausführbare Datei hinein kompilieren

Beitrag von wp_xyz »

oliver2104 hat geschrieben: Di 22. Okt 2024, 12:34 Hab's jetzt mal mit lazres und einer filelist probiert und darauf eine *.lrs Datei erhalten.

Wüsste z.b. jetzt aber nicht wie ich aus meinen Ressourcen (ca. 20 Dateien)
eine *.res oder *.rc Datei erstellen soll.
Wenn du der Resource-Datei im lazres-Aufruf die Endung .res gibst, entsteht eine .res-Datei, statt .lrs.

.rc Dateien schreibst du am besten mit einem Text-Editor.

https://wiki.freepascal.org/Lazarus_Resources

Benutzeravatar
Zvoni
Beiträge: 182
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Ressourcen in die ausführbare Datei hinein kompilieren

Beitrag von Zvoni »

Wobei die Datei-Endung eigentlich wurscht sein sollte
https://www.freepascal.org/docs-html/pr ... 28500013.1
you can include resources in your executable or library using the {$R filename} directive
.....
The default extension for resource files is .res
"Default" impliziert, dass wenn KEINE Datei-Endung in der Directive steht, "res" genommen wird, ansonsten wird der ganze Dateiname inkl. Endung geparst

Code: Alles auswählen

{$R MeineRessource.lrs}
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

oliver2104
Beiträge: 42
Registriert: Sa 26. Dez 2020, 13:22

Re: Ressourcen in die ausführbare Datei hinein kompilieren

Beitrag von oliver2104 »

wenn ich die von lazres erstellte *.lrs mit

Code: Alles auswählen

{$R MeineRessource.lrs}
einbinde gibts einen KompilierFehler

Code: Alles auswählen

Error: resource compiler "Select manually" not found, switching to external mode
In den Dokus wird auch windres zum erstellen von Ressourcen verwendet.
Mein Projekt wär aber für Linux, da hab ich nur lazres.
Muss mir das alles noch genauer anschauen. (kann einige Tage dauern)
Bis dahin nochmals Danke !!1

oliver2104
Beiträge: 42
Registriert: Sa 26. Dez 2020, 13:22

Re: Ressourcen in die ausführbare Datei hinein kompilieren

Beitrag von oliver2104 »

Wenn du der Resource-Datei im lazres-Aufruf die Endung .res gibst, entsteht eine .res-Datei, statt .lrs.
Hab das so gemacht und jetzt eine .res Datei erhalten. Die schaut auch ganz anders aus als die .lrs Datei.
Die lässt sich aber mit

Code: Alles auswählen

{$R MeineRessource.res}
ins Programm integrieren und alles kompiliert problemlos.
Die Endung ist nicht wichtig, aber das Dateiformat muss schon passen.
Hab also diese .res (enthält 18 Dateien) zur ausführbaren Datei hinzugefügt. (Datei ist entsprechend größer geworden)
Wie kann ich jetzt diese 18 Dateien ansprechen bzw. auslesen ?
In meinem Programm würd ich einen String brauchen der einen Dateinamen bzw. -pfad beinhaltet.

Benutzeravatar
Zvoni
Beiträge: 182
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Ressourcen in die ausführbare Datei hinein kompilieren

Beitrag von Zvoni »

oliver2104 hat geschrieben: Di 29. Okt 2024, 13:33
Wenn du der Resource-Datei im lazres-Aufruf die Endung .res gibst, entsteht eine .res-Datei, statt .lrs.
Hab das so gemacht und jetzt eine .res Datei erhalten. Die schaut auch ganz anders aus als die .lrs Datei.
Die lässt sich aber mit

Code: Alles auswählen

{$R MeineRessource.res}
ins Programm integrieren und alles kompiliert problemlos.
Die Endung ist nicht wichtig, aber das Dateiformat muss schon passen.
Hab also diese .res (enthält 18 Dateien) zur ausführbaren Datei hinzugefügt. (Datei ist entsprechend größer geworden)
Wie kann ich jetzt diese 18 Dateien ansprechen bzw. auslesen ?
In meinem Programm würd ich einen String brauchen der einen Dateinamen bzw. -pfad beinhaltet.
Was verstehst du unter "18 Dateien"??
Was genau sind denn diese Ressourcen?
Und was willst du damit anstellen?
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1539
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Ressourcen in die ausführbare Datei hinein kompilieren

Beitrag von fliegermichl »


Soner
Beiträge: 713
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Ressourcen in die ausführbare Datei hinein kompilieren

Beitrag von Soner »

Ein anderer Trick was man früher, wahrscheinlich immer noch, für die selbst entpackende Archive verwendete ist, dass man die Datei mit einem zweiten Programm am Ende des Programms anhängt und ganz zum Schluss fügt man eine Zahl, welche die Größe der angehängten Datei angibt.
Du könntest alles als Zip-Datei anhängen und mit TUnzip von FCL verwenden.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1539
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Ressourcen in die ausführbare Datei hinein kompilieren

Beitrag von fliegermichl »

Soner hat geschrieben: Di 29. Okt 2024, 20:41 Ein anderer Trick was man früher, wahrscheinlich immer noch, für die selbst entpackende Archive verwendete ist, dass man die Datei mit einem zweiten Programm am Ende des Programms anhängt und ganz zum Schluss fügt man eine Zahl, welche die Größe der angehängten Datei angibt.
Du könntest alles als Zip-Datei anhängen und mit TUnzip von FCL verwenden.
Das geht in die Hose wenn man das Programm digital signiert hat.
Ausserdem ist f := TResourceStream.Create(hInstance, 'ResName', RT_RCDATA); nun ja auch nicht gerade aufwändig.

Benutzeravatar
Zvoni
Beiträge: 182
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Ressourcen in die ausführbare Datei hinein kompilieren

Beitrag von Zvoni »

fliegermichl hat geschrieben: Mi 30. Okt 2024, 10:12
Soner hat geschrieben: Di 29. Okt 2024, 20:41 Ein anderer Trick was man früher, wahrscheinlich immer noch, für die selbst entpackende Archive verwendete ist, dass man die Datei mit einem zweiten Programm am Ende des Programms anhängt und ganz zum Schluss fügt man eine Zahl, welche die Größe der angehängten Datei angibt.
Du könntest alles als Zip-Datei anhängen und mit TUnzip von FCL verwenden.
Das geht in die Hose wenn man das Programm digital signiert hat.
Ausserdem ist f := TResourceStream.Create(hInstance, 'ResName', RT_RCDATA); nun ja auch nicht gerade aufwändig.
Ganz zu schweigen davon, wie Defender und/oder diverse AV-Programme auf sowas reagieren (Sofern OS=Windows)

Womit wir auf meine ursprüngliche Frage zurückkommen:
Was sind das für "Ressourcen" (Diese 18 Dateien) und was willst du damit anstellen?
Da es sich um eine Konsolen-Anwendung handelt, gehe ich mal von aus, dass es keine Bilder/Grafiken sind
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

oliver2104
Beiträge: 42
Registriert: Sa 26. Dez 2020, 13:22

Re: Ressourcen in die ausführbare Datei hinein kompilieren

Beitrag von oliver2104 »

Danke für die Reaktionen!
Womit wir auf meine ursprüngliche Frage zurückkommen:
Was sind das für "Ressourcen" (Diese 18 Dateien) und was willst du damit anstellen?
Da es sich um eine Konsolen-Anwendung handelt, gehe ich mal von aus, dass es keine Bilder/Grafiken sind
Das hab ich schon weiter oben im Thread gesagt.
es geht um ein SDL2 Projekt (das bräuchte keine LCL Komponenten)
Was es aber braucht sind einige (*.mp3, *.png und *.ttf) Dateien.
Die möchte ich gerne mit hinein kompilieren. Wie ist eigentlich egal.
Mein Ziel wäre es, nur die ausführbare Datei (mit einkompilierten Ressourcen) an andere weiterzugeben.
Möchte die Ressoucen nicht als *.mp3, *.png und *.ttf weitergeben. (kann jeder verändern und das Prog läuft dann ev. gar nicht mehr wie gewünscht)

Benutzeravatar
Zvoni
Beiträge: 182
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Ressourcen in die ausführbare Datei hinein kompilieren

Beitrag von Zvoni »

oliver2104 hat geschrieben: Mi 30. Okt 2024, 13:46 Das hab ich schon weiter oben im Thread gesagt.
es geht um ein SDL2 Projekt (das bräuchte keine LCL Komponenten)
Was es aber braucht sind einige (*.mp3, *.png und *.ttf) Dateien.
Die möchte ich gerne mit hinein kompilieren. Wie ist eigentlich egal.
Mein Ziel wäre es, nur die ausführbare Datei (mit einkompilierten Ressourcen) an andere weiterzugeben.
Möchte die Ressoucen nicht als *.mp3, *.png und *.ttf weitergeben. (kann jeder verändern und das Prog läuft dann ev. gar nicht mehr wie gewünscht)
Dann hat dir fliegermichl eigentlich die Lösung gegeben:
fliegermichl hat geschrieben: Mi 30. Okt 2024, 10:12 Ausserdem ist f := TResourceStream.Create(hInstance, 'ResName', RT_RCDATA); nun ja auch nicht gerade aufwändig.
Auf die Ressourcen greifst du mit einem ResourceStream zu, welchen du dann an andere Streams weitergeben kannst (Bsp. wie du eine mp3 abspielen würdest, sofern sie als Datei vorliegen würde)
Manche Klassen (Bsp. TImage - siehe wiki-links oben) haben sogar direkte Methoden LoadFromResource oder so ähnlich
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Sieben
Beiträge: 281
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Ressourcen in die ausführbare Datei hinein kompilieren

Beitrag von Sieben »

Du brauchst im übrigen auch gar keine *.res oder *.lrs zu erstellen, sondern kannst die Dateien auch über Projekt -> Optionen -> Ressourcen direkt ein- bzw angeben. Das hat ua den Vorteil, dass du auch bei einer Änderung der Ressourcedateien deine Ressourcen nicht neu kompilieren musst, du musst nur dafür sorgen, dass immer die aktuelle Version deiner Dateien in dem Pfad liegt, denn du bei der Einbindung der Dateien (implizit, über den FileOpen-Dialog) angegeben hast. Praktischerweise bindest du sie direkt von dem Ort ein, an dem sie auch gepflegt werden. Dann werden sie bei jedem Compile automatisch frisch gezogen.

Antworten