From 1d26a63b431fa17a0dd763580cdccdc2c4605d75 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Thu, 13 May 2010 15:30:35 -0500 Subject: [PATCH 1/3] user32: Convert data in WM_DDE_EXECUTE to unicode when expected. --- dlls/user32/dde_server.c | 28 ++++++++++++++++++++++++++-- dlls/user32/tests/dde.c | 8 +------- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/dlls/user32/dde_server.c b/dlls/user32/dde_server.c index 52adb9a..023330a 100644 --- a/dlls/user32/dde_server.c +++ b/dlls/user32/dde_server.c @@ -29,6 +29,7 @@ #include "winbase.h" #include "wingdi.h" #include "winuser.h" +#include "winnls.h" #include "dde.h" #include "ddeml.h" #include "win.h" @@ -769,11 +770,34 @@ static WDML_QUEUE_STATE WDML_ServerHandleExecute(WDML_CONV* pConv, WDML_XACT* pX if (!(pConv->instance->CBFflags & CBF_FAIL_EXECUTES)) { LPVOID ptr = GlobalLock(pXAct->hMem); + SIZE_T size = GlobalSize(pXAct->hMem); if (ptr) { - hDdeData = DdeCreateDataHandle(pConv->instance->instanceID, ptr, GlobalSize(pXAct->hMem), - 0, 0, CF_TEXT, 0); + if (pConv->instance->unicode && + pConv->convContext.iCodePage != CP_WINUNICODE && + !IsTextUnicode(ptr, size, NULL)) + { + /* Data is ANSI, but caller expects unicode */ + WCHAR *udata; + ULONG usize; + + usize = MultiByteToWideChar(CP_ACP, 0, ptr, size, NULL, 0); + udata = HeapAlloc(GetProcessHeap(), 0, usize * sizeof(WCHAR)); + + if (udata) + { + MultiByteToWideChar(CP_ACP, 0, ptr, size, udata, usize); + + hDdeData = DdeCreateDataHandle(pConv->instance->instanceID, + (LPVOID)udata, usize * sizeof(WCHAR), 0, 0, CF_TEXT, 0); + + HeapFree(GetProcessHeap(), 0, udata); + } + } + else + hDdeData = DdeCreateDataHandle(pConv->instance->instanceID, ptr, GlobalSize(pXAct->hMem), + 0, 0, CF_TEXT, 0); GlobalUnlock(pXAct->hMem); } hDdeData = WDML_InvokeCallback(pConv->instance, XTYP_EXECUTE, 0, (HCONV)pConv, diff --git a/dlls/user32/tests/dde.c b/dlls/user32/tests/dde.c index 3a0d656..0a86ffc 100644 --- a/dlls/user32/tests/dde.c +++ b/dlls/user32/tests/dde.c @@ -2147,11 +2147,6 @@ static HDDEDATA CALLBACK server_end_to_end_callback(UINT uType, UINT uFmt, HCONV size = DdeGetData(hdata, NULL, 0, 0); if (msg_index == 10 || msg_index ==11 || msg_index == 16 || msg_index ==17) - if (msg_index == 10 || msg_index == 16) - todo_wine - ok(size == 34, "Expected that size should be 34 not %d, msg_index=%d\n", - size, msg_index); - else ok(size == 34, "Expected that size should be 34 not %d, msg_index=%d\n", size, msg_index); else @@ -2172,8 +2167,7 @@ static HDDEDATA CALLBACK server_end_to_end_callback(UINT uType, UINT uFmt, HCONV { ok(rsize == size, "Incorrect size returned, expected %d got %d, msg_index=%d\n", size, rsize, msg_index); - if (msg_index == 10 || msg_index == 16) - todo_wine { + if (msg_index == 10 || msg_index == 16) { ok(!lstrcmpW((WCHAR*)buffer, test_cmd_a_to_w), "Expected \"Test dde command\", msg_index=%d\n", msg_index); -- 1.6.3.3