windows-nt/Source/XPSP1/NT/base/mvdm/wow16/ddeml/dmghsz.c
2020-09-26 16:20:57 +08:00

175 lines
3.5 KiB
C

/****************************** Module Header ******************************\
* Module Name: DMGHSZ.C
*
* This module contains functions used for HSZ control.
*
* Created: 8/2/88 sanfords, Microsoft
* Modified: 6/5/90 Rich Gartland, Aldus (Win 3.0)
*
* Copyright (c) 1988, 1989 Microsoft Corporation
* Copyright (c) 1990 Aldus Corporation
\***************************************************************************/
#include "ddemlp.h"
ATOM FindAddHszHelper(LPSTR psz, BOOL fAdd);
/*********************** HSZ management functions *************************\
* An HSZ is an atom with a NULL tacked onto it in the HIWORD
* of the HSZ.
*
* WINDOWS 3.0 IMPLEMENTATION NOTE:
* Since under Windows there is only the local atom table or the (single)
* global atom table (and we need to use the global table to work right),
* we always have an atom table index of 0. When we run out of atom table
* space, future hsz adds return failure.
*
* History:
* Created 9/12/89 Sanfords
\***************************************************************************/
BOOL FreeHsz(a)
ATOM a;
{
if (!a)
return(TRUE);
#ifdef DEBUG
cAtoms--;
#endif
MONHSZ(a, MH_INTDELETE, GetCurrentTask());
if (GlobalDeleteAtom(a)) {
DEBUGBREAK();
return(FALSE);
}
return(TRUE);
}
BOOL IncHszCount(a)
ATOM a;
{
char aChars[255];
if (a == NULL)
return(TRUE);
#ifdef DEBUG
cAtoms++;
#endif
MONHSZ(a, MH_INTKEEP, GetCurrentTask());
if (GlobalGetAtomName(a, (LPSTR)aChars, 255))
return(GlobalAddAtom((LPSTR)aChars));
else {
AssertF(FALSE, "Cant increment atom");
return(FALSE);
}
}
/***************************** Private Function ****************************\
* Returns the length of the hsz given without NULL terminator.
* Wild HSZs have a length of 0.
*
* History:
* Created 9/12/89 Sanfords
\***************************************************************************/
WORD QueryHszLength(hsz)
HSZ hsz;
{
WORD cb;
char aChars[255];
if (LOWORD(hsz) == 0L)
return(0);
if (!(cb = GlobalGetAtomName(LOWORD(hsz), (LPSTR)aChars, 255))) {
AssertF(FALSE, "Cant get atom length");
return(0);
}
if (HIWORD(hsz))
cb += 7;
return(cb);
}
WORD QueryHszName(hsz, psz, cchMax)
HSZ hsz;
LPSTR psz;
WORD cchMax;
{
register WORD cb;
if (LOWORD(hsz) == 0) {
if (cchMax)
*psz = '\0';
return(0);
}
cb = GlobalGetAtomName(LOWORD(hsz), psz, cchMax);
if (cb && HIWORD(hsz) && (cb < cchMax - 7)) {
wsprintf(&psz[cb], ":(%04x)", HIWORD(hsz));
cb += 7;
}
return cb;
}
/***************************** Private Function ****************************\
* This finds the hsz for psz depending on fAdd.
*
* History:
* Created 9/12/89 Sanfords
\***************************************************************************/
ATOM FindAddHsz(psz, fAdd)
LPSTR psz;
BOOL fAdd;
{
if (psz == NULL || *psz == '\0')
return(0L);
return(FindAddHszHelper(psz, fAdd));
}
ATOM FindAddHszHelper(psz, fAdd)
LPSTR psz;
BOOL fAdd;
{
ATOM atom;
atom = fAdd ? GlobalAddAtom(psz) : GlobalFindAtom(psz);
if (fAdd) {
#ifdef DEBUG
cAtoms++;
#endif
MONHSZ(atom, MH_INTCREATE, GetCurrentTask());
}
return(atom);
}
HSZ MakeInstAppName(
ATOM a,
HWND hwndFrame)
{
// make upper half of HSZ be HWND FRAME for now.
IncHszCount(a);
return((HSZ)MAKELONG(a, hwndFrame));
}