Code-Beispiel
Dateien ins Kompilat einbinden
Lizenz: | Erster Autor: | Letzte Bearbeitung: |
WTFPL | theta | 13.08.2015 |
Manchmal kommt es vor, dass man Dateien wie Bilder oder die erste Version einer Konfigurationsdatei nicht im Ordner "herumschleppen" möchte, sondern möchte, dass die Datei im Executable integriert ist.
Dazu gibt es grundsätzlich mehrere Vorgehensweisen, wobei eine besonders einfache durch folgenden Code-Schnippsel realisiert wird.
Der Dreh- und Angelpunkt ist die Assembler-Direktive .incbin die eine Datei einfach mit in das Kompilat einarbeitet.
'Das interne Format der FB-Strings ausnutzend, folgende Makros zur Manipulation der Strings
#Macro stptr(x) 'Pointer auf String abfragen und ändern
*(Cast(Integer Ptr,@x))
#EndMacro
#Macro StrLen(x) 'Länge eines Strings abfragen und ändern
*(Cast(Integer Ptr,@x)+1)
#EndMacro
#Macro StrAlloc(x) 'wie viel alloziert ist abfragen und ändern
*(Cast(Integer Ptr,@x)+2)
#EndMacro
#Macro IncludeBinary(datei,_alias)
'datei ist der Name
'_alias der Name der Funktion mit der dann im Programm der Dateiinhalt zurückgegeben wird
Asm
jmp _alias##_ende 'Daten sollen nicht ausgeführt werden
_alias##_start:
.incbin datei
_alias##_ende:
End Asm
Dim Shared As String _alias##_string 'muss global sein, damit nichts (vorzeitig) dealloziert wird
'einfacher wäre es mit einem ZString Ptr aber in Binärdateien kommt meist irgendwo ein \0
Function _alias() As String
'hier wird ein FB-String so manipuliert,
'dass er eigentlich auf die in die Code-Sektion eingebundene Datei verweist
Dim As Integer start,stopp
Asm
mov eax,offset _alias##_start
mov [start],eax
mov eax,offset _alias##_ende
mov [stopp],eax
End Asm
stptr(_alias##_string) = start
strlen(_alias##_string) = stopp-start
stralloc(_alias##_string) = stopp-start
Return _alias##_string
End Function
#EndMacro
IncludeBinary("testdatei.txt",ausleseFunktion)
Dim As String daten = ausleseFunktion()
Print daten
Sleep
Und hier testdatei.txt
Hier steht der Inhalt der eingebundenen Datei. Das geht auch mit Binaerdaten wie mit Bildern, Programmen, Audios, ...
Da dadurch die Dateigröße des Kompilats rapide ansteigen kann, kann man versuchen es mit dem Packer
upx zu "behandeln".
Zusätzliche Informationen und Funktionen |
- Das Code-Beispiel wurde am 13.08.2015 von
theta angelegt.
- Die aktuellste Version wurde am 13.08.2015 von
theta gespeichert.
|
|