Contributor: NORBERT IGL              

{
   Norbert Igl
   Fido    : 2:243/8301.3
   Gernet  : 21:100/40.3
   Internet: q3976866@fernuni-hagen.de

> I seen some code posted here a few weeks ago. I meant to save it,
> but didn't. The code creates a windowed DOS shell.
> I would like to simply run a .BAT installation file in a window
> from my pascal program.

 ...same question a few days ago here in our local echo ... (:-)
 Its not only with windowed output ( easy possible )
 but also stores the pgm's output in your pgm's buffer ....
 have fun!
}

program test29;  {$M $1000,0,$FFF0}{ $C  }
uses    crt, dos;
const   maxBufSize = 64000;
        old29  : pointer = nil;
type    tVBuff = record
                    siz : word;
                    last: word;
                    txt : array[1..MaxBufSize] of char;
                 end;
        pVBuff = ^tVBuff;
var     Buf    : pVBuff;

procedure New29(Flags, CS, IP, AX,
                BX,CX, DX, SI, DI,
                DS, ES, BP: Word);  interrupt;
begin
  if Buf <> NIL then
  with Buf^ do
  begin
    if last < siz then inc( Last );
    txt[last] := CHAR(AX)
  end
end;

procedure BeginCapture;
begin
  if Old29 = NIL then  getintvec($29, Old29);
  SetIntVec($29, @New29 );
end;

procedure DoneCapture;
begin
  if old29 <> Nil then
  begin
    SetIntVec($29, old29);
    old29 := NIL
  end
end;

procedure InitBuffer;
begin
  Buf    := NIL
end;

procedure BeginBuffer(Size:word);
begin
  if Size > maxBufSize then size := maxBufSize;
  GetMem( Buf, Size );
  Buf^.siz := Size;
  Buf^.last:= 0;
  fillchar( Buf^.txt, size-4, 0);
end;

procedure DoneBuffer;
begin
  if Buf <> NIL then
  begin
    dispose(buf);
    initBuffer;
  end
end;

procedure ShowBuffer;
var i, maxy : word;
begin
  if buf = NIL then exit;
  maxy := (WindMax - WindMin) shr 8;
  clrscr;
  for i := 1 to Buf^.last do
  begin
    if wherey = maxy then
    begin
      write(' --- weiter mit Taste --- '); clreol;
      readkey;
      clrscr;
    end;
    write( buf^.txt[i] );
  end;
  write(#13#10' --- Ende, weiter mit Taste --- '); clreol;
  readkey;
  clrscr;
end;

begin
  InitBuffer;
  BeginBuffer($4000); { 16k Buffer, max=64k }
  BeginCapture;
  swapvectors;
  exec( getenv('comspec'),' /C DIR *.pas');
  swapvectors;
  DoneCapture;
  ShowBuffer;
  DoneBuffer
end.