han@Apple.COM (Byron Han, Architect) (10/05/88)
Two ways for doing this. 1. Use INLINE code 2. Use an external Assembler routine Solution 1 ---------- Declare a procedure as such: PROCEDURE CallTheProc(theHandle : Handle); INLINE $205F, $2050, $4E90; In your application/program, use this: theHandle := GetResource(yourResType, yourResID); IF theHandle <> NIl THEN BEGIN HLock(theHandle); CallTheProc(theHandle); HUnlock(theHandle); END; The code resource entry point is a standard pascal entry point with no parameters in this case. If the code resource has parameters or is a function like those below: PROCEDURE MyProcEntry(var1, var2, var3 ...); FUNCTION MyFuncEntry(var1, var2, var3 ...) : foobar; you would need to declare procedures (INLINE) PROCEDURE CallMyProcEntry(var1, var2, var3 ... , theHandle); INLINE $205F,$2050, $4E90; FUNCTION CallMyFuncEntry(var1, var2, var3 ... , theHandle) : foobar; INLINE $205F,$2050,$4E90; Calling conventions: CallMyProcEntry(var1, var2, var3, ... theHandle); moof := CallMyFuncEntry(var1, var2, var3, ... theHandle); All the inline stuff does is MOVE.L 4(A7),A0 MOVE.L (A0),A0 JSR (A0) Note that this method of using INLINE presumes that the code resource preserves registers!. Solution 2 ---------- Perhaps more elegant, more correct, but more complex involves writing assembler stubs and linking them into your application. ; ; PROCEDURE DoIt(theHandle:Handle); EXTERNAL ; extern pascal void DoIt(theHandle) ; Handle theHandle; ; DoIt PROC EXPORT MOVEM.L D0-D7/A0-A6,-(SP) ; preserve registers MOVE.L 64(SP),A0 ; get the handle MOVE.L (A0),A1 ; leave handle in A0 ; INIT resources think that they are getting a handle to their ; potentially unlocked code resource in A0. ; An INIT without the locked bit set should have as its first ; instruction _HLock to prevent memory dislocation. ; From Pascal, Use ; theHandle:=RecoverHandle(@mainentrypoint); ; HLock(theHandle); JSR (A1) ; call it MOVEM.L (SP)+,D0-D7/A0-A6 ; restore registers RTS ; back to normal space Note that you will need to do some sticky stack fiddling if you want to pass/receive parameters/function results. Hope this helps. This is not an official Apple policy statement. Use code examples *at your own risk*. I have no connection with Symantec Corporation except as a customer. I have no connection with Consulair. Either use the Macintosh Development System (MDS) now called the Consulair Development System. Or MPW - Macintosh Programmers Workshop - the current Apple state of the art development platform. ------------------------------------------------------------------------------ Byron Han, Communications Architect TANSTAAFL - You Get What You Pay For. Apple Computer, Inc. ------------------------------------- 20525 Mariani Ave, MS27Y Internet: han@apple.COM Cupertino, CA 95014 UUCP:{sun,voder,nsc,decwrl}!apple!han -------------------------------------- GENIE: BYRONHAN ATTnet: 408-973-6450 Applelink: HAN1 CompuServe: 72167,1664 ------------------------------------------------------------------------------