MAKEINTATOM() Does Not Return a Valid LPSTRLast reviewed: November 2, 1995Article ID: Q61980 |
The information in this article applies to:
SUMMARYThe LPSTR returned from MAKEINTATOM() cannot be treated as a general-purpose string pointer. Instead, either use it with the Atom family or convert it into a valid string before passing it off as one.
MORE INFORMATIONThe MAKEINTATOM() macro is documented on Page 370 of the "Microsoft Windows Software Development Kit Programmer's Reference" versions 2.x as returning a value of type LPSTR. This is correct, but misleading. The LPSTR value returned is a "fabricated" LPSTR and cannot be considered a general-purpose string pointer. Consider the definition of the MAKEINTATOM macro:
#define MAKEINTATOM(i) (LPSTR) ((DWORD)((WORD)(i)))This tells the compiler to "take the integer value 'i', think of it as a WORD, zero-extend this into a DWORD, then think of this as a LPSTR." Thus, MAKEINTATOM(1Ah) returns 001Ah. This obviously is not the same as "1A", which would be ASCII(1)+ASCII(A)+0. The reason this psuedo-LPSTR works with AddAtom(), for example, is that AddAtom() looks to see if the HIWORD of the LPSTR parameter is 0 (zero). If so, AddAtom() knows that the LOWORD contains an actual integer value and it simply grabs that. The following code samples show how problems can occur with these psuedo-LPSTRs returned from MAKEINTATOM.
IncorrectATOM AddIntAtom(int iAtom) { LPSTR szAtom; MessageBox(hWnd, (szAtom=MAKEINTATOM(iAtom)), "Adding Atom", MB_OK); return (AddAtom(szAtom));} The above code fragment will create and return a valid atom, but the message box will display an erroneous value.
CorrectATOM AddIntAtom(int iAtom) { LPSTR szAtom; char szBuf[10]; szAtom=MAKEINTATOM(iAtom); sprintf(szBuf, "%d", LOWORD(szAtom)); /* Here's the trick */ MessageBox(hWnd, szBuf, "Adding Atom", MB_OK); return (AddAtom(szAtom));} In the above example, we converted the integer value contained in the LOWORD of szAtom into a character string, then used this new character string in the MessageBox() call. Although these code fragments illustrate the limitations of a MAKEINTATOM LPSTR, they are not very realistic because you really should use GetAtomName() to get the character string of an atom. If you have not yet created an atom out of an integer value, you could just format the integer into character string directly, as follows:
sprintf (szBuf, "%d", iAtom); MessageBox (hWnd, szBuf,....); |
Additional reference words: 3.00 3.10 3.50 3.51 4.00 95
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |