[Back to MISC SWAG index] [Back to Main SWAG index] [Original]

    {
    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.

[Back to MISC SWAG index] [Back to Main SWAG index] [Original]