[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]