Buchempfehlung
Visual Basic 6 Kochbuch
Visual Basic 6 Kochbuch
Viele praktische Tipps zum Programmieren mit Visual Basic 6, die sich oft auch auf FB übertragen lassen. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » Dateien und Laufwerke

Dateien ins Kompilat einbinden

Lizenz:Erster Autor:Letzte Bearbeitung:
WTFPLMitgliedtheta 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 Externer Link!upx zu "behandeln".


Zusätzliche Informationen und Funktionen
  • Das Code-Beispiel wurde am 13.08.2015 von Mitgliedtheta angelegt.
  • Die aktuellste Version wurde am 13.08.2015 von Mitgliedtheta gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen