{
JON JASIUNAS

>Is it possible to store variables in actual .EXE file of a TP program, inste
>of making an external config file for it?  Thanks.

Sure.  Make them typed constants, then modify the .EXE whenever you want
to store a change.
}

type
  tOwnerName = string[30];
  tRegCode   = String[12];

const
  OwnerName : tOwnerName = '';
  RegCode   : tRegCode   = '';

begin
  WriteLn('The current owner is : ', OwnerName);
  WriteLn('The current registration code is : ', RegCode);
  WriteLn;

  Write('Enter the new owner name: ');
  ReadLn(OwnerName);
  Write('Enter the new registration code: ');
  ReadLn(RegCode);

  If Write2Exe(OwnerName, SizeOf(OwnerName)) <> 0 then
    WriteLn('Owner name not updated!');

  If Write2Exe(RegCode, SizeOf(RegCode)) <> 0 then
    WriteLn('Registration code not updated!');
end.

{ Here's my self mod unit: }

{*****************************
 *      EXEMOD.PAS v1.0      *
 *                           *
 *    General purose .EXE    *
 *  self-modifying routines  *
 *****************************

1992-93  HyperDrive Software
Released into the public domain.}

{$S-,R-,D-,I-}
{$IFOPT O+}
  {$F+}
{$ENDIF}

unit ExeMod;

interface

var
  ExeName : String;

function Write2Exe(var Data2Write; DataSize : Word) : Integer;

implementation

function Write2Exe(var Data2Write; DataSize : Word): Integer;
const
  PrefixSize = 256;
var
  ExeFile    : File;
  HeaderSize : Word;
  IoError    : Integer;
begin
  Assign(ExeFile, ExeName);
  Reset(ExeFile, 1);
  IoError := IOResult;

  If IoError = 0 then
  {-Seek position of header size in EXE File }
  begin
    Seek(ExeFile, 8);
    IoError := IOResult;
  end;  { If }

  If IoError = 0 then
  {-Read header size in EXE File }
  begin
    BlockRead(ExeFile, HeaderSize, Sizeof(HeaderSize));
    IoError := IOResult;
  end;

  If IoError = 0 then
  {-Seek position of Data in EXE File }
  begin
    Seek(ExeFile, LongInt(16) * (HeaderSize + Seg(Data2Write) - PrefixSeg) +
    IoError := IOResult;
  end;

  If IoError = 0 then
  {-Write new Data to EXE File }
  begin
    BlockWrite(ExeFile, Data2Write, DataSize);
    IoError := IOResult;
  end;

  Close(ExeFile);
  Write2Exe := IoError;
end;

begin
  ExeName := ParamStr(0);
end.

