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