BBS: Inland Empire Archive Date: 09-05-92 (18:28) Number: 322 From: LOGAN ASHBY Refer#: NONE To: FRANCOIS ROY Recvd: NO Subj: Who are my parents? 1/2 Conf: (2) Quik_Bas
04 Sep 92, Francois Roy writes to All:
FR> Is it possible for a spawned program (via SHELL or more importantly
FR> via QBSWAP) to know the name of the program which spawned it? (or
FR> even to know that it is a shelled program and not a "top-level"
FR> program?) How?
Francois, I haven't tried this code snippet with QBSwap, but I think it
should work. If you have any questions on how, shoot me
another message, and I'll go into more detail on it.
'SHELL'ed programs will report the parent process as
COMMAND.COM, as it gets loaded to run them.
' ----------------------- PrntName.bas -------------------------
'| This program gets the name of the parent process of the |
'| current program. |
'| Released into the public domain, 9/5/92 by Logan Ashby |
' --------------------------------------------------------------
' $INCLUDE: 'QBX.BI'
DECLARE FUNCTION GetProgName$ (PSPSeg%)
DECLARE FUNCTION GetPSP% ()
PSPSeg% = GetPSP% '| Get Current PSP
DEF SEG = PSPSeg%
'| Get Parent's PSP from offset
'| &H16 in the current PSP
PrntPSP% = (PEEK(&H17) * 256) + PEEK(&H16)
ProgName$ = GetProgName$(PrntPSP%) '| Get Prg Name
PRINT "ProgName$ = "; ProgName$
END
' ---------------------- GetProgName$ --------------------------
'| Takes a PSP segment and uses it to search the local env. |
'| table for the program's name. |
' --------------------------------------------------------------
FUNCTION GetProgName$ (PSPSeg%)
DEF SEG = PSPSeg%
'| If the parent PSP Seg of the input PSP = 0 or points to
'| itself, then the parent is the command processor, but
'| the name won't always be after the environment table.
'| We handle this by getting the name from the COMSPEC
'| environment variable.
TestPSPSeg% = (PEEK(&H17) * 256) + PEEK(&H16)
IF (TestPSPSeg% = PSPSeg%) OR (TestPSPSeg% = 0) THEN
GetProgName$ = ENVIRON$("COMSPEC")
EXIT FUNCTION
END IF
'| Get the Segment for the Environment
ENVSeg% = (PEEK(&H2D) * 256) + PEEK(&H2C)
DEF SEG = ENVSeg%
Done% = 0
EnvPtr% = -1
FirstNulFlag = 0
TmpName$ = ""
WHILE NOT Done% '| Search for 2 consecutive
EnvPtr% = EnvPtr% + 1 '| 0 bytes. (End of Env.
EnvChar% = PEEK(EnvPtr%) '| table.)
IF EnvChar% THEN
IF FirstNulFlag% THEN
FirstNulFlag% = 0 '| Found a single nul char,
END IF '| reset flag.
ELSE
IF FirstNulFlag% THEN
Done% = -1 '| Found end of Env. table
EnvPtr% = EnvPtr% + 3 '| Skip next two bytes
EnvChar% = PEEK(EnvPtr%)
WHILE EnvChar% '| Build Prog Name $
EnvPtr% = EnvPtr% + 1
TmpName$ = TmpName$ + CHR$(EnvChar%)
EnvChar% = PEEK(EnvPtr%)
WEND
ELSE
FirstNulFlag% = -1 '| Set flag showing we found
END IF '| the first 0 byte
END IF
WEND
DEF SEG
GetProgName$ = TmpName$
END FUNCTION
' ___ continued next message ___
--- GoldED 2.40
* Origin: Big Nerd's Nest (1:398/1.2)

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