diff --git a/dlls/user/dde/client.c b/dlls/user/dde/client.c index a0a65d8618f..0f6295e671e 100644 --- a/dlls/user/dde/client.c +++ b/dlls/user/dde/client.c @@ -8,6 +8,7 @@ * Copyright 1999 Keith Matthews * Copyright 2000 Corel * Copyright 2001 Eric Pouech + * Copyright 2004, 2005 Dmitry Timoshkov * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -41,8 +42,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(ddeml); static LRESULT CALLBACK WDML_ClientProc(HWND, UINT, WPARAM, LPARAM); /* only for one client, not conv list */ -const char WDML_szClientConvClassA[] = "DdeClientAnsi"; -const WCHAR WDML_szClientConvClassW[] = {'D','d','e','C','l','i','e','n','t','U','n','i','c','o','d','e',0}; +const WCHAR WDML_szClientConvClass[] = {'W','i','n','e','D','d','e','C','l','i','e','n','t',0}; /****************************************************************************** * DdeConnectList [USER32.@] Establishes conversation with DDE servers @@ -101,6 +101,7 @@ HCONV WINAPI DdeConnect(DWORD idInst, HSZ hszService, HSZ hszTopic, WDML_INSTANCE* pInstance; WDML_CONV* pConv = NULL; ATOM aSrv = 0, aTpc = 0; + WNDCLASSEXW wndclass; TRACE("(0x%lx,%p,%p,%p)\n", idInst, hszService, hszTopic, pCC); @@ -123,50 +124,24 @@ HCONV WINAPI DdeConnect(DWORD idInst, HSZ hszService, HSZ hszTopic, /* we need to establish a conversation with server, so create a window for it */ - if (pInstance->unicode) - { - WNDCLASSEXW wndclass; + wndclass.cbSize = sizeof(wndclass); + wndclass.style = 0; + wndclass.lpfnWndProc = WDML_ClientProc; + wndclass.cbClsExtra = 0; + wndclass.cbWndExtra = 2 * sizeof(ULONG_PTR); + wndclass.hInstance = 0; + wndclass.hIcon = 0; + wndclass.hCursor = 0; + wndclass.hbrBackground = 0; + wndclass.lpszMenuName = NULL; + wndclass.lpszClassName = WDML_szClientConvClass; + wndclass.hIconSm = 0; - wndclass.cbSize = sizeof(wndclass); - wndclass.style = 0; - wndclass.lpfnWndProc = WDML_ClientProc; - wndclass.cbClsExtra = 0; - wndclass.cbWndExtra = 2 * sizeof(DWORD); - wndclass.hInstance = 0; - wndclass.hIcon = 0; - wndclass.hCursor = 0; - wndclass.hbrBackground = 0; - wndclass.lpszMenuName = NULL; - wndclass.lpszClassName = WDML_szClientConvClassW; - wndclass.hIconSm = 0; + RegisterClassExW(&wndclass); - RegisterClassExW(&wndclass); + hwndClient = CreateWindowW(WDML_szClientConvClass, NULL, WS_POPUP, 0, 0, 0, 0, 0, 0, 0, 0); - hwndClient = CreateWindowW(WDML_szClientConvClassW, NULL, WS_POPUP, 0, 0, 0, 0, 0, 0, 0, 0); - } - else - { - WNDCLASSEXA wndclass; - - wndclass.cbSize = sizeof(wndclass); - wndclass.style = 0; - wndclass.lpfnWndProc = WDML_ClientProc; - wndclass.cbClsExtra = 0; - wndclass.cbWndExtra = 2 * sizeof(DWORD); - wndclass.hInstance = 0; - wndclass.hIcon = 0; - wndclass.hCursor = 0; - wndclass.hbrBackground = 0; - wndclass.lpszMenuName = NULL; - wndclass.lpszClassName = WDML_szClientConvClassA; - wndclass.hIconSm = 0; - - RegisterClassExA(&wndclass); - - hwndClient = CreateWindowA(WDML_szClientConvClassA, NULL, WS_POPUP, 0, 0, 0, 0, 0, 0, 0, 0); - } - - SetWindowLongPtrW(hwndClient, GWL_WDML_INSTANCE, (LONG_PTR)pInstance); + SetWindowLongPtrW(hwndClient, GWL_WDML_INSTANCE, (ULONG_PTR)pInstance); if (hszService) { @@ -215,7 +190,7 @@ HCONV WINAPI DdeConnect(DWORD idInst, HSZ hszService, HSZ hszTopic, { memset(&pConv->convContext, 0, sizeof(pConv->convContext)); pConv->convContext.cb = sizeof(pConv->convContext); - pConv->convContext.iCodePage = (pInstance->unicode) ? CP_WINUNICODE : CP_WINANSI; + pConv->convContext.iCodePage = CP_WINUNICODE; } theEnd: @@ -257,7 +232,7 @@ HCONV WINAPI DdeReconnect(HCONV hConv) HWND hwndServer = pConv->hwndServer; ATOM aSrv, aTpc; - SetWindowLongA(pConv->hwndClient, GWL_WDML_CONVERSATION, 0); + SetWindowLongPtrW(pConv->hwndClient, GWL_WDML_CONVERSATION, 0); aSrv = WDML_MakeAtomFromHsz(pConv->hszService); aTpc = WDML_MakeAtomFromHsz(pConv->hszTopic); @@ -266,7 +241,7 @@ HCONV WINAPI DdeReconnect(HCONV hConv) LeaveCriticalSection(&WDML_CritSect); /* note: sent messages shall not use packing */ - ret = SendMessageA(hwndServer, WM_DDE_INITIATE, (WPARAM)hwndClient, + ret = SendMessageW(hwndServer, WM_DDE_INITIATE, (WPARAM)hwndClient, MAKELPARAM(aSrv, aTpc)); EnterCriticalSection(&WDML_CritSect); @@ -296,7 +271,7 @@ HCONV WINAPI DdeReconnect(HCONV hConv) else { /* reset the conversation as it was */ - SetWindowLongA(pConv->hwndClient, GWL_WDML_CONVERSATION, (DWORD)pConv); + SetWindowLongPtrW(pConv->hwndClient, GWL_WDML_CONVERSATION, (ULONG_PTR)pConv); } } } @@ -907,7 +882,7 @@ static WDML_QUEUE_STATE WDML_HandleIncomingTerminate(WDML_CONV* pConv, MSG* msg, if (pConv->wStatus & ST_CONNECTED) { /* don't care about result code (if server exists or not) */ - PostMessageA(pConv->hwndServer, WM_DDE_TERMINATE, (WPARAM)pConv->hwndClient, 0L); + PostMessageW(pConv->hwndServer, WM_DDE_TERMINATE, (WPARAM)pConv->hwndClient, 0L); pConv->wStatus &= ~ST_CONNECTED; } /* have to keep connection around to allow reconnection */ @@ -1041,7 +1016,7 @@ static HDDEDATA WDML_SyncWaitTransactionReply(HCONV hConv, DWORD dwTimeout, WDML /* conversation no longer available... return failure */ break; } - while (PeekMessageA(&msg, pConv->hwndClient, WM_DDE_FIRST, WM_DDE_LAST, PM_REMOVE)) + while (PeekMessageW(&msg, pConv->hwndClient, WM_DDE_FIRST, WM_DDE_LAST, PM_REMOVE)) { /* check that either pXAct has been processed or no more xActions are pending */ ret = (pConv->transactions == pXAct); @@ -1167,7 +1142,7 @@ HDDEDATA WINAPI DdeClientTransaction(LPBYTE pData, DWORD cbData, HCONV hConv, HS WDML_QueueTransaction(pConv, pXAct); - if (!PostMessageA(pConv->hwndServer, pXAct->ddeMsg, (WPARAM)pConv->hwndClient, pXAct->lParam)) + if (!PostMessageW(pConv->hwndServer, pXAct->ddeMsg, (WPARAM)pConv->hwndClient, pXAct->lParam)) { WARN("Failed posting message %x to %p (error=0x%lx)\n", pXAct->ddeMsg, pConv->hwndServer, GetLastError()); @@ -1278,7 +1253,7 @@ static LRESULT CALLBACK WDML_ClientProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPA ((pConv = WDML_GetConvFromWnd(hwnd)) == NULL || pConv->wStatus == XST_INIT1)) { /* In response to WM_DDE_INITIATE, save server window */ - char buf[256]; + WCHAR buf[256]; WDML_INSTANCE* pInstance; /* note: sent messages do not need packing */ @@ -1291,7 +1266,7 @@ static LRESULT CALLBACK WDML_ClientProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPA /* we already have started the conv with a server, drop other replies */ GlobalDeleteAtom(uiLo); GlobalDeleteAtom(uiHi); - PostMessageA((HWND)wParam, WM_DDE_TERMINATE, (WPARAM)hwnd, 0); + PostMessageW((HWND)wParam, WM_DDE_TERMINATE, (WPARAM)hwnd, 0); return 0; } @@ -1302,15 +1277,13 @@ static LRESULT CALLBACK WDML_ClientProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPA pConv = WDML_AddConv(pInstance, WDML_CLIENT_SIDE, hszSrv, hszTpc, hwnd, (HWND)wParam); - SetWindowLongA(hwnd, GWL_WDML_CONVERSATION, (DWORD)pConv); + SetWindowLongPtrW(hwnd, GWL_WDML_CONVERSATION, (ULONG_PTR)pConv); pConv->wStatus |= ST_CONNECTED; pConv->wConvst = XST_INIT1; /* check if server is handled by DDEML */ - if ((GetClassNameA((HWND)wParam, buf, sizeof(buf)) && - strcmp(buf, WDML_szServerConvClassA) == 0) || - (GetClassNameW((HWND)wParam, (LPWSTR)buf, sizeof(buf)/sizeof(WCHAR)) && - lstrcmpW((LPWSTR)buf, WDML_szServerConvClassW) == 0)) + if (GetClassNameW((HWND)wParam, buf, sizeof(buf)/sizeof(WCHAR)) && + lstrcmpiW(buf, WDML_szServerConvClass) == 0) { pConv->wStatus |= ST_ISLOCAL; } @@ -1347,8 +1320,7 @@ static LRESULT CALLBACK WDML_ClientProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPA return 0; } - return (IsWindowUnicode(hwnd)) ? - DefWindowProcW(hwnd, iMsg, wParam, lParam) : DefWindowProcA(hwnd, iMsg, wParam, lParam); + return DefWindowProcW(hwnd, iMsg, wParam, lParam); } /***************************************************************** @@ -1382,7 +1354,7 @@ BOOL WINAPI DdeDisconnect(HCONV hConv) count = WDML_CritSect.RecursionCount; for (i = 0; i < count; i++) LeaveCriticalSection(&WDML_CritSect); - if (PostMessageA(pConv->hwndServer, pXAct->ddeMsg, + if (PostMessageW(pConv->hwndServer, pXAct->ddeMsg, (WPARAM)pConv->hwndClient, pXAct->lParam)) WDML_SyncWaitTransactionReply(hConv, 10000, pXAct); for (i = 0; i < count; i++) diff --git a/dlls/user/dde/dde_private.h b/dlls/user/dde/dde_private.h index 2e147ebc924..e70b40bb11c 100644 --- a/dlls/user/dde/dde_private.h +++ b/dlls/user/dde/dde_private.h @@ -155,7 +155,6 @@ typedef struct tagWDML_INSTANCE DWORD threadID; /* needed to keep instance linked to a unique thread */ BOOL monitor; /* have these two as full Booleans cos they'll be tested frequently */ BOOL clientOnly; /* bit wasteful of space but it will be faster */ - BOOL unicode; /* Flag to indicate Win32 API used to initialise */ BOOL win16; /* flag to indicate Win16 API used to initialize */ HSZNode* nodeList; /* for cleaning upon exit */ PFNCALLBACK callback; @@ -199,7 +198,7 @@ extern WDML_SERVER* WDML_FindServer(WDML_INSTANCE* pInstance, HSZ hszService, HS extern WDML_QUEUE_STATE WDML_ServerHandle(WDML_CONV* pConv, WDML_XACT* pXAct); /* called both in DdeClientTransaction and server side. */ extern UINT WDML_Initialize(LPDWORD pidInst, PFNCALLBACK pfnCallback, - DWORD afCmd, DWORD ulRes, BOOL bUnicode, BOOL b16); + DWORD afCmd, DWORD ulRes, BOOL b16); extern WDML_CONV* WDML_AddConv(WDML_INSTANCE* pInstance, WDML_SIDE side, HSZ hszService, HSZ hszTopic, HWND hwndClient, HWND hwndServer); extern void WDML_RemoveConv(WDML_CONV* pConv, WDML_SIDE side); @@ -235,7 +234,7 @@ extern BOOL WDML_IsAppOwned(HDDEDATA hDdeData); extern WDML_INSTANCE* WDML_GetInstance(DWORD InstId); extern WDML_INSTANCE* WDML_GetInstanceFromWnd(HWND hWnd); /* broadcasting to DDE windows */ -extern void WDML_BroadcastDDEWindows(const char* clsName, UINT uMsg, +extern void WDML_BroadcastDDEWindows(LPCWSTR clsName, UINT uMsg, WPARAM wParam, LPARAM lParam); extern void WDML_NotifyThreadExit(DWORD tid); @@ -244,11 +243,9 @@ static inline void WDML_ExtractAck(WORD status, DDEACK* da) *da = *((DDEACK*)&status); } -extern const char WDML_szEventClass[]; /* class of window for events (aka instance) */ -extern const char WDML_szServerConvClassA[]; /* class of window for server side conv (ansi) */ -extern const WCHAR WDML_szServerConvClassW[]; /* class of window for server side conv (unicode) */ -extern const char WDML_szClientConvClassA[]; /* class of window for client side conv (ansi) */ -extern const WCHAR WDML_szClientConvClassW[]; /* class of window for client side conv (unicode) */ +extern const WCHAR WDML_szEventClass[]; /* class of window for events (aka instance) */ +extern const WCHAR WDML_szServerConvClass[]; /* class of window for server side conv */ +extern const WCHAR WDML_szClientConvClass[]; /* class of window for client side conv */ #define WM_WDML_REGISTER (WM_USER + 0x200) #define WM_WDML_UNREGISTER (WM_USER + 0x201) @@ -262,7 +259,7 @@ extern const WCHAR WDML_szClientConvClassW[]; /* class of window for client sid */ #define GWL_WDML_INSTANCE (0) -#define GWL_WDML_CONVERSATION (4) -#define GWL_WDML_SERVER (4) +#define GWL_WDML_CONVERSATION (sizeof(ULONG_PTR)) +#define GWL_WDML_SERVER (sizeof(ULONG_PTR)) #endif /* __WINE_DDEML_PRIVATE_H */ diff --git a/dlls/user/dde/ddeml16.c b/dlls/user/dde/ddeml16.c index dda98696410..e0fad2afb35 100644 --- a/dlls/user/dde/ddeml16.c +++ b/dlls/user/dde/ddeml16.c @@ -151,8 +151,7 @@ HDDEDATA WDML_InvokeCallback16(PFNCALLBACK pfn, UINT uType, UINT uFmt, UINT16 WINAPI DdeInitialize16(LPDWORD pidInst, PFNCALLBACK16 pfnCallback, DWORD afCmd, DWORD ulRes) { - return WDML_Initialize(pidInst, (PFNCALLBACK)pfnCallback, afCmd, ulRes, - FALSE, TRUE); + return WDML_Initialize(pidInst, (PFNCALLBACK)pfnCallback, afCmd, ulRes, TRUE); } /***************************************************************** diff --git a/dlls/user/dde/misc.c b/dlls/user/dde/misc.c index 0013a4c6a8d..8ae85955274 100644 --- a/dlls/user/dde/misc.c +++ b/dlls/user/dde/misc.c @@ -8,6 +8,7 @@ * Copyright 1999 Keith Matthews * Copyright 2000 Corel * Copyright 2001 Eric Pouech + * Copyright 2003, 2004, 2005 Dmitry Timoshkov * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -38,8 +39,9 @@ #include "dde.h" #include "ddeml.h" #include "win.h" -#include "wine/debug.h" #include "dde/dde_private.h" +#include "wine/unicode.h" +#include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(ddeml); @@ -49,7 +51,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(ddeml); static WDML_INSTANCE* WDML_InstanceList = NULL; static DWORD WDML_MaxInstanceID = 0; /* OK for present, have to worry about wrap-around later */ -const char WDML_szEventClass[] = "DdeEventClass"; +const WCHAR WDML_szEventClass[] = {'W','i','n','e','D','d','e','E','v','e','n','t','C','l','a','s','s',0}; static CRITICAL_SECTION_DEBUG critsect_debug = { @@ -330,7 +332,7 @@ static LRESULT CALLBACK WDML_EventProc(HWND hwndEvent, UINT uMsg, WPARAM wParam, } break; default: - return DefWindowProcA(hwndEvent, uMsg, wParam, lParam); + return DefWindowProcW(hwndEvent, uMsg, wParam, lParam); } return 0; } @@ -341,12 +343,12 @@ static LRESULT CALLBACK WDML_EventProc(HWND hwndEvent, UINT uMsg, WPARAM wParam, * */ UINT WDML_Initialize(LPDWORD pidInst, PFNCALLBACK pfnCallback, - DWORD afCmd, DWORD ulRes, BOOL bUnicode, BOOL b16) + DWORD afCmd, DWORD ulRes, BOOL b16) { WDML_INSTANCE* pInstance; WDML_INSTANCE* reference_inst; UINT ret; - WNDCLASSEXA wndclass; + WNDCLASSEXW wndclass; TRACE("(%p,%p,0x%lx,%ld)\n", pidInst, pfnCallback, afCmd, ulRes); @@ -376,7 +378,6 @@ UINT WDML_Initialize(LPDWORD pidInst, PFNCALLBACK pfnCallback, pInstance->instanceID = *pidInst; /* May need to add calling proc Id */ pInstance->threadID = GetCurrentThreadId(); pInstance->callback = *pfnCallback; - pInstance->unicode = bUnicode; pInstance->win16 = b16; pInstance->nodeList = NULL; /* node will be added later */ pInstance->monitorFlags = afCmd & MF_MASK; @@ -483,7 +484,7 @@ UINT WDML_Initialize(LPDWORD pidInst, PFNCALLBACK pfnCallback, wndclass.style = 0; wndclass.lpfnWndProc = WDML_EventProc; wndclass.cbClsExtra = 0; - wndclass.cbWndExtra = sizeof(DWORD); + wndclass.cbWndExtra = sizeof(ULONG_PTR); wndclass.hInstance = 0; wndclass.hIcon = 0; wndclass.hCursor = 0; @@ -492,13 +493,13 @@ UINT WDML_Initialize(LPDWORD pidInst, PFNCALLBACK pfnCallback, wndclass.lpszClassName = WDML_szEventClass; wndclass.hIconSm = 0; - RegisterClassExA(&wndclass); + RegisterClassExW(&wndclass); - pInstance->hwndEvent = CreateWindowA(WDML_szEventClass, NULL, + pInstance->hwndEvent = CreateWindowW(WDML_szEventClass, NULL, WS_POPUP, 0, 0, 0, 0, 0, 0, 0, 0); - SetWindowLongA(pInstance->hwndEvent, GWL_WDML_INSTANCE, (DWORD)pInstance); + SetWindowLongPtrW(pInstance->hwndEvent, GWL_WDML_INSTANCE, (ULONG_PTR)pInstance); TRACE("New application instance processing finished OK\n"); } @@ -586,7 +587,7 @@ UINT WDML_Initialize(LPDWORD pidInst, PFNCALLBACK pfnCallback, UINT WINAPI DdeInitializeA(LPDWORD pidInst, PFNCALLBACK pfnCallback, DWORD afCmd, DWORD ulRes) { - return WDML_Initialize(pidInst, pfnCallback, afCmd, ulRes, FALSE, FALSE); + return WDML_Initialize(pidInst, pfnCallback, afCmd, ulRes, FALSE); } /****************************************************************************** @@ -606,7 +607,7 @@ UINT WINAPI DdeInitializeA(LPDWORD pidInst, PFNCALLBACK pfnCallback, UINT WINAPI DdeInitializeW(LPDWORD pidInst, PFNCALLBACK pfnCallback, DWORD afCmd, DWORD ulRes) { - return WDML_Initialize(pidInst, pfnCallback, afCmd, ulRes, TRUE, FALSE); + return WDML_Initialize(pidInst, pfnCallback, afCmd, ulRes, FALSE); } /***************************************************************** @@ -773,7 +774,7 @@ WDML_INSTANCE* WDML_GetInstance(DWORD instId) */ WDML_INSTANCE* WDML_GetInstanceFromWnd(HWND hWnd) { - return (WDML_INSTANCE*)GetWindowLongA(hWnd, GWL_WDML_INSTANCE); + return (WDML_INSTANCE*)GetWindowLongPtrW(hWnd, GWL_WDML_INSTANCE); } /****************************************************************************** @@ -1573,7 +1574,7 @@ HGLOBAL WDML_DataHandle2Global(HDDEDATA hDdeData, BOOL fResponse, BOOL fRelease, DWORD count; HBITMAP hbmp = *(HBITMAP*)(pDdh + 1); - if (GetObjectA(hbmp, sizeof(bmp), &bmp)) + if (GetObjectW(hbmp, sizeof(bmp), &bmp)) { count = bmp.bmWidthBytes * bmp.bmHeight; hMem = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, @@ -1616,18 +1617,20 @@ HGLOBAL WDML_DataHandle2Global(HDDEDATA hDdeData, BOOL fResponse, BOOL fRelease, */ WDML_SERVER* WDML_AddServer(WDML_INSTANCE* pInstance, HSZ hszService, HSZ hszTopic) { + static const WCHAR fmtW[] = {'%','s','(','0','x','%','0','8','l','x',')',0}; WDML_SERVER* pServer; - char buf1[256]; - char buf2[256]; + WCHAR buf1[256]; + WCHAR buf2[256]; pServer = (WDML_SERVER*)HeapAlloc(GetProcessHeap(), 0, sizeof(WDML_SERVER)); if (pServer == NULL) return NULL; - WDML_IncHSZ(pInstance, pServer->hszService = hszService); + pServer->hszService = hszService; + WDML_IncHSZ(pInstance, hszService); - DdeQueryStringA(pInstance->instanceID, hszService, buf1, sizeof(buf1), CP_WINANSI); - snprintf(buf2, sizeof(buf2), "%s(0x%08lx)", buf1, GetCurrentProcessId()); - pServer->hszServiceSpec = DdeCreateStringHandleA(pInstance->instanceID, buf2, CP_WINANSI); + DdeQueryStringW(pInstance->instanceID, hszService, buf1, 256, CP_WINUNICODE); + snprintfW(buf2, 256, fmtW, buf1, GetCurrentProcessId()); + pServer->hszServiceSpec = DdeCreateStringHandleW(pInstance->instanceID, buf2, CP_WINUNICODE); pServer->atomService = WDML_MakeAtomFromHsz(pServer->hszService); pServer->atomServiceSpec = WDML_MakeAtomFromHsz(pServer->hszServiceSpec); @@ -1667,7 +1670,7 @@ void WDML_RemoveServer(WDML_INSTANCE* pInstance, HSZ hszService, HSZ hszTopic) { WDML_RemoveConv(pConv, WDML_SERVER_SIDE); /* don't care about return code (whether client window is present or not) */ - PostMessageA(pConv->hwndClient, WM_DDE_TERMINATE, (WPARAM)pConv->hwndServer, 0L); + PostMessageW(pConv->hwndClient, WM_DDE_TERMINATE, (WPARAM)pConv->hwndServer, 0); } } if (pServer == pInstance->servers) @@ -1814,7 +1817,7 @@ void WDML_RemoveConv(WDML_CONV* pRef, WDML_SIDE side) * this would help the wndProc do appropriate handling upon a WM_DESTROY message */ hWnd = (side == WDML_CLIENT_SIDE) ? pRef->hwndClient : pRef->hwndServer; - SetWindowLongA(hWnd, GWL_WDML_CONVERSATION, 0); + SetWindowLongPtrW(hWnd, GWL_WDML_CONVERSATION, 0); DestroyWindow((side == WDML_CLIENT_SIDE) ? pRef->hwndClient : pRef->hwndServer); @@ -1934,7 +1937,7 @@ WDML_CONV* WDML_GetConv(HCONV hConv, BOOL checkConnected) */ WDML_CONV* WDML_GetConvFromWnd(HWND hWnd) { - return (WDML_CONV*)GetWindowLongA(hWnd, GWL_WDML_CONVERSATION); + return (WDML_CONV*)GetWindowLongPtrW(hWnd, GWL_WDML_CONVERSATION); } /****************************************************************** @@ -1968,7 +1971,7 @@ BOOL WDML_PostAck(WDML_CONV* pConv, WDML_SIDE side, WORD appRetCode, lParam = (lParam) ? ReuseDDElParam(lParam, oldMsg, WM_DDE_ACK, *(WORD*)&ddeAck, pmt) : PackDDElParam(WM_DDE_ACK, *(WORD*)&ddeAck, pmt); - if (!PostMessageA(to, WM_DDE_ACK, (WPARAM)from, lParam)) + if (!PostMessageW(to, WM_DDE_ACK, (WPARAM)from, lParam)) { pConv->wStatus &= ~ST_CONNECTED; FreeDDElParam(WM_DDE_ACK, lParam); @@ -2030,7 +2033,7 @@ static BOOL WDML_GetLocalConvInfo(WDML_CONV* pConv, CONVINFO* ci, DWORD id) WDML_LINK* pLink; WDML_SIDE side; - ci->hConvPartner = (pConv->wStatus & ST_ISLOCAL) ? (HCONV)((DWORD)pConv | 1) : 0; + ci->hConvPartner = (pConv->wStatus & ST_ISLOCAL) ? (HCONV)((ULONG_PTR)pConv | 1) : 0; ci->hszSvcPartner = pConv->hszService; ci->hszServiceReq = pConv->hszService; /* FIXME: they shouldn't be the same, should they ? */ ci->hszTopic = pConv->hszTopic; @@ -2121,9 +2124,9 @@ UINT WINAPI DdeQueryConvInfo(HCONV hConv, DWORD id, PCONVINFO lpConvInfo) { ret = 0; } - else if ((DWORD)hConv & 1) + else if ((ULONG_PTR)hConv & 1) { - pConv = WDML_GetConv((HCONV)((DWORD)hConv & ~1), FALSE); + pConv = WDML_GetConv((HCONV)((ULONG_PTR)hConv & ~1), FALSE); if (pConv != NULL) { FIXME("Request on remote conversation information is not implemented yet\n"); @@ -2362,7 +2365,7 @@ BOOL WDML_UnQueueTransaction(WDML_CONV* pConv, WDML_XACT* pXAct) void WDML_FreeTransaction(WDML_INSTANCE* pInstance, WDML_XACT* pXAct, BOOL doFreePmt) { /* free pmt(s) in pXAct too. check against one for not deleting TRUE return values */ - if (doFreePmt && (DWORD)pXAct->hMem > 1) + if (doFreePmt && (ULONG_PTR)pXAct->hMem > 1) { GlobalFree(pXAct->hMem); } @@ -2397,7 +2400,7 @@ WDML_XACT* WDML_FindTransaction(WDML_CONV* pConv, DWORD tid) struct tagWDML_BroadcastPmt { - LPCSTR clsName; + LPCWSTR clsName; UINT uMsg; WPARAM wParam; LPARAM lParam; @@ -2411,12 +2414,12 @@ struct tagWDML_BroadcastPmt static BOOL CALLBACK WDML_BroadcastEnumProc(HWND hWnd, LPARAM lParam) { struct tagWDML_BroadcastPmt* s = (struct tagWDML_BroadcastPmt*)lParam; - char buffer[128]; + WCHAR buffer[128]; - if (GetClassNameA(hWnd, buffer, sizeof(buffer)) > 0 && - strcmp(buffer, s->clsName) == 0) + if (GetClassNameW(hWnd, buffer, 128) > 0 && + lstrcmpiW(buffer, s->clsName) == 0) { - PostMessageA(hWnd, s->uMsg, s->wParam, s->lParam); + PostMessageW(hWnd, s->uMsg, s->wParam, s->lParam); } return TRUE; } @@ -2426,7 +2429,7 @@ static BOOL CALLBACK WDML_BroadcastEnumProc(HWND hWnd, LPARAM lParam) * * */ -void WDML_BroadcastDDEWindows(const char* clsName, UINT uMsg, WPARAM wParam, LPARAM lParam) +void WDML_BroadcastDDEWindows(LPCWSTR clsName, UINT uMsg, WPARAM wParam, LPARAM lParam) { struct tagWDML_BroadcastPmt s; diff --git a/dlls/user/dde/server.c b/dlls/user/dde/server.c index 0bb91b89b34..39b5c5d86ce 100644 --- a/dlls/user/dde/server.c +++ b/dlls/user/dde/server.c @@ -8,6 +8,7 @@ * Copyright 1999 Keith Matthews * Copyright 2000 Corel * Copyright 2001 Eric Pouech + * Copyright 2003, 2004, 2005 Dmitry Timoshkov * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -39,9 +40,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(ddeml); -static const char szServerNameClassA[] = "DdeServerNameAnsi"; -const char WDML_szServerConvClassA[] = "DdeServerConvAnsi"; -const WCHAR WDML_szServerConvClassW[] = {'D','d','e','S','e','r','v','e','r','C','o','n','v','U','n','i','c','o','d','e',0}; +static const WCHAR szServerNameClass[] = {'W','i','n','e','D','d','e','S','e','r','v','e','r','N','a','m','e',0}; +const WCHAR WDML_szServerConvClass[] = {'W','i','n','e','D','d','e','S','e','r','v','e','r','C','o','n','v',0}; static LRESULT CALLBACK WDML_ServerNameProc(HWND, UINT, WPARAM, LPARAM); static LRESULT CALLBACK WDML_ServerConvProc(HWND, UINT, WPARAM, LPARAM); @@ -132,7 +132,7 @@ BOOL WINAPI DdePostAdvise(DWORD idInst, HSZ hszTopic, HSZ hszItem) goto theError; } - if (!PostMessageA(pConv->hwndClient, WM_DDE_DATA, (WPARAM)pConv->hwndServer, + if (!PostMessageW(pConv->hwndClient, WM_DDE_DATA, (WPARAM)pConv->hwndServer, PackDDElParam(WM_DDE_DATA, (UINT_PTR)hItemData, atom))) { ERR("post message failed\n"); @@ -173,7 +173,7 @@ HDDEDATA WINAPI DdeNameService(DWORD idInst, HSZ hsz1, HSZ hsz2, UINT afCmd) WDML_INSTANCE* pInstance; HDDEDATA hDdeData; HWND hwndServer; - WNDCLASSEXA wndclass; + WNDCLASSEXW wndclass; hDdeData = NULL; @@ -233,25 +233,25 @@ HDDEDATA WINAPI DdeNameService(DWORD idInst, HSZ hsz1, HSZ hsz2, UINT afCmd) wndclass.style = 0; wndclass.lpfnWndProc = WDML_ServerNameProc; wndclass.cbClsExtra = 0; - wndclass.cbWndExtra = 2 * sizeof(DWORD); + wndclass.cbWndExtra = 2 * sizeof(ULONG_PTR); wndclass.hInstance = 0; wndclass.hIcon = 0; wndclass.hCursor = 0; wndclass.hbrBackground = 0; wndclass.lpszMenuName = NULL; - wndclass.lpszClassName = szServerNameClassA; + wndclass.lpszClassName = szServerNameClass; wndclass.hIconSm = 0; - RegisterClassExA(&wndclass); + RegisterClassExW(&wndclass); LeaveCriticalSection(&WDML_CritSect); - hwndServer = CreateWindowA(szServerNameClassA, NULL, + hwndServer = CreateWindowW(szServerNameClass, NULL, WS_POPUP, 0, 0, 0, 0, 0, 0, 0, 0); EnterCriticalSection(&WDML_CritSect); - SetWindowLongA(hwndServer, GWL_WDML_INSTANCE, (DWORD)pInstance); - SetWindowLongA(hwndServer, GWL_WDML_SERVER, (DWORD)pServer); + SetWindowLongPtrW(hwndServer, GWL_WDML_INSTANCE, (ULONG_PTR)pInstance); + SetWindowLongPtrW(hwndServer, GWL_WDML_SERVER, (ULONG_PTR)pServer); TRACE("Created nameServer=%p for instance=%08lx\n", hwndServer, idInst); pServer->hwndServer = hwndServer; @@ -310,53 +310,26 @@ static WDML_CONV* WDML_CreateServerConv(WDML_INSTANCE* pInstance, HWND hwndClien { HWND hwndServerConv; WDML_CONV* pConv; + WNDCLASSEXW wndclass; - if (pInstance->unicode) - { - WNDCLASSEXW wndclass; + wndclass.cbSize = sizeof(wndclass); + wndclass.style = 0; + wndclass.lpfnWndProc = WDML_ServerConvProc; + wndclass.cbClsExtra = 0; + wndclass.cbWndExtra = 2 * sizeof(ULONG_PTR); + wndclass.hInstance = 0; + wndclass.hIcon = 0; + wndclass.hCursor = 0; + wndclass.hbrBackground = 0; + wndclass.lpszMenuName = NULL; + wndclass.lpszClassName = WDML_szServerConvClass; + wndclass.hIconSm = 0; - wndclass.cbSize = sizeof(wndclass); - wndclass.style = 0; - wndclass.lpfnWndProc = WDML_ServerConvProc; - wndclass.cbClsExtra = 0; - wndclass.cbWndExtra = 2 * sizeof(DWORD); - wndclass.hInstance = 0; - wndclass.hIcon = 0; - wndclass.hCursor = 0; - wndclass.hbrBackground = 0; - wndclass.lpszMenuName = NULL; - wndclass.lpszClassName = WDML_szServerConvClassW; - wndclass.hIconSm = 0; + RegisterClassExW(&wndclass); - RegisterClassExW(&wndclass); - - hwndServerConv = CreateWindowW(WDML_szServerConvClassW, 0, + hwndServerConv = CreateWindowW(WDML_szServerConvClass, 0, WS_CHILD, 0, 0, 0, 0, hwndServerName, 0, 0, 0); - } - else - { - WNDCLASSEXA wndclass; - - wndclass.cbSize = sizeof(wndclass); - wndclass.style = 0; - wndclass.lpfnWndProc = WDML_ServerConvProc; - wndclass.cbClsExtra = 0; - wndclass.cbWndExtra = 2 * sizeof(DWORD); - wndclass.hInstance = 0; - wndclass.hIcon = 0; - wndclass.hCursor = 0; - wndclass.hbrBackground = 0; - wndclass.lpszMenuName = NULL; - wndclass.lpszClassName = WDML_szServerConvClassA; - wndclass.hIconSm = 0; - - RegisterClassExA(&wndclass); - - hwndServerConv = CreateWindowA(WDML_szServerConvClassA, 0, - WS_CHILD, 0, 0, 0, 0, - hwndServerName, 0, 0, 0); - } TRACE("Created convServer=%p (nameServer=%p) for instance=%08lx\n", hwndServerConv, hwndServerName, pInstance->instanceID); @@ -365,12 +338,12 @@ static WDML_CONV* WDML_CreateServerConv(WDML_INSTANCE* pInstance, HWND hwndClien hwndClient, hwndServerConv); if (pConv) { - SetWindowLongA(hwndServerConv, GWL_WDML_INSTANCE, (DWORD)pInstance); - SetWindowLongA(hwndServerConv, GWL_WDML_CONVERSATION, (DWORD)pConv); + SetWindowLongPtrW(hwndServerConv, GWL_WDML_INSTANCE, (ULONG_PTR)pInstance); + SetWindowLongPtrW(hwndServerConv, GWL_WDML_CONVERSATION, (ULONG_PTR)pConv); /* this should be the only place using SendMessage for WM_DDE_ACK */ /* note: sent messages shall not use packing */ - SendMessageA(hwndClient, WM_DDE_ACK, (WPARAM)hwndServerConv, + SendMessageW(hwndClient, WM_DDE_ACK, (WPARAM)hwndServerConv, MAKELPARAM(WDML_MakeAtomFromHsz(hszApp), WDML_MakeAtomFromHsz(hszTopic))); /* we assume we're connected since we've sent an answer... * I'm not sure what we can do... it doesn't look like the return value @@ -425,7 +398,7 @@ static LRESULT CALLBACK WDML_ServerNameProc(HWND hwndServer, UINT iMsg, WPARAM w CONVCONTEXT cc; CONVCONTEXT* pcc = NULL; WDML_CONV* pConv; - char buf[256]; + WCHAR buf[256]; if (GetWindowThreadProcessId(hwndClient, NULL) == GetWindowThreadProcessId(hwndServer, NULL) && WDML_GetInstanceFromWnd(hwndClient) == WDML_GetInstanceFromWnd(hwndServer)) @@ -435,15 +408,13 @@ static LRESULT CALLBACK WDML_ServerNameProc(HWND hwndServer, UINT iMsg, WPARAM w /* FIXME: so far, we don't grab distant convcontext, so only check if remote is * handled under DDEML, and if so build a default context */ - if ((GetClassNameA(hwndClient, buf, sizeof(buf)) && - strcmp(buf, WDML_szClientConvClassA) == 0) || - (GetClassNameW(hwndClient, (LPWSTR)buf, sizeof(buf)/sizeof(WCHAR)) && - lstrcmpW((LPWSTR)buf, WDML_szClientConvClassW) == 0)) + if (GetClassNameW(hwndClient, buf, sizeof(buf)/sizeof(WCHAR)) && + lstrcmpiW(buf, WDML_szClientConvClass) == 0) { pcc = &cc; memset(pcc, 0, sizeof(*pcc)); pcc->cb = sizeof(*pcc); - pcc->iCodePage = IsWindowUnicode(hwndClient) ? CP_WINUNICODE : CP_WINANSI; + pcc->iCodePage = CP_WINUNICODE; } if ((pInstance->CBFflags & CBF_FAIL_SELFCONNECTIONS) && self) { @@ -451,7 +422,7 @@ static LRESULT CALLBACK WDML_ServerNameProc(HWND hwndServer, UINT iMsg, WPARAM w } else if (hszApp && hszTop) { - WDML_SERVER* pServer = (WDML_SERVER*)GetWindowLongA(hwndServer, GWL_WDML_SERVER); + WDML_SERVER* pServer = (WDML_SERVER*)GetWindowLongPtrW(hwndServer, GWL_WDML_SERVER); /* check filters for name service */ if (!pServer->filterOn || DdeCmpStringHandles(pServer->hszService, hszApp) == 0) @@ -459,7 +430,7 @@ static LRESULT CALLBACK WDML_ServerNameProc(HWND hwndServer, UINT iMsg, WPARAM w /* pass on to the callback */ hDdeData = WDML_InvokeCallback(pInstance, XTYP_CONNECT, 0, 0, hszTop, hszApp, 0, (ULONG_PTR)pcc, self); - if ((UINT)hDdeData) + if ((ULONG_PTR)hDdeData) { pConv = WDML_CreateServerConv(pInstance, hwndClient, hwndServer, hszApp, hszTop); @@ -483,7 +454,7 @@ static LRESULT CALLBACK WDML_ServerNameProc(HWND hwndServer, UINT iMsg, WPARAM w /* MS doc is not consistent here */ FIXME("CBR_BLOCK returned for WILDCONNECT\n"); } - else if ((UINT)hDdeData != 0) + else if ((ULONG_PTR)hDdeData != 0) { HSZPAIR* hszp; @@ -511,7 +482,6 @@ static LRESULT CALLBACK WDML_ServerNameProc(HWND hwndServer, UINT iMsg, WPARAM w return 0; - case WM_DDE_REQUEST: FIXME("WM_DDE_REQUEST message received!\n"); return 0; @@ -530,10 +500,11 @@ static LRESULT CALLBACK WDML_ServerNameProc(HWND hwndServer, UINT iMsg, WPARAM w case WM_DDE_TERMINATE: FIXME("WM_DDE_TERMINATE message received!\n"); return 0; - + default: + break; } - return DefWindowProcA(hwndServer, iMsg, wParam, lParam); + return DefWindowProcW(hwndServer, iMsg, wParam, lParam); } /****************************************************************** @@ -584,7 +555,7 @@ static WDML_QUEUE_STATE WDML_ServerHandleRequest(WDML_CONV* pConv, WDML_XACT* pX default: { HGLOBAL hMem = WDML_DataHandle2Global(hDdeData, TRUE, FALSE, FALSE, FALSE); - if (!PostMessageA(pConv->hwndClient, WM_DDE_DATA, (WPARAM)pConv->hwndServer, + if (!PostMessageW(pConv->hwndClient, WM_DDE_DATA, (WPARAM)pConv->hwndServer, ReuseDDElParam(pXAct->lParam, WM_DDE_REQUEST, WM_DDE_DATA, (UINT_PTR)hMem, (UINT_PTR)pXAct->atom))) { @@ -928,7 +899,7 @@ static WDML_QUEUE_STATE WDML_ServerHandleTerminate(WDML_CONV* pConv, WDML_XACT* WDML_InvokeCallback(pConv->instance, XTYP_DISCONNECT, 0, (HCONV)pConv, 0, 0, 0, 0, (pConv->wStatus & ST_ISSELF) ? 1 : 0); } - PostMessageA(pConv->hwndClient, WM_DDE_TERMINATE, (WPARAM)pConv->hwndServer, 0); + PostMessageW(pConv->hwndClient, WM_DDE_TERMINATE, (WPARAM)pConv->hwndServer, 0); WDML_RemoveConv(pConv, WDML_SERVER_SIDE); return WDML_QS_HANDLED; @@ -1007,8 +978,7 @@ static LRESULT CALLBACK WDML_ServerConvProc(HWND hwndServer, UINT iMsg, WPARAM w } if (iMsg < WM_DDE_FIRST || iMsg > WM_DDE_LAST) { - return IsWindowUnicode(hwndServer) ? DefWindowProcW(hwndServer, iMsg, wParam, lParam) : - DefWindowProcA(hwndServer, iMsg, wParam, lParam); + return DefWindowProcW(hwndServer, iMsg, wParam, lParam); } EnterCriticalSection(&WDML_CritSect);