[beendet]Ressourcen in die ausführbare Datei hinein kompilieren
-
- Beiträge: 42
- Registriert: Sa 26. Dez 2020, 13:22
[beendet]Ressourcen in die ausführbare Datei hinein kompilieren
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 ?
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.
- 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
Hä?
oder meinst du lrs-Dateien?
https://wiki.freepascal.org/Lazarus_Resources
Code: Alles auswählen
{$R MeineDatei.res}
https://wiki.freepascal.org/Lazarus_Resources
EDIT: bzw. Wenn es kein GUI-Programm istTo use a Lazarus resource file in your project, include the file with the $I compiler directive in the initialization section of your unit.
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.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
-
- Beiträge: 42
- Registriert: Sa 26. Dez 2020, 13:22
Re: Ressourcen in die ausführbare Datei hinein kompilieren
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.
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.
Re: Ressourcen in die ausführbare Datei hinein kompilieren
Wenn du der Resource-Datei im lazres-Aufruf die Endung .res gibst, entsteht eine .res-Datei, statt .lrs.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.
.rc Dateien schreibst du am besten mit einem Text-Editor.
https://wiki.freepascal.org/Lazarus_Resources
- 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
Wobei die Datei-Endung eigentlich wurscht sein sollte
https://www.freepascal.org/docs-html/pr ... 28500013.1
https://www.freepascal.org/docs-html/pr ... 28500013.1
"Default" impliziert, dass wenn KEINE Datei-Endung in der Directive steht, "res" genommen wird, ansonsten wird der ganze Dateiname inkl. Endung geparstyou can include resources in your executable or library using the {$R filename} directive
.....
The default extension for resource files is .res
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.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
-
- Beiträge: 42
- Registriert: Sa 26. Dez 2020, 13:22
Re: Ressourcen in die ausführbare Datei hinein kompilieren
wenn ich die von lazres erstellte *.lrs mit
einbinde gibts einen KompilierFehler
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
Code: Alles auswählen
{$R MeineRessource.lrs}
Code: Alles auswählen
Error: resource compiler "Select manually" not found, switching to external mode
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
-
- Beiträge: 42
- Registriert: Sa 26. Dez 2020, 13:22
Re: Ressourcen in die ausführbare Datei hinein kompilieren
Hab das so gemacht und jetzt eine .res Datei erhalten. Die schaut auch ganz anders aus als die .lrs Datei.Wenn du der Resource-Datei im lazres-Aufruf die Endung .res gibst, entsteht eine .res-Datei, statt .lrs.
Die lässt sich aber mit
Code: Alles auswählen
{$R MeineRessource.res}
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.
- 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
Was verstehst du unter "18 Dateien"??oliver2104 hat geschrieben: Di 29. Okt 2024, 13:33Hab das so gemacht und jetzt eine .res Datei erhalten. Die schaut auch ganz anders aus als die .lrs Datei.Wenn du der Resource-Datei im lazres-Aufruf die Endung .res gibst, entsteht eine .res-Datei, statt .lrs.
Die lässt sich aber mitins Programm integrieren und alles kompiliert problemlos.Code: Alles auswählen
{$R MeineRessource.res}
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 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.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
- 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
-
- 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
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.
Du könntest alles als Zip-Datei anhängen und mit TUnzip von FCL verwenden.
- 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
Das geht in die Hose wenn man das Programm digital signiert hat.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.
Ausserdem ist f := TResourceStream.Create(hInstance, 'ResName', RT_RCDATA); nun ja auch nicht gerade aufwändig.
- 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
Ganz zu schweigen davon, wie Defender und/oder diverse AV-Programme auf sowas reagieren (Sofern OS=Windows)fliegermichl hat geschrieben: Mi 30. Okt 2024, 10:12Das geht in die Hose wenn man das Programm digital signiert hat.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.
Ausserdem ist f := TResourceStream.Create(hInstance, 'ResName', RT_RCDATA); nun ja auch nicht gerade aufwändig.
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.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
-
- Beiträge: 42
- Registriert: Sa 26. Dez 2020, 13:22
Re: Ressourcen in die ausführbare Datei hinein kompilieren
Danke für die Reaktionen!
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)
Das hab ich schon weiter oben im Thread gesagt.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
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)
- 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
Dann hat dir fliegermichl eigentlich die Lösung gegeben: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)
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)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.
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.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
-
- 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
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.