Daten an eine Exedatei anhängen und dann auslesen |
|
| System | Win9x, WinNT, Win2000, WinXP, Vista, Win7 |
|---|---|
| Ab Delphi-Version | Delphi 1 |
| Letzte Änderung | 28.09.2010 |
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.
// 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;