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

==============================================================================
 BBS: -=- Edge of the Century -=-
  To: PERCY WONG                   Date: 03-22-93 (10:19)
From: GAYLE DAVIS                Number: 4475   [140] Pascal
Subj: Capturing Dos Output       Status: Public
------------------------------------------------------------------------------
PW>-> PW>  EXEC(GETENV(COMSPEC),' \C DIR'); { or whatever it is }
PW>-> >can i then capture each line (or even one line) of the Dir output to

Percy or Kerry ??,

An elegant  way of accomplishing  your goal  is  to grap INT29.  This is an
UNDOCUMENTED  DOS function,  however, it's  really simple  to use. DOS uses
this to write EVERYTHING to the screen.  The problem is that there is a LOT
of data  output when screen writing  takes place. If you  try to capture to
much you will  need LOTS of memory. However, short  output like your trying
to get is OK.

Here is some sample code that will let you capture output :


{$A+,B-,D+,E+,F-,G+,I+,L+,N-,O-,P-,Q-,R-,S+,T-,V-,X+,Y+}
{$M 4096,0,400000}

Uses DOS,Crt;

Type
  ISRRegisters =
    record
      case Byte of
        1 : (BP, ES, DS, DI, SI, DX, CX, BX, AX, IP, CS, Flags : Word);
        2 : (j1,j2,j3,j4,j5 : Word; DL, DH, CL, CH, BL, BH, AL, AH : Byte);
    end;

CONST

  OrigInt29 : Pointer = nil;             {Old int 29 vector}

Var
    grab  : Array[1..32768] Of Char;   { this MAY NOT be enough !!!     }
    idx : LongInt;                     { if output EXCEEDS this, might  }
                                       { lock up machine, so be careful }
    S   : String;
    I   : LongInt;

{ Here is the MAGIC }
procedure Int29(BP : Word); interrupt;

var
  Regs : ISRRegisters absolute BP;

begin


 Grab[Idx] := CHAR(Regs.AL);
 Inc(idx);

 { WILL LOOSE OUTPUT, BUT BETTER THAN LOCKING MACHINE !!}
 If Idx > SizeOf(Grab) THEN Idx := 1;

 ASM
 PopF
 call OrigInt29
 END;

end;

BEGIN

  GetIntVec($29, OrigInt29);
  SetIntVec($29, @Int29);


  Clrscr;
  Idx := 1;

  {Shell to DOS and run your program}

  SwapVectors;
  Exec(GetEnv('COMSPEC'), '/c '+ YOURPROGRAM);
  SwapVectors;

  { GRAB now contains ALL of our output }

  FOR I := 1 TO Idx DO
      BEGIN
      If Grab[i] = #10 Then BEGIN
                           WriteLn(S);
                           S := ''
                           END ELSE If Grab[i] <> #13 THEN S := S + Grab[i];

      END;

  { ABSOLUTELY MUST BE DONE !! }
  if OrigInt29 <> nil then SetIntVec($29, OrigInt29);


UtiExprt: To be continued in next message ...
---
 * T.I.F.S.D.B.(from MD,USA 301-990-6362)
 * PostLink(tm) v1.05  TIFSDBU (#1258) : RelayNet(TM)

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