engber@gumball.ils.nwu.edu (Mike Engber) (08/14/90)
Let's say you have a few CODE resources and you want to execute them (ala XCMDS in Hypercard). How do you do it? I can get as far as opening the resource file, getting handles to the CODE resources, but I don't know where to go from there? I have actually been able to do this from Macintosh Allegro Common Lisp because they provide the function, ff-call, which takes a CODE resource handle and executes it. But, I don't know how ff-call works or how I could accomplish this from C or Pascal. -ME
mxmora@unix.SRI.COM (Matt Mora) (08/14/90)
In article <1348@anaxagoras.ils.nwu.edu> engber@gumball (Mike Engber) writes: >Let's say you have a few CODE resources and you want to execute >them (ala XCMDS in Hypercard). How do you do it? > >I can get as far as opening the resource file, getting handles >to the CODE resources, but I don't know where to go from there? > Try something like this in pascal; procedure DoJsr (addr: ProcPtr); inline $205F, $4E90; procedure executecode(myhandle:handle); var addr:procptr; begin HLock(myhandle); addr := procptr(myhandle^); DoJsr(addr); hunlock(myhandle); end; The key of course is the inline procedure. I found the Dojsr from the hpercard interface stuff I think. -- ___________________________________________________________ Matthew Mora | my Mac Matt_Mora@sri.com SRI International | my unix mxmora@unix.sri.com ___________________________________________________________
rmh@apple.com (Rick Holzgrafe) (08/15/90)
From C, something like this: Handle h; /* Handle to resource */ int (*myFuncPtr) (int arg1, int arg2); /* Ptr to function */ int theResult; /* Save the return value from the function */ /* Get handle to code resource */ h = GetResource ('myFN', 128); /* Lock it down - Very important! */ HLock (h); /* Get appropriately typed function pointer */ myFuncPtr = (int (*)(int, int))*h; /* Call the function */ theResult = (*myFuncPtr)(arg1, arg2); See? You de-reference the handle to get a pointer, and typecast that into a pointer to the kind of function you are going to call. Then just call it. After the call, you can clean up in whatever way is appropriate: release the resource, if you don't need it any more; or save the handle but unlock it until you need it again, to avoid heap fragmentation. I don't know how to do this in Pascal, I'm afraid. Hope this helps. ========================================================================== Rick Holzgrafe | {sun,voder,nsc,mtxinu,dual}!apple!rmh Software Engineer | AppleLink HOLZGRAFE1 rmh@apple.com Apple Computer, Inc. | "All opinions expressed are mine, and do 20525 Mariani Ave. MS: 3-PK | not necessarily represent those of my Cupertino, CA 95014 | employer, Apple Computer Inc."