[Back to STREAMS SWAG index] [Back to Main SWAG index] [Original]
{
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.
[Back to STREAMS SWAG index] [Back to Main SWAG index] [Original]