[comp.sys.mac.programmer] DIFFICULTY PATCHING CLOSEDESKACC

sonenbli@oxy.edu (Andrew D. Sonenblick) (08/26/89)

	   Ok, here's a problem that seems beyond me, so I'm asking
     all you major techies to tackle it, or at least take a look. I
     know (believe) my code is ok/correct:  basically, I built a
     minor application that patched into CloseDeskAcc, replacing it
     with my routine, and ultimately restoring the trap to the
     original CloseDeskAcc.  (If it matters, my routine simply
     compared the refNum passed to CloseDeskAcc with a known one
     from my own DA--if they match I do nothing (this is so that I
     can close the window (closebox) of my DA without closing the
    -i~?Ctself--if the numbers don't match (ie, some other DA) I
     call the original CloseDeskAcc.

	  Here's the relavant code: nothing new.

     Setup:    #define CLOSEDESKACC  0xA9B7
	       OldCloseDeskAcc = GetTrapAddress(CLOSEDESKACC);
	       SetTrapAddress(&myCloseDeskAcc, CLOSEDESKACC);

     Yes, my routine was previously declared as:

	       extern pascal void myCloseDeskAcc();

     Here's my routine:

     pascal void myCloseDeskAcc(refNum)
     int refNum;
     {
	  if (refNum != myKnownID)
	       CallPascal(refNum, OldCloseDeskAcc);
     }

     Finally, my restoring procedure:

     restore()
     {
	  SetTrapAddress(OldCloseDeskAcc,CLOSEDESKACC);
     }

	   Ok, the root of the problem:  within my application,
     This worked perfectly!  HOWEVER, once I transfered the
     _identical_ code to my DA (the same one which the patched
     code checks for a match with...) Kablooie!  Crash! @#$@!%&!
     In other words, total unfunness.  (I got from Macsbug an
     ADDRERR7F7F7F7F at 409F54)

     Curiously, I simply changed the #define CLOSEDESKACC from
     0xA9B7 ot 0xA9C8 (which is SysBeep) and made minor alterations
     to the code (nothing detailed above was changed besides the
     #define) and the thing worked fine--all calls to SysBeep
     were routed to my routine, and when I closed the DA, restoring
     the original trap, they went to the original trap.  There is
     obviously something about CloseDeskAcc that I am missing!

	  What and where is the discrepancy? If this dilemma proves
     insoluble or the solution too infeasable, can anyone suggest an
     alternative method of allowing a DA's window to be closed without
     the DA itself being closed.  I would appreciate any and all
     comments, now matter how trivial or verbose, brainstormed or
     well calculated.  Face it, I'm stuck and I need your help!

     Please help me out!   Thank you much, much, much, much, much.

-----Ando Moon------------------------------------------------------------------
I would also like to thank all those who replied to my "chalis-shaped"
plea for some INIT source code.  By the way, have you ever really
wondered about Tim M?  No, seriously...
--------------------------------------------------------sonenbli@oxy.edu--------