Home » Tipps & Tricks » Sonstiges » Sonstiges » Daten an eine Exedatei anhängen und dann auslesen

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;