BBS: Inland Empire Archive Date: 03-31-91 (03:31) Number: 158 From: BRENT ASHLEY Refer#: NONE To: ALL Recvd: NO Subj: Rtrv ErrLvl from SHELL Conf: (2) Quik_Bas
There has been much discussion here about getting the errorlevel
returned by a shelled program, but no answers yet. I found this
tidbit some time ago on the Ilink network, from Tony Elliott of
Elltech. It works well for me. Next message contains DEBUG script.
;
; GetErr.ASM - routines to retrieve errorlevel of SHELLed program
;
; by Tony Elliott - captured from a message on ILink QB echo
;
; put the following declarations in your QB program:
;
; DECLARE SUB MonitorShell ()
; DECLARE FUNCTION FetchErrorLevel% ()
;
; use as follows:
;
; CALL MonitorShell
; SHELL YourCmdLine$
; ErrLvl% = FetchErrorLevel%
;
; The MonitorShell routine hooks INT 21h and checks for service 4Ch,
; the exit-with-errorlevel request. It then saves the ExitCode
; passed, unhooks itself, and allows the interrupt to continue. It
; will therefore only retrieve the first errorlevel set during the
; shell - remember this if shelling to a batch.
;
; The FetchErrorLevel routine simply reports the saved ExitCode.
;
.model medium, basic
.code
Old21 Label Dword ;Label pointing to old Int 21h handler
Old21Offset dw ? ;Offset part
Old21Segment dw ? ;Segment part
MonitorSet db 0 ;Our "hooked" flag
ExitCode db ? ;Where we store the exit code
MonitorShell proc uses ds
cmp cs:MonitorSet,0 ;Are we already hooked?
jnz MonitorExit ;If so, exit
mov ax,3521h ;Get current vector for int 21h
int 21h
mov cs:Old21Segment,es ;Remember it for later
mov cs:Old21Offset,bx
mov ax,2521h
push cs
pop ds ;Point int 21h handler to our code
mov dx, offset OurInt21
int 21h
mov cs:MonitorSet,-1 ;Set our flag
MonitorExit:
ret
OurInt21: ;Our Int 21h handler
cmp ah,4ch ;Is it a 'terminate' request?
jnz Continue ;If not, continue on
mov cs:ExitCode,al ;Remember the exit code
push ax
push ds
mov ax,2521h ;Unhook ourself after the first hit
mov ds,Old21Segment
mov dx,Old21Offset
int 21h ;Point Int 21h back to original handler
pop ds
pop ax
mov cs:MonitorSet,0 ;Set out flag back to zero
Continue:
jmp dword ptr [Old21] ;Transfer control to original Int 21h
MonitorShell endp
FetchErrorLevel proc
mov al,cs:ExitCode ;Put the errorlevel into al
xor ah,ah ;Zero ah
ret ;ErrorLevel returned as result of function
FetchErrorLevel endp
end
; [end of file]
___
X DeLuxe2 1.12 #10383 X
--- Maximus 2.00
* Origin: Durham Systems (ONLINE!) (1:229/110)

Books at Amazon:
Back to BASIC: The History, Corruption, and Future of the Language
Hackers: Heroes of the Computer Revolution (including Tiny BASIC)
Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution
The Advent of the Algorithm: The Idea that Rules the World
Moths in the Machine: The Power and Perils of Programming
Mastering Visual Basic .NET