[comp.sys.mac.programmer] TN 126, first part

Alan.Michelson@f141.n102.z1.FIDONET.ORG (Alan Michelson) (03/19/90)

Technical Note #126        page       of 5        Sublaunching1 
Macintosh Technical Notes 
#126:  Sublaunching: Playing the Shell Game 
 
See also:        The Segment Loader 
 
Written by:        Rick Blair         May 4, 1987 
Updated:                March 1, 1988 
Revised by:        Darin Adler        August 1, 1988 
 
Note: Macintosh Technical Support takes the view that this is a feature
which is best left out for compatibility (and other) reasons, but we want
to make sure that when it is absolutely necessary to implement it, it is
done in the safest way. 
 
Herein is a means to launch an application from your program and have it
return to you as though you were a"shell, like the Finder. There are
unresolved issues, though (and some downright problems), so please read
the cautionary notes which follow. 
 
Changes since 5/87 include advising you to set both high bits of
LaunchFlags for future compatibility. Throwing away working directories
that you created is no longer recommended. If you are opening working
directories, you should make sure to check for errors (tMWDOErr ="121)
after calling PBOpenWD. 
___________________________________________________________________________
___________________ 
 
Warning: The interface to the Launch trap will change in the
not-too-distant future. When that happens, programs which launch other
applications will break. You should really only consider doing this if you 
are implementing an integrated development system. 
 
The Finder does a lot of hidden cleanups and other tasks of which the user 
isnt aware. Therefore it is best if you dont try to replace the Finder
with a"mini, or try to launch other programs and have them return to your
application. In the future the Finder may provide better integration for
applications and you would circumvent this if you tried to take over its
role. MultiFinder treats sublaunching differently.  Refer to Technical
Notes #180 and #205 for discussion of the Launch trap under MultiFinder. 
 
Nevertheless, consider a text editor that wants to allow the user to run,
say, ResEdit, and then return to program editing. If it isnt worried about 
the transition to new environments, then it would want to do this in a way 
that would fit into the current system well. System file version 4.1 (or
higher) includes a mechanism for allowing a call to another application
which we term a sublaunch. This is accomplished with a set of simple
extensions to the parameter block which is passed to the Launch trap. Note 
that for future compatibility we assume that Launch will return. 
 
A Sublaunch from Pascal  
 
        {It is assumed that the Signals are caught elsewhere; see
Technical 
         Note #88 for more information on the Signal mechanism} 
 
        {the extended parameter block to _Launch} 
        TYPE 
           pLaunchStruct = ^LaunchStruct; 
           LaunchStruct = RECORD 
              pfName      : StringPtr; 
              param       : INTEGER; 
              LC          : PACKED ARRAY[0..1] OF CHAR; {extended
parameters:} 
              extBlockLen : LONGINT; {number of bytes in extension = 6} 
              fFlags      : INTEGER; {Finder file info flags (see below)} 
              launchFlags : LONGINT; {bit 31,30=1 for sublaunch, others
reserved} 
            END; {LaunchStruct} 
 
        FUNCTION LaunchIt(pLaunch: pLaunchStruct): OSErr; {< 0 means
error} 
           INLINE $205F, $A9F2, $3E80;  
        { pops pointer into A0, calls Launch, pops D0 error code into
result: 
          MOVE.L  (A7)+,A0 
          _Launch 
          MOVE.W  D0,(A7)  ; since it MAY return } 
                 
        PROCEDURE DoLaunch; 
 
        VAR 
             myLaunch     : LaunchStruct;   {launch structure} 
 
           wher         : Point;          {where to display dialog} 
           reply        : SFReply;        {reply record} 
           myFileTypes  : SFTypeList;     {we only want APPLs} 
           numFileTypes : INTEGER; 
           myPB         : CInfoPBRec; 
           dirNameStr   : str255; 
 
        BEGIN 
           wher.h := 20; 
           wher.v := 20; 
           numFileTypes:= 1;              
           myFileTypes[0]:= 'APPL';      {applications only!} 
        {Let the user choose the file to Launch} 
           SFGetFile(wher, '', NIL, numFileTypes, myFileTypes, NIL,
reply); 
 
           IF reply.good THEN BEGIN 
              dirNameStr:= reply.fName;  {initialize to file selected} 
 
             
        {Get the Finder flags} 
              WITH myPB DO BEGIN 
                  ioNamePtr:= @dirNameStr; 
                  ioVRefNum:= reply.vRefNum; 
                  ioFDirIndex:= 0; 
                  ioDirID:= 0; 
              END; {WITH} 
              Signal(PBGetCatInfo(@MyPB,FALSE)); 
         
        {Set the current volume to where the target application is} 
              Signal(SetVol(NIL, reply.vRefNum)); 
          
        {Set up the launch parameters} 
              WITH myLaunch DO BEGIN 
                 pfName := @reply.fName; {pointer to our fileName} 
                 param := 0; {we dont want alternate screen or sound
buffers} 
                 LC := 'LC'; {here to tell Launch that there is non-junk
next} 
                 extBlockLen := 6; {length of param. block past this long
word} 
                 {copy flags; set bit 6 of low byte to 1 for RO access:} 
                 fFlags := myPB.ioFlFndrInfo.fdFlags; {from GetCatInfo} 
                 LaunchFlags := $C0000000; {set BOTH high bits for a
sublaunch} 
              END; {WITH} 
 
         {launch; you might want to put up a dialog which explains that 
          the selected application couldnt be launched for some reason.} 
              Signal(Launchit(@myLaunch)); 
           END; {IF reply.good} 
 
        END; {DoLaunch} 
 

--  
Alan Michelson via cmhGate - Net 226 fido<=>uucp gateway Col, OH
UUCP: ...!osu-cis!n8emr!cmhgate!102!141!Alan.Michelson
INET: Alan.Michelson@f141.n102.z1.FIDONET.ORG