From d695536d522a5fff2fbc02140d23c0a33959091d Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Thu, 13 May 2010 15:55:25 -0500 Subject: [PATCH 3/3] user32: Convert data in WM_DDE_EXECUTE to ansi when expected. --- dlls/user32/dde_server.c | 20 ++++++++++++++++++++ dlls/user32/tests/dde.c | 8 +------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/dlls/user32/dde_server.c b/dlls/user32/dde_server.c index 023330a..21a4e32 100644 --- a/dlls/user32/dde_server.c +++ b/dlls/user32/dde_server.c @@ -795,6 +795,26 @@ static WDML_QUEUE_STATE WDML_ServerHandleExecute(WDML_CONV* pConv, WDML_XACT* pX HeapFree(GetProcessHeap(), 0, udata); } } + else if (!pConv->instance->unicode && + IsTextUnicode(ptr, size, NULL)) + { + /* Data is unicode, but caller expects ANSI */ + CHAR *adata; + ULONG asize; + + asize = WideCharToMultiByte(CP_ACP, 0, ptr, size/sizeof(WCHAR), NULL, 0, NULL, NULL); + adata = HeapAlloc(GetProcessHeap(), 0, asize); + + if (adata) + { + WideCharToMultiByte(CP_ACP, 0, ptr, size/sizeof(WCHAR), adata, asize, NULL, NULL); + + hDdeData = DdeCreateDataHandle(pConv->instance->instanceID, + (LPVOID)adata, asize, 0, 0, CF_TEXT, 0); + + HeapFree(GetProcessHeap(), 0, adata); + } + } else hDdeData = DdeCreateDataHandle(pConv->instance->instanceID, ptr, GlobalSize(pXAct->hMem), 0, 0, CF_TEXT, 0); diff --git a/dlls/user32/tests/dde.c b/dlls/user32/tests/dde.c index 0a86ffc..b7ce22c 100644 --- a/dlls/user32/tests/dde.c +++ b/dlls/user32/tests/dde.c @@ -2154,11 +2154,6 @@ static HDDEDATA CALLBACK server_end_to_end_callback(UINT uType, UINT uFmt, HCONV ok(size == 8 || size == 9, "Expected that size should be 8 or 9 not %d, msg_index=%d\n", size, msg_index); else - if (msg_index == 5) - todo_wine - ok(size == 17, "Expected that size should be 17 not %d, msg_index=%d\n", - size, msg_index); - else ok(size == 17, "Expected that size should be 17 not %d, msg_index=%d\n", size, msg_index); ok((buffer = HeapAlloc(GetProcessHeap(), 0, size)) != NULL, "should not be null\n"); @@ -2187,8 +2182,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 == 5) - todo_wine { + if (msg_index == 5) { ok(!lstrcmpA((CHAR*)buffer, test_cmd_w_to_a), "Expected %s, got %s, msg_index=%d\n", test_cmd_w_to_a, buffer, msg_index); ok(size == 17, "Expected size should be 17, got %d, msg_index=%d\n", size, msg_index); -- 1.6.3.3