{ I conceived and made something I find highly useful, hope you do to.. If you use this in combination with DJ's Streams unit, you can store text files and that kind of things in your EXE.. On its own, it's great for the usual Config record. } Unit ExeS; INTERFACE Uses Objects; Type PExeStream = ^TExeStream; TExeStream = Object(TBufStream) Constructor Init(FileName: FNameStr; Mode, Size: Word); Procedure Seek(Pos: Longint); Virtual; Function GetPos: Longint; Virtual; Function GetSize: Longint; Virtual; Private AddOffset: LongInt; End; Implementation Constructor TExeStream.Init(FileName: FNameStr; Mode, Size: Word); Type ExeHdrType = Record Signature: Word; Rest, Blocks: Word; End; Var ExeFil: File Of ExeHdrType; ExeHdr: ExeHdrType; ExeLen: LongInt; fm: Integer; Begin fm := FileMode; FileMode := 64; System.Assign(ExeFil, FileName); System.Reset(ExeFil); System.Read(ExeFil, ExeHdr); System.Close(ExeFil); FileMode := fm; Inherited Init(FileName, Mode, Size); AddOffset := (ExeHdr.Blocks - 1) * LongInt(512) + ExeHdr.Rest; Seek(0); End; Procedure TExeStream.Seek(Pos: Longint); Begin Inherited Seek(Pos + AddOffset); End; Function TExeStream.GetPos: Longint; Var p: LongInt; Begin p := Inherited GetPos; GetPos := p - AddOffset; End; Function TExeStream.GetSize: Longint; Var s: LongInt; Begin s := Inherited GetSize; GetSize := s - AddOffset; End; End. { ------------------- DEMO PROGRAM -----------------------} Below is a simple example program to show its potential use: Program TestExeS; Uses ExeS; Type TConfig = Record Value1: String; Value2: Word; End; Var InS: PStream; Config: TConfig; Begin InS := New(PExeStream, Init(ParamStr(0), stOpen, 2048)); If InS = nil Then Begin Writeln('Something is really wrong!'); Halt; End Else If InS^.Status <> stOk Then Begin Writeln('Something is really wrong!'); Halt; End; If InS^.GetSize > 0 Then Begin InS^.Read(Config, SizeOf(TConfig)); InS^.Seek(0); Writeln('Old config:'); Writeln('Value 1: ', Config.Value1); Writeln('Value 2: ', Config.Value2); End Else Writeln('No config info found.'); Writeln; Write('Enter new value 1: '); Readln(Config.Value1); Write('Enter new value 2: '); Readln(Config.Value2); InS^.Write(Config, SizeOf(TConfig)); Dispose(InS, Done); End.