
A mellékelt Project1 példaprogram futtatása előtt a Test.dpr állományban található Project-et fordítsa le.
Egy exe állományban a program kezdete és vége egyformán meghatározott. Az exe állománynak a végéhez bármit hozzáfűzhetünk, az nem befolyásolja a program futását.
Az állomány bővítéséhez és a Stream visszaolvasásához a TFileStream osztályt használjuk. Mentésnél értelemszerűen változik az exe állomány tartalma. Ez olyan művelet, amelyet nem lehet végrehajtani éppen futás alatt lévő exe állományon. A visszaolvasást már nem befolyásolja, hogy az adott program fut-e.
A mentést az AttachToFile függvénnyel hajtjuk végre.
function AttachToFile(const FileName: string; MStream: TMemoryStream): Boolean;
Bemenő paraméterként az állomány nevét és az elmentendő Stream-et kell megadnunk.
A függvény belsejében a megadott exe állományt az alábbi módon nyithatjuk meg írásra:
Stream:=TFileStream.Create(FileName,fmOpenWrite or fmShareDenyWrite);
Az adatok írását az állomány végétől kell elkezdenünk.
Stream.Seek(0,soFromEnd);
Visszaolvasásnál tudnunk kell majd, hogy mekkora adatmennyiséget kell visszaolvasnunk. Ehhez tárolnunk kell az állomány végén a beírt adatmennyiséget, egy integer változó segítségével.
iSize:=MStream.Size+SizeOf(Integer);
Stream.Write(iSize,SizeOf(iSize));
Visszaolvasásnál az egyetlen pont amihez viszonyítani tudunk majd, az az állomány vége.
A Stream visszaolvasását a LoadFromFile függvény végzi.
function LoadFromFile(const FileName: string; MStream: TMemoryStream): Boolean;
A FileName paraméterben a megnyitandó állomány nevét kell megadnunk. A beolvasott adatfolyam az MStream paraméterben megadott változóba kerül.
A Stream visszaolvasásánál az állomány megnyitásának módja a következő:
Stream:=TFileStream.Create(FileName,fmOpenRead or fmShareDenyWrite);
Először ki kell olvasnunk az előzőleg eltárolt adatfolyam méretét. A méret tárolásához egy integer típusú változót használtunk. Ennek megfelelően kell pozícionálnunk az állomány végéhez viszonyítva.
Stream.Seek(-SizeOf(Integer),soFromEnd);
Stream.Read(iSize,SizeOf(iSize));
A beolvasott méretnek megfelelően ismételten pozícionálnunk kell az állományban, valamint be kell állítanunk az MStream méretét.
MStream.SetSize(iSize-SizeOf(Integer));
A fájl tartalmát a CopyFrom metódus segítségével másolhatjuk át az MStream-be.
Stream.CopyFrom(Stream,iSize-SizeOf(iSize));