Donald C. Kirker wrote:
I am working on an application that can handle launch codes such as
sysAppLaunchCmdGoToURL. I can properly launch the application with these
calls and it works just fine (all globals, not many of them, appear to
work),

Just because they appear to work doesn't mean that it's safe to use
globals.  I'm not saying it isn't safe, but since globals basically
are just memory indexed by a register, it's quite possible that

but just after my AppStop code (ApplicationStop) is called, a
"MemoryMgr.c, Line:3650, Non-word-aligned handle" error is thrown. Right now
I am using: SysUIAppSwitch (cardNo, dbID, sysAppLaunchCmdGoToURL, urlP); to
launch the application.

Well, in general, you don't have access to globals unless you are run
with the sysAppLaunchCmdNormalLaunch launch code[1].  So, I wouldn't
be surprised if this is failing.  If you aren't being given globals and
you're trying to access them anyway, it could be that you're overwriting
some memory that you don't own, and it's not out of the question that
that memory is being overwritten by something else as well.  I wouldn't
be surprised if one of your pointers (or handles) is being trashed
because of this and you find out when you try to use the handle to
free some memory.

In your situation, I guess the first thing I'd do is check the launch
flags to see if the sysAppLaunchFlagNewGlobals.  Although my experience
indicates you do not ALWAYS have globals when this flag is set (due to,
I think bugs on a few devices, although it might be a misunderstanding
on my part), it's still right most of the time and should probably help
you confirm whether you do have globals available or not.

If you find you don't have globals available, which is what I think you
will find, there are two obvious approaches:
(a) restructure app to eliminate all globals; if all else fails, you
    can always put them all into a struct, allocate that using
    MemPtrNew() very early on, and pass a pointer to that struct
    around on the stack.  There are cleaner approaches, but that
    is the brute force way.
(b) do the trick where you relaunch yourself using SysAppLaunch(),
    causing yourself to get globals in the process.  I don't think
    it's supported to set the sysAppLaunchFlagNewGlobals flag
    when you call SysAppLaunch(), but I'm fairly sure it does work.
    This is, obviously, the super-easy low-impact method of getting
    things to work:  you *force* the system to give you globals.
    Note that SysAppLaunch() calls runs app as basically a subroutine,
    so it blocks until the app exits.  This is different from how
    SysUIAppSwitch() works.

Hope that helps.

  - Logan

[1] The Programmer's Companion says you can also sometimes have globals
    when you're launched with sysAppLaunchCmdURLParams, but only with
    certain URLs (weird).  But that's not the launch code you mentioned
    anyway, so it doesn't seem relevant.

--
For information on using the PalmSource Developer Forums, or to unsubscribe, 
please see http://www.palmos.com/dev/support/forums/

Reply via email to