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

{
>If this cannot be done, then hhow can one include a pcx directly inside
>the compiled File???

  There's a trick to do that :
  Suppose your Program is called PROG.EXE and your PCX File IMAGE.PCX

  After each compile of PROG.EXE, do :
  COPY /B PROG.EXE+IMAGE.PCX

  Then, when you want to display the PCX, open the EXE File, read it's
  header :
}

Function GetExeSize(ExeName:String; Var TotSize,Expect:LongInt):Boolean;
{ returns True if EXE is already bind }
Type
  ExeHeaderRec = Record {Information describing EXE File}
    Signature         : Word; {EXE File signature}
    LengthRem         : Word; {Number of Bytes in last page of EXE image }
    LengthPages       : Word; {Number of 512 Byte pages in EXE image}
    NumReloc          : Word; {Number of relocation items}
    HeaderSize        : Word; {Number of paraGraphs in EXE header}
    MinHeap,MaxHeap   : Word; {ParaGraphs to keep beyond end of image}
    StackSeg,StackPtr : Word; {Initial SS:SP, StackSeg relative to image }
    CheckSum          : Word; {EXE File check sum, not used}
    IpInit, CodeSeg   : Word; {Initial CS:IP, CodeSeg relative to image}
    RelocOfs          : Word; {Bytes into EXE For first relocation item}
    OverlayNum        : Word; {Overlay number, not used here}
  end;

Var
  ExeF : File;
  ExeHeader : ExeHeaderRec;
  ExeValue : LongInt;
  count : Word;

begin
  TotSize:=0; Expect:=0;
  Assign(ExeF,ExeName); Reset(ExeF,1);
  if IoResult=0 then
  begin
    TotSize:=FileSize(ExeF);
    BlockRead(ExeF,ExeHeader,SizeOf(ExeHeaderRec),Count);
    With ExeHeader do

               IF Signature = $5A4D THEN
                  BEGIN
                     IF LengthRem = 0 THEN
                        ExeValue := LONGINT(LengthPages) SHL 9
                     ELSE
                        ExeValue := (LONGINT(PRED(LengthPages)) SHL 9);
                        {-LengthRem clears the bug}
                     Expect := ExeValue + LengthRem;
                  END;


  end;

  Close(ExeF);
  GetExeSize:=(TotSize<>Expect);
end;

{
  If GetExeSize returns True, your PCX has been placed at the end of the
  EXE (you did not forget :)) and all you have to do next is skip the
  Program itself : Seek(ExeF,Expect);

  Then starts your PCX. If you know in advance the sizes of the PCX
  File, you can place any data you want (including lots of PCX) at the
  end of your EXE.

  This example is taken from a Unit I wrote a long time ago (was called
  Caravane) and it worked very well. I accessed the end of my exe File
  like a normal Typed File. Quite funny but I do not use this anymore.
  Note that you can LzExe or Pklite the EXE part (not the PCX one). You
  can DIET both parts With the resident version.

  I hope the Function GetExeSize is not copyrighted since it is much too
  commented to be one of my work :)

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