das Einfügen von Grafiken und Sounds. Es ist jedoch möglich, alle Dateitypen
in ein Executable einzubinden und später wieder zu "catchen".
Das ist insbesondere dann nützlich, wenn man eine Standalone-Setup.exe für ein Programm
erstellen will, die sich selbst entpackt und alle DLLs, Bitmaps oder sonstige Dateien
aus sich heraus erstellen kann. Da mit Pointern gearbeitet wird und somit in der
CatchFile()-Prozedur keine Codespezifischen Variablen vorkommen, sollte der Code in
allen anderen Codes problemlos einzubinden sein. Zudem kann durch die Arbeit mit Pointern
die Prozedur beliebig oft für verschiedene Dateien verwendet werden.
Code: Alles auswählen
DataSection
filestart: ;StartLabel (Position)
IncludeBinary "C:\WINDOWS\explorer.exe" ;...oder irgendeine andere Datei (hab hier den
;Explorer gewählt, damit der Code, ohne umgeschrieben
;werden zu müssen, getestet werden kann)
fileend: ;EndLabel (Position) wichtig zum berechnen
;der Datenlänge (siehe unten)
EndDataSection
Procedure CatchFile(FileID,FileName$,Includesection,Length)
;FileID : FileID ist die #FileID, die die Datei später erhalten wird.
;FileName : Es wird die Datei mit dem Namen FileName$ erstellt
;IncludeSection : Als IncludeSection muss der Pointer auf das StartLabel
; des IncludeBinary angegeben werden (hier: ?filestart)
;Length : Length als Datenlänge berechnet sich als Differenz von EndPointer
; und StartPointer des betroffenen IncludeBinarys.
; Handelt es sich um mehrere IncludeBinaries, kann als
; EndPointer auch das StartLabel des nächsten IncludeBinarys
; angegeben werden:
;
; DataSection
; file1:
; IncludeBinary "C:\WINDOWS\notepad.exe"
; file2:
; IncludeBinary "C:\WINDOWS\system32\logon.scr"
; endfiles:
; EndDataSection
;
; In diesem Fall wäre Length der ersten Datei gleich
; ?file2-?file1 und als IncludeSection müsste ?file1 angegeben werden.
; Die letzte Datei in einem solchen DataSection-Block muss natürlich
; ein eigenes EndLabel erhalten (hier: ?endfiles).
If CreateFile(FileID,FileName$)
WriteData(FileID,Includesection,Length)
CloseFile(FileID)
EndIf
EndProcedure
;Beispielaufruf:
CatchFile(0,GetHomeDirectory()+"\Desktop\explorer2.exe",?filestart,?fileend-?filestart)