Fixed pack/unpack routines for WM_DDE_EXECUTE.

This commit is contained in:
Alexandre Julliard 2002-03-29 17:59:20 +00:00
parent 3d2df9d93a
commit 740ba2ca65
1 changed files with 106 additions and 120 deletions

View File

@ -50,32 +50,6 @@ CRITICAL_SECTION WDML_CritSect = CRITICAL_SECTION_INIT("WDML_CritSect");
*
* ================================================================ */
static BOOL DDE_RequirePacking(UINT msg)
{
BOOL ret;
switch (msg)
{
case WM_DDE_ACK:
case WM_DDE_ADVISE:
case WM_DDE_DATA:
case WM_DDE_POKE:
ret = TRUE;
break;
case WM_DDE_EXECUTE: /* strange, NT 2000 (at least) really uses packing here... */
case WM_DDE_INITIATE:
case WM_DDE_REQUEST: /* assuming clipboard formats are 16 bit */
case WM_DDE_TERMINATE:
case WM_DDE_UNADVISE: /* assuming clipboard formats are 16 bit */
ret = FALSE;
break;
default:
TRACE("Unknown message %04x\n", msg);
ret = FALSE;
break;
}
return ret;
}
/*****************************************************************
* PackDDElParam (USER32.@)
@ -85,31 +59,36 @@ static BOOL DDE_RequirePacking(UINT msg)
*/
LPARAM WINAPI PackDDElParam(UINT msg, UINT uiLo, UINT uiHi)
{
HGLOBAL hMem;
UINT* params;
if (!DDE_RequirePacking(msg))
return MAKELONG(uiLo, uiHi);
HGLOBAL hMem;
UINT* params;
if (!(hMem = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, sizeof(UINT) * 2)))
{
ERR("GlobalAlloc failed\n");
return 0;
}
params = GlobalLock(hMem);
if (params == NULL)
{
ERR("GlobalLock failed (%x)\n", hMem);
return 0;
}
params[0] = uiLo;
params[1] = uiHi;
GlobalUnlock(hMem);
switch (msg)
{
case WM_DDE_ACK:
case WM_DDE_ADVISE:
case WM_DDE_DATA:
case WM_DDE_POKE:
if (!(hMem = GlobalAlloc(GMEM_DDESHARE, sizeof(UINT) * 2)))
{
ERR("GlobalAlloc failed\n");
return 0;
}
if (!(params = GlobalLock(hMem)))
{
ERR("GlobalLock failed (%x)\n", hMem);
return 0;
}
params[0] = uiLo;
params[1] = uiHi;
GlobalUnlock(hMem);
return (LPARAM)hMem;
return (LPARAM)hMem;
case WM_DDE_EXECUTE:
return uiHi;
default:
return MAKELONG(uiLo, uiHi);
}
}
@ -123,37 +102,35 @@ LPARAM WINAPI PackDDElParam(UINT msg, UINT uiLo, UINT uiHi)
BOOL WINAPI UnpackDDElParam(UINT msg, LPARAM lParam,
PUINT uiLo, PUINT uiHi)
{
HGLOBAL hMem;
UINT *params;
UINT *params;
if (!DDE_RequirePacking(msg))
{
*uiLo = LOWORD(lParam);
*uiHi = HIWORD(lParam);
switch (msg)
{
case WM_DDE_ACK:
case WM_DDE_ADVISE:
case WM_DDE_DATA:
case WM_DDE_POKE:
if (!lParam) return FALSE;
if (!(params = GlobalLock( (HGLOBAL)lParam )))
{
ERR("GlobalLock failed (%lx)\n", lParam);
return FALSE;
}
if (uiLo) *uiLo = params[0];
if (uiHi) *uiHi = params[1];
GlobalUnlock( (HGLOBAL)lParam );
return TRUE;
return TRUE;
}
if (lParam == 0)
{
return FALSE;
}
hMem = (HGLOBAL)lParam;
params = GlobalLock(hMem);
if (params == NULL)
{
ERR("GlobalLock failed (%x)\n", hMem);
return FALSE;
}
*uiLo = params[0];
*uiHi = params[1];
case WM_DDE_EXECUTE:
if (uiLo) *uiLo = 0;
if (uiHi) *uiHi = lParam;
return TRUE;
GlobalUnlock(hMem);
return TRUE;
default:
if (uiLo) *uiLo = LOWORD(lParam);
if (uiHi) *uiHi = HIWORD(lParam);
return TRUE;
}
}
@ -166,16 +143,19 @@ BOOL WINAPI UnpackDDElParam(UINT msg, LPARAM lParam,
*/
BOOL WINAPI FreeDDElParam(UINT msg, LPARAM lParam)
{
HGLOBAL hMem = (HGLOBAL)lParam;
switch (msg)
{
case WM_DDE_ACK:
case WM_DDE_ADVISE:
case WM_DDE_DATA:
case WM_DDE_POKE:
/* first check if it's a global handle */
if (!GlobalHandle( (LPVOID)lParam )) return TRUE;
return !GlobalFree( (HGLOBAL)lParam );
if (!DDE_RequirePacking(msg))
return TRUE;
if (lParam == 0)
{
return FALSE;
default:
return TRUE;
}
return GlobalFree(hMem) == (HGLOBAL)NULL;
}
@ -188,45 +168,44 @@ BOOL WINAPI FreeDDElParam(UINT msg, LPARAM lParam)
LPARAM WINAPI ReuseDDElParam(LPARAM lParam, UINT msgIn, UINT msgOut,
UINT uiLo, UINT uiHi)
{
HGLOBAL hMem;
UINT* params;
BOOL in, out;
UINT* params;
in = DDE_RequirePacking(msgIn);
out = DDE_RequirePacking(msgOut);
switch (msgIn)
{
case WM_DDE_ACK:
case WM_DDE_ADVISE:
case WM_DDE_DATA:
case WM_DDE_POKE:
switch(msgOut)
{
case WM_DDE_ACK:
case WM_DDE_ADVISE:
case WM_DDE_DATA:
case WM_DDE_POKE:
if (!lParam) return 0;
if (!(params = GlobalLock( (HGLOBAL)lParam )))
{
ERR("GlobalLock failed\n");
return 0;
}
params[0] = uiLo;
params[1] = uiHi;
TRACE("Reusing pack %08x %08x\n", uiLo, uiHi);
GlobalLock( (HGLOBAL)lParam );
return lParam;
if (!in)
{
return PackDDElParam(msgOut, uiLo, uiHi);
}
case WM_DDE_EXECUTE:
FreeDDElParam( msgIn, lParam );
return uiHi;
if (lParam == 0)
{
return FALSE;
}
default:
FreeDDElParam( msgIn, lParam );
return MAKELONG(uiLo, uiHi);
}
if (!out)
{
FreeDDElParam(msgIn, lParam);
return MAKELONG(uiLo, uiHi);
}
hMem = (HGLOBAL)lParam;
params = GlobalLock(hMem);
if (params == NULL)
{
ERR("GlobalLock failed\n");
return 0;
}
params[0] = uiLo;
params[1] = uiHi;
TRACE("Reusing pack %08x %08x\n", uiLo, uiHi);
GlobalLock(hMem);
return lParam;
default:
return PackDDElParam( msgOut, uiLo, uiHi );
}
}
/*****************************************************************
@ -2047,6 +2026,13 @@ UINT WINAPI DdeQueryConvInfo(HCONV hConv, DWORD id, LPCONVINFO lpConvInfo)
CONVINFO ci;
WDML_CONV* pConv;
if (!hConv)
{
FIXME("hConv is NULL\n");
return 0;
}
EnterCriticalSection(&WDML_CritSect);
pConv = WDML_GetConv(hConv, FALSE);