Daten an eine Exedatei anhängen und dann auslesen
Will man eine Applikation mit nur einer Exe-Datei veröffentliche, so kann man benötigte(n) Datei(en) einfach andie Exe-Datei anhängen. Ein Lesen mittels der Delphi-Routinen „AssignFile“, „BlockRead“ etc. funktioniertdann aber nicht mehr.Hierzu wird das Programm erst einmal „so“ kompiliert. Wenn man dann weiß, wie groß das kompilierte Programmist, kann dieser Wert in „Exesize“ eingetragen, das Programm neu kompiliert und anschließend die Dateiangehängt werden.Folgender Code liest die angehängte Datei aus, schreibt sie in „test.bmp“ und lädt sie anschließend in“Image1″.Anschließend der Code, der eine Datei „aufzaehl.bmp“ an die Exedatei „project1.exe“ anhängt.Zugeben, es ist etwas lästig, immer zu schauen, ob die Größe der Exedatei auch stimmt. Wie man aber direktaus einer Exedatei deren Größe erhalten kann ist mir leider nicht bekannt. Außerdem ist ein solches Vorgehen jasowieso erst anzuraten, wenn das Programm (ansonsten) schon fertig ist.
const ExeSize=205312; // Größe der kompilierten Exe-Datei. // zum Laden var aHdl:Integer; aBuf:array[1..40000] of byte; Gelesen: LongInt; f: file; begin aHdl:=FileOpen(Application.ExeName, fmShareDenyNone or fmOpenRead); FileSeek(aHdl, ExeSize, 0); AssignFile(f, 'test.bmp'); ReWrite(f, 1); Gelesen:=FileRead(aHdl,aBuf,SizeOf(aBuf)); while Gelesen>0 do begin BlockWrite(f,aBuf,Gelesen); Gelesen:=FileRead(aHdl,aBuf,SizeOf(aBuf)); end; CloseFile(f); FileClose(aHdl); Image1.Picture.Bitmap.LoadFromFile('test.bmp'); end; // folgender Code hängt eine Datei an var f2: file; aHdl: Integer; gelesen: longInt; aBuf: array[1..40000] of byte; Groesse: LongInt; begin AssignFile(f2,'Project1.exe'); // die Exedatei Reset(f2, 1); Groesse:=FileSize(f2); CloseFile(f2); aHdl:=FileOpen('project1.exe',fmOpenReadWrite); FileSeek(aHdl,Groesse,0); AssignFile(f2,'aufzaehl.bmp'); // die Datei, die angehängt werden soll. Reset(f2,1); while not Eof(f2) do begin BlockRead(f2,abuf,sizeof(abuf),gelesen); FileWrite(aHdl,abuf,gelesen); end; CloseFile(f2); end;