At 08:26 AM 8/16/2004, you wrote:
Guys

I can't figure that one out. The following code works fine when pForm points
to my program's own form but crashes when pForm points to a different form.

FormType* pForm = FrmGetActiveForm();
char* pOld = (char*)FrmGetTitle(pForm);
char* pNew = (char*)MemPtrNew(6);
MemSet(pNew 6, 0);
MemMove(pNew, "Title", 5);
FrmSetTitle(pForm, pNew);

Just using StrCopy(pNew, "Title) is adequate and faster than the MemSet and MemMove.


The crash occurs on the last line.

Could well be that the pointer returned by MemPtrNew() is valid for my
program's own form but not for any other form. How can I get a pointer that
will be valid throughout the system (i.e. nol matter what program it gets
passed to)?

This is correct. Each application gets its own memory owner ID, and when your application exits, the system will free any memory chunks allocated to that ID.


In Palm OS 5 and earlier, you can use MemPtrSetOwner to set the pointer's owner ID to 0, which is the system ID. However, if you do that, you'll have a memory leak since that text will never be freed -- closing the form won't deallocate your string.

In this case, it's better to use Feature Memory with a FtrPtrNew. The pointer will stay valid, the memory won't be freed, but it will be tracked by your program and you can reuse the memory chunk or free it later.

Still, overwriting the current form's title is pretty rude, and won't always work -- some forms don't have titles, for example.

-- Ben Combee, DTS technical lead, PalmSource, Inc.
   "Combee on Palm OS" weblog: http://palmos.combee.net/
   Palm OS Dev Fourm Archives: http://news.palmos.com/read/all_forums/



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

Reply via email to