{ This program demonstrates how to use your EXE file as a resource. You should run this program twice - once to write info to the EXE and once to read info out. } program foo; uses Objects; type PMyObject = ^TMyObject; TMyObject = object(TObject) AString: String; constructor Init(S: String); constructor Load(var S: TStream); procedure Store(var S: TStream); end; constructor TMyObject.Init(S: String); begin inherited Init; AString := S; end; constructor TMyObject.Load(var S: TStream); begin inherited Init; S.Read(AString, SizeOf(AString)); end; procedure TMyObject.Store(var S: TStream); begin S.Write(AString, SizeOf(AString)); end; const RMyObject: TStreamRec = ( ObjType: 100; VmtLink: Ofs(TypeOf(TMyObject)^); Load: @TMyObject.Load; Store: @TMyObject.Store); var Rez: PResourceFile; TheStream: PBufStream; AObject, Obj: PMyObject; begin { Register my object for streaming } RegisterType(RMyObject); { Create instace of my object } Obj := New(PMyObject, Init('Hello world')); { Create instance of a stream pointing to EXE file } TheStream := New(PBufStream, Init(ParamStr(0), stOpen, 1024)); { was stream created okay? } if TheStream^.Status = stOk then begin { Crate instance of resource file } Rez := New(PResourceFile, Init(TheStream)); { try to grab object from resource stream } AObject := PMyObject(Rez^.Get('My Object')); if AObject <> nil then { if found, then write object's string to screen } writeln('The magic string is: ' + AObject^.AString) else { if not, then write object to resource } Rez^.Put(Obj, 'My Object'); end; { clean up } Obj^.Free; Rez^.Free; end.