[ros-diffs] [fireball] 22608: Sync DDE with Wine

fireball at svn.reactos.org fireball at svn.reactos.org
Sun Jun 25 12:38:50 CEST 2006


Author: fireball
Date: Sun Jun 25 14:38:48 2006
New Revision: 22608

URL: http://svn.reactos.org/svn/reactos?rev=22608&view=rev
Log:
Sync DDE with Wine

Modified:
    trunk/reactos/dll/win32/user32/include/dde_private.h
    trunk/reactos/dll/win32/user32/misc/dde.c
    trunk/reactos/dll/win32/user32/misc/ddeclient.c
    trunk/reactos/dll/win32/user32/misc/ddeserver.c
    trunk/reactos/include/dde.h
    trunk/reactos/include/ddeml.h

Modified: trunk/reactos/dll/win32/user32/include/dde_private.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/include/dde_private.h?rev=22608&r1=22607&r2=22608&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/include/dde_private.h (original)
+++ trunk/reactos/dll/win32/user32/include/dde_private.h Sun Jun 25 14:38:48 2006
@@ -1,5 +1,3 @@
-/* -*- tab-width: 8; c-basic-offset: 4 -*- */
-
 /*
  * DDEML library
  *
@@ -40,7 +38,7 @@
  *      - a popup window (InstanceClass) is created for each instance.
  *      - this window is used to receive all the DDEML events (server registration,
  *	  conversation confirmation...). See the WM_WDML_???? messages for details
- * + when registring a server (DdeNameService) a WDML_SERVER is created
+ * + when registering a server (DdeNameService) a WDML_SERVER is created
  *	- a popup window (ServerNameClass) is created
  * + a conversation is represented by two WDML_CONV structures:
  *	- one on the client side, the other one on the server side
@@ -129,6 +127,7 @@
     struct tagWDML_INSTANCE*	instance;
     HSZ				hszService;	/* pmt used for connection */
     HSZ				hszTopic;	/* pmt used for connection */
+    UINT			magic;		/* magic number to check validity */
     UINT			afCmd;		/* service name flag */
     CONVCONTEXT			convContext;
     HWND			hwndClient;	/* source of conversation (ClientConvClass) */
@@ -139,6 +138,8 @@
     DWORD			wConvst;	/* same values as convinfo.wConvst */
 } WDML_CONV;
 
+#define WDML_CONV_MAGIC  0xbabe1234
+
 /* DDE_LINK struct defines hot, warm, and cold links */
 typedef struct tagWDML_LINK {
     struct tagWDML_LINK*	next;		/* to link all the active links */
@@ -155,7 +156,7 @@
     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			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;
@@ -173,7 +174,7 @@
 /* header for the DDE Data objects */
 typedef struct tagDDE_DATAHANDLE_HEAD
 {
-    short	cfFormat;
+    WORD	cfFormat;
     WORD        bAppOwned;
 } DDE_DATAHANDLE_HEAD;
 
@@ -188,7 +189,7 @@
 
 extern	HDDEDATA 	WDML_InvokeCallback(WDML_INSTANCE* pInst, UINT uType, UINT uFmt, HCONV hConv,
 					    HSZ hsz1, HSZ hsz2, HDDEDATA hdata,
-					    DWORD dwData1, DWORD dwData2);
+					    ULONG_PTR dwData1, ULONG_PTR dwData2);
 extern	HDDEDATA 	WDML_InvokeCallback16(PFNCALLBACK pfn, UINT uType, UINT uFmt, HCONV hConv,
 					      HSZ hsz1, HSZ hsz2, HDDEDATA hdata,
 					      DWORD dwData1, DWORD dwData2);
@@ -235,20 +236,20 @@
 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);
 
-static __inline void WDML_ExtractAck(WORD status, DDEACK* da)
+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 char WDML_szServerConvClassA[]; /* ANSI class of window for server side conv */
+extern const WCHAR WDML_szServerConvClassW[]; /* unicode class of window for server side conv */
+extern const char WDML_szClientConvClassA[]; /* ANSI class of window for client side conv */
+extern const WCHAR WDML_szClientConvClassW[]; /* unicode class of window for client side conv */
 
 #define WM_WDML_REGISTER	(WM_USER + 0x200)
 #define WM_WDML_UNREGISTER	(WM_USER + 0x201)
@@ -262,7 +263,7 @@
  */
 
 #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 */

Modified: trunk/reactos/dll/win32/user32/misc/dde.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/misc/dde.c?rev=22608&r1=22607&r2=22608&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/misc/dde.c (original)
+++ trunk/reactos/dll/win32/user32/misc/dde.c Sun Jun 25 14:38:48 2006
@@ -6,6 +6,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
@@ -33,14 +34,14 @@
 #define HSZ2ATOM(hsz)	((ATOM)	(ULONG_PTR)(hsz))
 
 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";
+static LONG		WDML_MaxInstanceID = 0;  /* OK for present, have to worry about wrap-around later */
+const WCHAR		WDML_szEventClass[] = {'D','d','e','E','v','e','n','t','C','l','a','s','s',0};
 
 static CRITICAL_SECTION_DEBUG critsect_debug =
 {
     0, 0, &WDML_CritSect,
     { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList },
-      0, 0, { 0, (DWORD)(__FILE__ ": WDML_CritSect") }
+      0, 0, { (DWORD_PTR)(__FILE__ ": WDML_CritSect") }
 };
 CRITICAL_SECTION WDML_CritSect = { &critsect_debug, -1, 0, 0, 0, 0 };
 
@@ -192,7 +193,7 @@
             params[0] = uiLo;
             params[1] = uiHi;
             TRACE("Reusing pack %08x %08x\n", uiLo, uiHi);
-            GlobalLock( (HGLOBAL)lParam );
+            GlobalUnlock( (HGLOBAL)lParam );
             return lParam;
 
         case WM_DDE_EXECUTE:
@@ -246,7 +247,7 @@
  */
 static void WDML_IncrementInstanceId(WDML_INSTANCE* pInstance)
 {
-    DWORD	id = InterlockedIncrement((PLONG)&WDML_MaxInstanceID);
+    DWORD	id = InterlockedIncrement(&WDML_MaxInstanceID);
 
     pInstance->instanceID = id;
     TRACE("New instance id %ld allocated\n", id);
@@ -315,7 +316,7 @@
 	}
 	break;
     default:
-	return DefWindowProcA(hwndEvent, uMsg, wParam, lParam);
+	return DefWindowProcW(hwndEvent, uMsg, wParam, lParam);
     }
     return 0;
 }
@@ -331,7 +332,7 @@
     WDML_INSTANCE*		pInstance;
     WDML_INSTANCE*		reference_inst;
     UINT			ret;
-    WNDCLASSEXA			wndclass;
+    WNDCLASSEXW			wndclass;
 
     TRACE("(%p,%p,0x%lx,%ld)\n",
 	  pidInst, pfnCallback, afCmd, ulRes);
@@ -382,7 +383,7 @@
 	    (pInstance->CBFflags & CBF_FAIL_ALLSVRXACTIONS) == CBF_FAIL_ALLSVRXACTIONS;
     }
 
-    TRACE("instance created - checking validity \n");
+    TRACE("instance created - checking validity\n");
 
     if (*pidInst == 0)
     {
@@ -468,7 +469,7 @@
 	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;
@@ -477,13 +478,13 @@
 	wndclass.lpszClassName = WDML_szEventClass;
 	wndclass.hIconSm       = 0;
 
-	RegisterClassExA(&wndclass);
-
-	pInstance->hwndEvent = CreateWindowA(WDML_szEventClass, NULL,
+	RegisterClassExW(&wndclass);
+
+	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");
     }
@@ -567,6 +568,8 @@
 
 /******************************************************************************
  *            DdeInitializeA   (USER32.@)
+ *
+ * See DdeInitializeW.
  */
 UINT WINAPI DdeInitializeA(LPDWORD pidInst, PFNCALLBACK pfnCallback,
 			   DWORD afCmd, DWORD ulRes)
@@ -702,7 +705,7 @@
  */
 HDDEDATA 	WDML_InvokeCallback(WDML_INSTANCE* pInstance, UINT uType, UINT uFmt, HCONV hConv,
 				    HSZ hsz1, HSZ hsz2, HDDEDATA hdata,
-				    DWORD dwData1, DWORD dwData2)
+				    ULONG_PTR dwData1, ULONG_PTR dwData2)
 {
     HDDEDATA	ret;
 
@@ -750,7 +753,7 @@
  */
 WDML_INSTANCE*	WDML_GetInstanceFromWnd(HWND hWnd)
 {
-    return (WDML_INSTANCE*)GetWindowLongA(hWnd, GWL_WDML_INSTANCE);
+    return (WDML_INSTANCE*)GetWindowLongPtrW(hWnd, GWL_WDML_INSTANCE);
 }
 
 /******************************************************************************
@@ -1049,11 +1052,11 @@
     {
     case CP_WINANSI:
 	hsz = ATOM2HSZ(AddAtomA(ptr));
-	TRACE("added atom %s with HSZ %p, \n", debugstr_a(ptr), hsz);
+	TRACE("added atom %s with HSZ %p,\n", debugstr_a(ptr), hsz);
 	break;
     case CP_WINUNICODE:
 	hsz = ATOM2HSZ(AddAtomW(ptr));
-	TRACE("added atom %s with HSZ %p, \n", debugstr_w(ptr), hsz);
+	TRACE("added atom %s with HSZ %p,\n", debugstr_w(ptr), hsz);
 	break;
     default:
 	ERR("Unknown code page %d\n", codepage);
@@ -1066,11 +1069,9 @@
 /*****************************************************************
  * DdeCreateStringHandleA [USER32.@]
  *
- * RETURNS
- *    Success: String handle
- *    Failure: 0
- */
-HSZ WINAPI DdeCreateStringHandleA(DWORD idInst, LPSTR psz, INT codepage)
+ * See DdeCreateStringHandleW.
+ */
+HSZ WINAPI DdeCreateStringHandleA(DWORD idInst, LPCSTR psz, INT codepage)
 {
     HSZ			hsz = 0;
     WDML_INSTANCE*	pInstance;
@@ -1102,7 +1103,7 @@
  *    Success: String handle
  *    Failure: 0
  */
-HSZ WINAPI DdeCreateStringHandleW(DWORD idInst, LPWSTR psz, INT codepage)
+HSZ WINAPI DdeCreateStringHandleW(DWORD idInst, LPCWSTR psz, INT codepage)
 {
     WDML_INSTANCE*	pInstance;
     HSZ			hsz = 0;
@@ -1124,15 +1125,16 @@
 
 /*****************************************************************
  *            DdeFreeStringHandle   (USER32.@)
- * RETURNS: success: nonzero
- *          fail:    zero
+ * RETURNS
+ *  success: nonzero
+ *  fail:    zero
  */
 BOOL WINAPI DdeFreeStringHandle(DWORD idInst, HSZ hsz)
 {
     WDML_INSTANCE*	pInstance;
     BOOL		ret = FALSE;
 
-    TRACE("(%ld,%p): \n", idInst, hsz);
+    TRACE("(%ld,%p):\n", idInst, hsz);
 
     EnterCriticalSection(&WDML_CritSect);
 
@@ -1150,15 +1152,16 @@
 /*****************************************************************
  *            DdeKeepStringHandle  (USER32.@)
  *
- * RETURNS: success: nonzero
- *          fail:    zero
+ * RETURNS
+ *  success: nonzero
+ *  fail:    zero
  */
 BOOL WINAPI DdeKeepStringHandle(DWORD idInst, HSZ hsz)
 {
     WDML_INSTANCE*	pInstance;
     BOOL		ret = FALSE;
 
-    TRACE("(%ld,%p): \n", idInst, hsz);
+    TRACE("(%ld,%p):\n", idInst, hsz);
 
     EnterCriticalSection(&WDML_CritSect);
 
@@ -1178,7 +1181,11 @@
  * Compares the value of two string handles.  This comparison is
  * not case sensitive.
  *
- * Returns:
+ * PARAMS
+ *  hsz1    [I] Handle to the first string
+ *  hsz2    [I] Handle to the second string
+ *
+ * RETURNS
  * -1 The value of hsz1 is zero or less than hsz2
  * 0  The values of hsz 1 and 2 are the same or both zero.
  * 1  The value of hsz2 is zero of less than hsz1
@@ -1254,9 +1261,13 @@
     DDE_DATAHANDLE_HEAD*	pDdh;
     WCHAR psz[MAX_BUFFER_LEN];
 
-    GetAtomNameW(HSZ2ATOM(hszItem), psz, MAX_BUFFER_LEN);
-
-    TRACE("(%ld,%p,cb %ld, cbOff %ld,%p <%s>,%x,%x)\n",
+    if (!GetAtomNameW(HSZ2ATOM(hszItem), psz, MAX_BUFFER_LEN))
+    {
+        psz[0] = HSZ2ATOM(hszItem);
+        psz[1] = 0;
+    }
+
+    TRACE("(%ld,%p,cb %ld, cbOff %ld,%p <%s>,fmt %04x,%x)\n",
 	  idInst, pSrc, cb, cbOff, hszItem, debugstr_w(psz), wFmt, afCmd);
 
     if (afCmd != 0 && afCmd != HDATA_APPOWNED)
@@ -1286,6 +1297,7 @@
     }
     GlobalUnlock(hMem);
 
+    TRACE("=> %p\n", hMem);
     return (HDDEDATA)hMem;
 }
 
@@ -1393,7 +1405,7 @@
     {
 	*pcbDataSize = GlobalSize(hMem) - sizeof(DDE_DATAHANDLE_HEAD);
     }
-    TRACE("=> %p (%lu)\n", pDdh + 1, GlobalSize(hMem) - sizeof(DDE_DATAHANDLE_HEAD));
+    TRACE("=> %p (%lu) fmt %04x\n", pDdh + 1, GlobalSize(hMem) - sizeof(DDE_DATAHANDLE_HEAD), pDdh->cfFormat);
     return (LPBYTE)(pDdh + 1);
 }
 
@@ -1468,8 +1480,8 @@
             switch (pDd->cfFormat)
             {
             default:
-                FIXME("Unsupported format (%d) for data... assuming raw information\n",
-                      pDd->cfFormat);
+                FIXME("Unsupported format (%04x) for data %p, passing raw information\n",
+                      pDd->cfFormat, hMem);
                 /* fall thru */
             case 0:
             case CF_TEXT:
@@ -1527,7 +1539,8 @@
         switch (pDdh->cfFormat)
         {
         default:
-            FIXME("Unsupported format (%d) for data... passing raw information\n", pDdh->cfFormat);
+            FIXME("Unsupported format (%04x) for data %p, passing raw information\n",
+                   pDdh->cfFormat, hDdeData);
             /* fall thru */
         case 0:
         case CF_TEXT:
@@ -1544,7 +1557,7 @@
                 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,
@@ -1587,18 +1600,20 @@
  */
 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);
-
-    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);
+    pServer->hszService = hszService;
+    WDML_IncHSZ(pInstance, hszService);
+
+    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);
@@ -1638,7 +1653,7 @@
 		{
 		    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)
@@ -1711,6 +1726,7 @@
     pConv->instance = pInstance;
     WDML_IncHSZ(pInstance, pConv->hszService = hszService);
     WDML_IncHSZ(pInstance, pConv->hszTopic = hszTopic);
+    pConv->magic = WDML_CONV_MAGIC;
     pConv->hwndServer = hwndServer;
     pConv->hwndClient = hwndClient;
     pConv->transactions = NULL;
@@ -1785,7 +1801,7 @@
      * 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);
 
@@ -1804,7 +1820,7 @@
 	    {
 		pPrev->next = pCurrent->next;
 	    }
-
+	    pCurrent->magic = 0;
 	    HeapFree(GetProcessHeap(), 0, pCurrent);
 	    break;
 	}
@@ -1882,14 +1898,14 @@
     WDML_CONV*	pConv = (WDML_CONV*)hConv;
 
     /* FIXME: should do better checking */
-    if (pConv == NULL) return NULL;
+    if (pConv == NULL || pConv->magic != WDML_CONV_MAGIC) return NULL;
 
     if (checkConnected && !(pConv->wStatus & ST_CONNECTED))
     {
 	FIXME("found conv but ain't connected\n");
 	return NULL;
     }
-    if (GetCurrentThreadId() != pConv->instance->threadID)
+    if (!pConv->instance || GetCurrentThreadId() != pConv->instance->threadID)
     {
 	FIXME("wrong thread ID\n");
 	return NULL;
@@ -1905,7 +1921,7 @@
  */
 WDML_CONV*	WDML_GetConvFromWnd(HWND hWnd)
 {
-    return (WDML_CONV*)GetWindowLongA(hWnd, GWL_WDML_CONVERSATION);
+    return (WDML_CONV*)GetWindowLongPtrW(hWnd, GWL_WDML_CONVERSATION);
 }
 
 /******************************************************************
@@ -1939,7 +1955,7 @@
 
     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);
@@ -2001,7 +2017,7 @@
     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;
@@ -2070,6 +2086,7 @@
 /******************************************************************
  *		DdeQueryConvInfo (USER32.@)
  *
+ * FIXME: Set last DDE error on failure.
  */
 UINT WINAPI DdeQueryConvInfo(HCONV hConv, DWORD id, PCONVINFO lpConvInfo)
 {
@@ -2088,18 +2105,20 @@
     EnterCriticalSection(&WDML_CritSect);
 
     pConv = WDML_GetConv(hConv, FALSE);
-    if (pConv != NULL && !WDML_GetLocalConvInfo(pConv, &ci, id))
-    {
-	ret = 0;
-    }
-    else if ((DWORD)hConv & 1)
-    {
-	pConv = WDML_GetConv((HCONV)((DWORD)hConv & ~1), FALSE);
-	if (pConv != NULL)
-	{
-	    FIXME("Request on remote conversation information is not implemented yet\n");
-	    ret = 0;
-	}
+    if (pConv != NULL)
+    {
+        if (!WDML_GetLocalConvInfo(pConv, &ci, id))
+            ret = 0;
+    }
+    else
+    {
+        if ((ULONG_PTR)hConv & 1)
+        {
+            pConv = WDML_GetConv((HCONV)((ULONG_PTR)hConv & ~1), FALSE);
+            if (pConv != NULL)
+                FIXME("Request on remote conversation information is not implemented yet\n");
+        }
+        ret = 0;
     }
     LeaveCriticalSection(&WDML_CritSect);
     if (ret != 0)
@@ -2333,7 +2352,7 @@
 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);
     }
@@ -2368,7 +2387,7 @@
 
 struct tagWDML_BroadcastPmt
 {
-    LPCSTR	clsName;
+    LPCWSTR	clsName;
     UINT	uMsg;
     WPARAM	wParam;
     LPARAM	lParam;
@@ -2382,12 +2401,12 @@
 static	BOOL CALLBACK WDML_BroadcastEnumProc(HWND hWnd, LPARAM lParam)
 {
     struct tagWDML_BroadcastPmt*	s = (struct tagWDML_BroadcastPmt*)lParam;
-    char				buffer[128];
-
-    if (GetClassNameA(hWnd, buffer, sizeof(buffer)) > 0 &&
-	strcmp(buffer, s->clsName) == 0)
-    {
-	PostMessageA(hWnd, s->uMsg, s->wParam, s->lParam);
+    WCHAR				buffer[128];
+
+    if (GetClassNameW(hWnd, buffer, 128) > 0 &&
+	lstrcmpiW(buffer, s->clsName) == 0)
+    {
+	PostMessageW(hWnd, s->uMsg, s->wParam, s->lParam);
     }
     return TRUE;
 }
@@ -2397,7 +2416,7 @@
  *
  *
  */
-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;
 

Modified: trunk/reactos/dll/win32/user32/misc/ddeclient.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/misc/ddeclient.c?rev=22608&r1=22607&r2=22608&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/misc/ddeclient.c (original)
+++ trunk/reactos/dll/win32/user32/misc/ddeclient.c Sun Jun 25 14:38:48 2006
@@ -6,6 +6,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
@@ -113,48 +114,48 @@
 
     if (pInstance->unicode)
     {
-	WNDCLASSEXW	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_szClientConvClassW;
-	wndclass.hIconSm       = 0;
-
-	RegisterClassExW(&wndclass);
-
-	hwndClient = CreateWindowW(WDML_szClientConvClassW, NULL, WS_POPUP, 0, 0, 0, 0, 0, 0, 0, 0);
+        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_szClientConvClassW;
+        wndclass.hIconSm       = 0;
+
+        RegisterClassExW(&wndclass);
+
+        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);
-    }
-
-    SetWindowLongA(hwndClient, GWL_WDML_INSTANCE, (DWORD)pInstance);
+        WNDCLASSEXA	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_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, (ULONG_PTR)pInstance);
 
     if (hszService)
     {
@@ -187,7 +188,7 @@
     pConv = WDML_GetConvFromWnd(hwndClient);
     if (pConv == NULL || pConv->hwndServer == 0)
     {
-	ERR("Done with INITIATE, but no Server window available\n");
+	WARN("Done with INITIATE, but no Server window available\n");
 	pConv = NULL;
 	goto theEnd;
     }
@@ -245,7 +246,7 @@
 	    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);
@@ -254,7 +255,7 @@
 	    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);
@@ -284,7 +285,7 @@
 	    else
 	    {
 		/* reset the conversation as it was */
-		SetWindowLongA(pConv->hwndClient, GWL_WDML_CONVERSATION, (DWORD)pConv);
+		SetWindowLongPtrW(pConv->hwndClient, GWL_WDML_CONVERSATION, (ULONG_PTR)pConv);
 	    }
 	}
     }
@@ -341,7 +342,7 @@
  *
  * handles the reply to an advise request
  */
-static WDML_QUEUE_STATE WDML_HandleAdviseReply(WDML_CONV* pConv, MSG* msg, WDML_XACT* pXAct)
+static WDML_QUEUE_STATE WDML_HandleAdviseReply(WDML_CONV* pConv, MSG* msg, WDML_XACT* pXAct, DWORD *ack)
 {
     DDEACK		ddeAck;
     UINT_PTR		uiLo, uiHi;
@@ -361,6 +362,7 @@
     GlobalDeleteAtom(uiHi);
     FreeDDElParam(WM_DDE_ACK, msg->lParam);
 
+    if (ack) *ack = uiLo;
     WDML_ExtractAck(uiLo, &ddeAck);
 
     if (ddeAck.fAck)
@@ -426,7 +428,7 @@
  *
  *
  */
-static WDML_QUEUE_STATE WDML_HandleUnadviseReply(WDML_CONV* pConv, MSG* msg, WDML_XACT* pXAct)
+static WDML_QUEUE_STATE WDML_HandleUnadviseReply(WDML_CONV* pConv, MSG* msg, WDML_XACT* pXAct, DWORD *ack)
 {
     DDEACK	ddeAck;
     UINT_PTR	uiLo, uiHi;
@@ -446,6 +448,7 @@
     FreeDDElParam(WM_DDE_ACK, msg->lParam);
     GlobalDeleteAtom(uiHi);
 
+    if (ack) *ack = uiLo;
     WDML_ExtractAck(uiLo, &ddeAck);
 
     TRACE("WM_DDE_ACK received while waiting for a timeout\n");
@@ -497,7 +500,7 @@
  *
  *
  */
-static WDML_QUEUE_STATE WDML_HandleRequestReply(WDML_CONV* pConv, MSG* msg, WDML_XACT* pXAct)
+static WDML_QUEUE_STATE WDML_HandleRequestReply(WDML_CONV* pConv, MSG* msg, WDML_XACT* pXAct, DWORD *ack)
 {
     DDEACK		ddeAck;
     WINE_DDEHEAD	wdh;
@@ -513,6 +516,7 @@
         UnpackDDElParam(WM_DDE_ACK, msg->lParam, &uiLo, &uiHi);
         FreeDDElParam(WM_DDE_ACK, msg->lParam);
 	GlobalDeleteAtom(uiHi);
+       if (ack) *ack = uiLo;
 	WDML_ExtractAck(uiLo, &ddeAck);
 	pXAct->hDdeData = 0;
 	if (ddeAck.fAck)
@@ -565,8 +569,11 @@
     BOOL	clientUnicode, serverUnicode;
     DWORD	memSize;
 
-    clientUnicode = IsWindowUnicode(pConv->hwndClient);
-    serverUnicode = IsWindowUnicode(pConv->hwndServer);
+    clientUnicode = pConv->instance->unicode;
+    TRACE("client %p uses unicode = %d\n", pConv->hwndClient, clientUnicode);
+    /* FIXME: how exactly Windows determines what to use for the server side? */
+    serverUnicode = IsWindowUnicode(pConv->hwndServer) && IsWindowUnicode(pConv->hwndClient);
+    TRACE("server %p uses unicode = %d\n", pConv->hwndServer, serverUnicode);
 
     if (clientUnicode == serverUnicode)
     {
@@ -580,7 +587,7 @@
 	}
 	else
 	{
-	    memSize = MultiByteToWideChar( CP_ACP, 0, pData, cbData, NULL, 0);
+	    memSize = MultiByteToWideChar( CP_ACP, 0, pData, cbData, NULL, 0) * sizeof(WCHAR);
 	}
     }
 
@@ -588,7 +595,7 @@
 
     if (hMem)
     {
-	PCHAR	pDst;
+	LPSTR	pDst;
 
 	pDst = GlobalLock(hMem);
 	if (pDst)
@@ -605,7 +612,7 @@
 		}
 		else
 		{
-		    MultiByteToWideChar( CP_ACP, 0, pData, cbData, (LPWSTR)pDst, memSize);
+		    MultiByteToWideChar( CP_ACP, 0, pData, cbData, (LPWSTR)pDst, memSize/sizeof(WCHAR));
 		}
 	    }
 
@@ -661,7 +668,7 @@
  *
  *
  */
-static WDML_QUEUE_STATE WDML_HandleExecuteReply(WDML_CONV* pConv, MSG* msg, WDML_XACT* pXAct)
+static WDML_QUEUE_STATE WDML_HandleExecuteReply(WDML_CONV* pConv, MSG* msg, WDML_XACT* pXAct, DWORD *ack)
 {
     DDEACK	ddeAck;
     UINT_PTR	uiLo, uiHi;
@@ -679,8 +686,12 @@
         return WDML_QS_PASS;
     }
 
+    if (ack) *ack = uiLo;
     WDML_ExtractAck(uiLo, &ddeAck);
     pXAct->hDdeData = (HDDEDATA)(UINT_PTR)ddeAck.fAck;
+
+    TRACE("hDdeData = %p\n", pXAct->hDdeData);
+    pConv->instance->lastError = (pXAct->hDdeData != 0) ? DMLERR_NO_ERROR : DMLERR_NOTPROCESSED;
 
     return WDML_QS_HANDLED;
 }
@@ -737,9 +748,8 @@
  *
  *
  */
-static WDML_QUEUE_STATE WDML_HandlePokeReply(WDML_CONV* pConv, MSG* msg, WDML_XACT* pXAct)
-{
-    DDEACK	ddeAck;
+static WDML_QUEUE_STATE WDML_HandlePokeReply(WDML_CONV* pConv, MSG* msg, WDML_XACT* pXAct, DWORD *ack)
+{
     UINT_PTR	uiLo, uiHi;
     HSZ		hsz;
 
@@ -757,7 +767,7 @@
     FreeDDElParam(WM_DDE_ACK, msg->lParam);
     GlobalDeleteAtom(uiHi);
 
-    WDML_ExtractAck(uiLo, &ddeAck);
+    if (ack) *ack = uiLo;
     GlobalFree(pXAct->hMem);
 
     pXAct->hDdeData = (HDDEDATA)TRUE;
@@ -892,7 +902,7 @@
     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 */
@@ -904,7 +914,7 @@
  *
  * handles any incoming reply, and try to match to an already sent request
  */
-static WDML_QUEUE_STATE	WDML_HandleReply(WDML_CONV* pConv, MSG* msg, HDDEDATA* hdd)
+static WDML_QUEUE_STATE WDML_HandleReply(WDML_CONV* pConv, MSG* msg, HDDEDATA* hdd, DWORD *ack)
 {
     WDML_XACT*		pXAct = pConv->transactions;
     WDML_QUEUE_STATE	qs;
@@ -915,19 +925,19 @@
 	switch (pXAct->ddeMsg)
 	{
 	case WM_DDE_ADVISE:
-	    qs = WDML_HandleAdviseReply(pConv, msg, pXAct);
+	    qs = WDML_HandleAdviseReply(pConv, msg, pXAct, ack);
 	    break;
 	case WM_DDE_UNADVISE:
-	    qs = WDML_HandleUnadviseReply(pConv, msg, pXAct);
+	    qs = WDML_HandleUnadviseReply(pConv, msg, pXAct, ack);
 	    break;
 	case WM_DDE_EXECUTE:
-	    qs = WDML_HandleExecuteReply(pConv, msg, pXAct);
+	    qs = WDML_HandleExecuteReply(pConv, msg, pXAct, ack);
 	    break;
 	case WM_DDE_REQUEST:
-	    qs = WDML_HandleRequestReply(pConv, msg, pXAct);
+	    qs = WDML_HandleRequestReply(pConv, msg, pXAct, ack);
 	    break;
 	case WM_DDE_POKE:
-	    qs = WDML_HandlePokeReply(pConv, msg, pXAct);
+	    qs = WDML_HandlePokeReply(pConv, msg, pXAct, ack);
 	    break;
 	case WM_DDE_TERMINATE:
 	    qs = WDML_HandleTerminateReply(pConv, msg, pXAct);
@@ -993,7 +1003,7 @@
  * waits until an answer for a sent request is received
  * time out is also handled. only used for synchronous transactions
  */
-static HDDEDATA WDML_SyncWaitTransactionReply(HCONV hConv, DWORD dwTimeout, WDML_XACT* pXAct)
+static HDDEDATA WDML_SyncWaitTransactionReply(HCONV hConv, DWORD dwTimeout, WDML_XACT* pXAct, DWORD *ack)
 {
     DWORD	dwTime;
     DWORD	err;
@@ -1012,33 +1022,47 @@
 	if (MsgWaitForMultipleObjects(0, NULL, FALSE,
 				      dwTimeout - dwTime, QS_POSTMESSAGE) == WAIT_OBJECT_0)
 	{
-	    BOOL	ret = FALSE;
 	    MSG		msg;
-	    WDML_CONV*	pConv;
-	    HDDEDATA	hdd;
-
-	    EnterCriticalSection(&WDML_CritSect);
-
-	    pConv = WDML_GetConv(hConv, FALSE);
-	    if (pConv == NULL)
+
+	    while (PeekMessageW(&msg, 0, WM_DDE_FIRST, WM_DDE_LAST, PM_REMOVE))
 	    {
-		LeaveCriticalSection(&WDML_CritSect);
-		/* conversation no longer available... return failure */
-		break;
-	    }
-	    while (PeekMessageA(&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);
-		ret = WDML_HandleReply(pConv, &msg, &hdd) == WDML_QS_HANDLED &&
-		    (pConv->transactions == NULL || ret);
-		if (ret) break;
-	    }
-	    LeaveCriticalSection(&WDML_CritSect);
-	    if (ret)
-	    {
-		return hdd;
-	    }
+                WDML_CONV *pConv;
+                HDDEDATA	hdd;
+
+                EnterCriticalSection(&WDML_CritSect);
+
+                pConv = WDML_GetConv(hConv, FALSE);
+                if (pConv == NULL)
+                {
+                    LeaveCriticalSection(&WDML_CritSect);
+                    /* conversation no longer available... return failure */
+                    return 0;
+                }
+                if (msg.hwnd == pConv->hwndClient)
+                {
+                    /* check that either pXAct has been processed or no more xActions are pending */
+                    BOOL ret = (pConv->transactions == pXAct);
+                    if (WDML_HandleReply(pConv, &msg, &hdd, ack) == WDML_QS_HANDLED)
+                    {
+                        TRACE("WDML_HandleReply returned WDML_QS_HANDLED\n");
+                        ret = TRUE;
+                    }
+                    else
+                        ret = (pConv->transactions == NULL || ret);
+
+                    if (ret)
+                    {
+                        pConv->instance->lastError = hdd ? DMLERR_NO_ERROR : DMLERR_NOTPROCESSED;
+                        LeaveCriticalSection(&WDML_CritSect);
+                        return hdd;
+                    }
+                }
+                else
+                {
+                    LeaveCriticalSection(&WDML_CritSect);
+                    DispatchMessageW(&msg);
+                }
+            }
 	}
     }
 
@@ -1084,7 +1108,7 @@
 
     if (hConv == 0)
     {
-	ERR("Invalid conversation handle\n");
+	WARN("Invalid conversation handle NULL\n");
 	return 0;
     }
 
@@ -1100,11 +1124,7 @@
     switch (wType)
     {
     case XTYP_EXECUTE:
-	if (hszItem != 0 || wFmt != 0)
-	{
-	    pConv->instance->lastError = DMLERR_INVALIDPARAMETER;
-	    goto theError;
-	}
+        /* Windows simply ignores hszItem and wFmt in this case */
 	pXAct = WDML_ClientQueueExecute(pConv, pData, cbData);
 	break;
     case XTYP_POKE:
@@ -1152,7 +1172,7 @@
 
     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());
@@ -1176,14 +1196,10 @@
     {
 	DWORD	count, i;
 
-	if (pdwResult)
-	{
-	    *pdwResult = 0L;
-	}
 	count = WDML_CritSect.RecursionCount;
 	for (i = 0; i < count; i++)
 	    LeaveCriticalSection(&WDML_CritSect);
-	hDdeData = WDML_SyncWaitTransactionReply((HCONV)pConv, dwTimeout, pXAct);
+	hDdeData = WDML_SyncWaitTransactionReply((HCONV)pConv, dwTimeout, pXAct, pdwResult);
 	for (i = 0; i < count; i++)
 	    EnterCriticalSection(&WDML_CritSect);
     }
@@ -1204,7 +1220,7 @@
     WDML_CONV*		pConv;
     WDML_XACT*          pXAct;
 
-    TRACE("(%08lx,%p,%08ld);\n", idInst, hConv, idTransaction);
+    TRACE("(%08lx,%p,%08lx);\n", idInst, hConv, idTransaction);
 
     EnterCriticalSection(&WDML_CritSect);
     if ((pInstance = WDML_GetInstance(idInst)))
@@ -1256,6 +1272,8 @@
     WDML_CONV*	pConv = NULL;
     HSZ		hszSrv, hszTpc;
 
+    TRACE("%p %04x %08x %08lx\n", hwnd, iMsg, wParam , lParam);
+
     if (iMsg == WM_DDE_ACK &&
 	/* in the initial WM_INITIATE sendmessage */
 	((pConv = WDML_GetConvFromWnd(hwnd)) == NULL || pConv->wStatus == XST_INIT1))
@@ -1274,7 +1292,7 @@
 	    /* 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;
 	}
 
@@ -1285,15 +1303,15 @@
 
 	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) ||
+	     lstrcmpiA(buf, WDML_szServerConvClassA) == 0) ||
 	    (GetClassNameW((HWND)wParam, (LPWSTR)buf, sizeof(buf)/sizeof(WCHAR)) &&
-	     lstrcmpW((LPWSTR)buf, WDML_szServerConvClassW) == 0))
+	     lstrcmpiW((LPWSTR)buf, WDML_szServerConvClassW) == 0))
 	{
 	    pConv->wStatus |= ST_ISLOCAL;
 	}
@@ -1323,15 +1341,15 @@
 	    msg.wParam = wParam;
 	    msg.lParam = lParam;
 
-	    WDML_HandleReply(pConv, &msg, &hdd);
+	    WDML_HandleReply(pConv, &msg, &hdd, NULL);
 	}
 
 	LeaveCriticalSection(&WDML_CritSect);
 	return 0;
     }
 
-    return (IsWindowUnicode(hwnd)) ?
-	DefWindowProcW(hwnd, iMsg, wParam, lParam) : DefWindowProcA(hwnd, iMsg, wParam, lParam);
+    return IsWindowUnicode(hwnd) ? DefWindowProcW(hwnd, iMsg, wParam, lParam) :
+                                   DefWindowProcA(hwnd, iMsg, wParam, lParam);
 }
 
 /*****************************************************************
@@ -1348,7 +1366,7 @@
 
     if (hConv == 0)
     {
-	ERR("DdeDisconnect(): hConv = 0\n");
+	WARN("DdeDisconnect(): hConv = 0\n");
 	return FALSE;
     }
 
@@ -1365,9 +1383,9 @@
                 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);
+                    WDML_SyncWaitTransactionReply(hConv, 10000, pXAct, NULL);
                 for (i = 0; i < count; i++)
                     EnterCriticalSection(&WDML_CritSect);
                 ret = TRUE;

Modified: trunk/reactos/dll/win32/user32/misc/ddeserver.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/misc/ddeserver.c?rev=22608&r1=22607&r2=22608&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/misc/ddeserver.c (original)
+++ trunk/reactos/dll/win32/user32/misc/ddeserver.c Sun Jun 25 14:38:48 2006
@@ -6,6 +6,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
@@ -28,7 +29,7 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(ddeml);
 
-static const char  szServerNameClassA[] = "DdeServerNameAnsi";
+static const WCHAR szServerNameClass[] = {'D','d','e','S','e','r','v','e','r','N','a','m','e',0};
 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};
 
@@ -121,7 +122,7 @@
 		    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");
@@ -162,7 +163,7 @@
     WDML_INSTANCE*	pInstance;
     HDDEDATA 		hDdeData;
     HWND 		hwndServer;
-    WNDCLASSEXA  	wndclass;
+    WNDCLASSEXW  	wndclass;
 
     hDdeData = NULL;
 
@@ -222,25 +223,25 @@
 	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;
@@ -308,7 +309,7 @@
 	wndclass.style         = 0;
 	wndclass.lpfnWndProc   = WDML_ServerConvProc;
 	wndclass.cbClsExtra    = 0;
-	wndclass.cbWndExtra    = 2 * sizeof(DWORD);
+	wndclass.cbWndExtra    = 2 * sizeof(ULONG_PTR);
 	wndclass.hInstance     = 0;
 	wndclass.hIcon         = 0;
 	wndclass.hCursor       = 0;
@@ -331,7 +332,7 @@
 	wndclass.style         = 0;
 	wndclass.lpfnWndProc   = WDML_ServerConvProc;
 	wndclass.cbClsExtra    = 0;
-	wndclass.cbWndExtra    = 2 * sizeof(DWORD);
+	wndclass.cbWndExtra    = 2 * sizeof(ULONG_PTR);
 	wndclass.hInstance     = 0;
 	wndclass.hIcon         = 0;
 	wndclass.hCursor       = 0;
@@ -354,12 +355,12 @@
 			 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,9 +426,9 @@
 	     * handled under DDEML, and if so build a default context
 	     */
 	    if ((GetClassNameA(hwndClient, buf, sizeof(buf)) &&
-		 strcmp(buf, WDML_szClientConvClassA) == 0) ||
+                lstrcmpiA(buf, WDML_szClientConvClassA) == 0) ||
 		(GetClassNameW(hwndClient, (LPWSTR)buf, sizeof(buf)/sizeof(WCHAR)) &&
-		 lstrcmpW((LPWSTR)buf, WDML_szClientConvClassW) == 0))
+                lstrcmpiW((LPWSTR)buf, WDML_szClientConvClassW) == 0))
 	    {
 		pcc = &cc;
 		memset(pcc, 0, sizeof(*pcc));
@@ -440,15 +441,15 @@
 	    }
 	    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)
 		{
 		    /* pass on to the callback  */
 		    hDdeData = WDML_InvokeCallback(pInstance, XTYP_CONNECT,
-						   0, 0, hszTop, hszApp, 0, (DWORD)pcc, self);
-		    if ((UINT)hDdeData)
+						   0, 0, hszTop, hszApp, 0, (ULONG_PTR)pcc, self);
+		    if ((ULONG_PTR)hDdeData)
 		    {
 			pConv = WDML_CreateServerConv(pInstance, hwndClient, hwndServer,
 						      hszApp, hszTop);
@@ -456,7 +457,7 @@
                         {
                             if (pcc) pConv->wStatus |= ST_ISLOCAL;
                             WDML_InvokeCallback(pInstance, XTYP_CONNECT_CONFIRM, 0, (HCONV)pConv,
-                                                hszTop, hszApp, 0, (DWORD)pcc, self);
+                                                hszTop, hszApp, 0, (ULONG_PTR)pcc, self);
                         }
 		    }
 		}
@@ -465,14 +466,14 @@
 	    {
 		/* pass on to the callback  */
 		hDdeData = WDML_InvokeCallback(pInstance, XTYP_WILDCONNECT,
-					       0, 0, hszTop, hszApp, 0, (DWORD)pcc, self);
+					       0, 0, hszTop, hszApp, 0, (ULONG_PTR)pcc, self);
 
 		if (hDdeData == (HDDEDATA)CBR_BLOCK)
 		{
 		    /* 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;
 
@@ -488,7 +489,7 @@
                             {
                                 if (pcc) pConv->wStatus |= ST_ISLOCAL;
                                 WDML_InvokeCallback(pInstance, XTYP_CONNECT_CONFIRM, 0, (HCONV)pConv,
-                                                    hszp[i].hszTopic, hszp[i].hszSvc, 0, (DWORD)pcc, self);
+                                                    hszp[i].hszTopic, hszp[i].hszSvc, 0, (ULONG_PTR)pcc, self);
                             }
 			}
 			DdeUnaccessData(hDdeData);
@@ -499,7 +500,6 @@
 	}
 
 	return 0;
-
 
     case WM_DDE_REQUEST:
 	FIXME("WM_DDE_REQUEST message received!\n");
@@ -519,10 +519,11 @@
     case WM_DDE_TERMINATE:
 	FIXME("WM_DDE_TERMINATE message received!\n");
 	return 0;
-
-    }
-
-    return DefWindowProcA(hwndServer, iMsg, wParam, lParam);
+    default:
+	break;
+    }
+
+    return DefWindowProcW(hwndServer, iMsg, wParam, lParam);
 }
 
 /******************************************************************
@@ -551,7 +552,7 @@
 static	WDML_QUEUE_STATE WDML_ServerHandleRequest(WDML_CONV* pConv, WDML_XACT* pXAct)
 {
     HDDEDATA		hDdeData = 0;
-    WDML_QUEUE_STATE	ret = WDML_QS_HANDLED;
+    BOOL		fAck = TRUE;
 
     if (!(pConv->instance->CBFflags & CBF_FAIL_REQUESTS))
     {
@@ -563,27 +564,33 @@
     switch ((ULONG_PTR)hDdeData)
     {
     case 0:
-	WDML_PostAck(pConv, WDML_SERVER_SIDE, 0, FALSE, FALSE, pXAct->atom,
-                     pXAct->lParam, WM_DDE_REQUEST);
-	break;
+	TRACE("No data returned from the Callback\n");
+	fAck = FALSE;
+	break;
+
     case (ULONG_PTR)CBR_BLOCK:
-	ret = WDML_QS_BLOCK;
-	break;
+	return WDML_QS_BLOCK;
+
     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)))
 	    {
 		DdeFreeDataHandle(hDdeData);
 		GlobalFree(hMem);
+		fAck = FALSE;
 	    }
 	}
 	break;
     }
+
+    WDML_PostAck(pConv, WDML_SERVER_SIDE, 0, FALSE, fAck, pXAct->atom, pXAct->lParam, WM_DDE_REQUEST);
+
     WDML_DecHSZ(pConv->instance, pXAct->hszItem);
-    return ret;
+
+    return WDML_QS_HANDLED;
 }
 
 /******************************************************************
@@ -622,8 +629,8 @@
     UINT		uType;
     WDML_LINK*		pLink;
     DDEADVISE*		pDdeAdvise;
-    HDDEDATA		hDdeData;
-    BOOL		fAck;
+    HDDEDATA		hDdeData = 0;
+    BOOL		fAck = TRUE;
 
     pDdeAdvise = (DDEADVISE*)GlobalLock(pXAct->hMem);
     uType = XTYP_ADVSTART |
@@ -635,15 +642,18 @@
 	hDdeData = WDML_InvokeCallback(pConv->instance, XTYP_ADVSTART, pDdeAdvise->cfFormat,
 				       (HCONV)pConv, pConv->hszTopic, pXAct->hszItem, 0, 0, 0);
     }
-    else
-    {
-	hDdeData = 0;
-    }
-
-    if ((UINT)hDdeData)
-    {
-	fAck           = TRUE;
-
+
+    switch ((ULONG_PTR)hDdeData)
+    {
+    case 0:
+	TRACE("No data returned from the Callback\n");
+	fAck = FALSE;
+	break;
+
+    case (ULONG_PTR)CBR_BLOCK:
+	return WDML_QS_BLOCK;
+
+    default:
 	/* billx: first to see if the link is already created. */
 	pLink = WDML_FindLink(pConv->instance, (HCONV)pConv, WDML_SERVER_SIDE,
 			      pXAct->hszItem, TRUE, pDdeAdvise->cfFormat);
@@ -659,11 +669,7 @@
 	    WDML_AddLink(pConv->instance, (HCONV)pConv, WDML_SERVER_SIDE,
 			 uType, pXAct->hszItem, pDdeAdvise->cfFormat);
 	}
-    }
-    else
-    {
-	TRACE("No data returned from the Callback\n");
-	fAck = FALSE;
+	break;
     }
 
     GlobalUnlock(pXAct->hMem);
@@ -781,8 +787,11 @@
 				       pConv->hszTopic, 0, hDdeData, 0L, 0L);
     }
 
-    switch ((UINT)hDdeData)
-    {
+    switch ((ULONG_PTR)hDdeData)
+    {
+    case (ULONG_PTR)CBR_BLOCK:
+	return WDML_QS_BLOCK;
+
     case DDE_FACK:
 	fAck = TRUE;
 	break;
@@ -790,7 +799,7 @@
 	fBusy = TRUE;
 	break;
     default:
-	WARN("Bad result code\n");
+	FIXME("Unsupported returned value %p\n", hDdeData);
 	/* fall through */
     case DDE_FNOTPROCESSED:
 	break;
@@ -909,7 +918,7 @@
 	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;
@@ -974,6 +983,8 @@
     WDML_CONV*		pConv;
     WDML_XACT*		pXAct = NULL;
 
+    TRACE("%p %04x %08x %08lx\n", hwndServer, iMsg, wParam , lParam);
+
     if (iMsg == WM_DESTROY)
     {
 	EnterCriticalSection(&WDML_CritSect);

Modified: trunk/reactos/include/dde.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/dde.h?rev=22608&r1=22607&r2=22608&view=diff
==============================================================================
--- trunk/reactos/include/dde.h (original)
+++ trunk/reactos/include/dde.h Sun Jun 25 14:38:48 2006
@@ -1,64 +1,90 @@
-#ifndef _DDE_H
-#define _DDE_H
-#if __GNUC__ >=3
-#pragma GCC system_header
-#endif
+/*****************************************************************************
+ * Copyright 1995, Technion, Israel Institute of Technology
+ * Electrical Eng, Software Lab.
+ * Author:    Michael Veksler.
+ * Purpose:   dde declarations
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *****************************************************************************
+ */
+#ifndef __WINE_DDE_H
+#define __WINE_DDE_H
+
+#include <windef.h>
 
 #ifdef __cplusplus
 extern "C" {
 #endif
-#define WM_DDE_FIRST	0x03E0
-#define WM_DDE_INITIATE	(WM_DDE_FIRST)
-#define WM_DDE_TERMINATE	(WM_DDE_FIRST+1)
-#define WM_DDE_ADVISE	(WM_DDE_FIRST+2)
-#define WM_DDE_UNADVISE	(WM_DDE_FIRST+3)
-#define WM_DDE_ACK	(WM_DDE_FIRST+4)
-#define WM_DDE_DATA	(WM_DDE_FIRST+5)
-#define WM_DDE_REQUEST	(WM_DDE_FIRST+6)
-#define WM_DDE_POKE	(WM_DDE_FIRST+7)
-#define WM_DDE_EXECUTE	(WM_DDE_FIRST+8)
-#define WM_DDE_LAST	(WM_DDE_FIRST+8)
 
-#ifndef RC_INVOKED
-typedef struct {
-	unsigned short bAppReturnCode:8,reserved:6,fBusy:1,fAck:1;
+#define WM_DDE_INITIATE   0x3E0
+#define WM_DDE_TERMINATE  0x3E1
+#define WM_DDE_ADVISE	  0x3E2
+#define WM_DDE_UNADVISE   0x3E3
+#define WM_DDE_ACK	  0x3E4
+#define WM_DDE_DATA	  0x3E5
+#define WM_DDE_REQUEST	  0x3E6
+#define WM_DDE_POKE	  0x3E7
+#define WM_DDE_EXECUTE	  0x3E8
+#define WM_DDE_LAST	  WM_DDE_EXECUTE
+#define WM_DDE_FIRST	  WM_DDE_INITIATE
+
+/* DDEACK: wStatus in WM_DDE_ACK message */
+typedef struct
+{
+    unsigned short bAppReturnCode:8, reserved:6, fBusy:1, fAck:1;
 } DDEACK;
-typedef struct {
-	unsigned short reserved:14,fDeferUpd:1,fAckReq:1;
-	short cfFormat;
+
+/* DDEDATA: hData in WM_DDE_DATA message */
+typedef struct
+{
+    unsigned short unused:12, fResponse:1, fRelease:1, reserved:1, fAckReq:1;
+    short cfFormat;
+    BYTE Value[1];		/* undetermined array */
+} DDEDATA;
+
+/* DDEADVISE: hOptions in WM_DDE_ADVISE message */
+typedef struct
+{
+    unsigned short reserved:14, fDeferUpd:1, fAckReq:1;
+    short cfFormat;
 } DDEADVISE;
-typedef struct {
-	unsigned short unused:12,fResponse:1,fRelease:1,reserved:1,fAckReq:1;
-	short cfFormat;
-	BYTE Value[1];
-} DDEDATA;
-typedef struct {
-	unsigned short unused:13,fRelease:1,fReserved:2;
-	short cfFormat;
-	BYTE  Value[1];
+
+/* DDEPOKE: hData in WM_DDE_POKE message. */
+typedef struct
+{
+    unsigned short unused:13, fRelease:1, fReserved:2;
+    short cfFormat;
+    BYTE Value[1];   	/* undetermined array */
 } DDEPOKE;
-typedef struct {
-        unsigned short unused:13,
-                 fRelease:1,
-                 fDeferUpd:1,
-         fAckReq:1;
-    short    cfFormat;
-} DDELN;
 
-typedef struct {
-	unsigned short unused:12,fAck:1,fRelease:1,fReserved:1,fAckReq:1;
-    short cfFormat;
-    BYTE rgb[1];
-} DDEUP;
-BOOL WINAPI DdeSetQualityOfService(HWND,const SECURITY_QUALITY_OF_SERVICE*,PSECURITY_QUALITY_OF_SERVICE);
-BOOL WINAPI ImpersonateDdeClientWindow(HWND,HWND);
-LPARAM WINAPI PackDDElParam(UINT,UINT_PTR,UINT_PTR);
-BOOL WINAPI UnpackDDElParam(UINT,LPARAM,PUINT_PTR,PUINT_PTR);
-BOOL WINAPI FreeDDElParam(UINT,LPARAM);
-LPARAM WINAPI ReuseDDElParam(LPARAM,UINT,UINT,UINT_PTR,UINT_PTR);
-#endif
+BOOL WINAPI DdeSetQualityOfService(HWND hwndClient,
+				   CONST SECURITY_QUALITY_OF_SERVICE *pqosNew,
+				   PSECURITY_QUALITY_OF_SERVICE pqosPrev);
+
+BOOL WINAPI ImpersonateDdeClientWindow(HWND hWndClient, HWND hWndServer);
+
+/* lParam packing/unpacking API */
+
+LPARAM      WINAPI PackDDElParam(UINT,UINT_PTR,UINT_PTR);
+BOOL        WINAPI UnpackDDElParam(UINT,LPARAM,PUINT_PTR,PUINT_PTR);
+BOOL        WINAPI FreeDDElParam(UINT,LPARAM);
+LPARAM      WINAPI ReuseDDElParam(LPARAM,UINT,UINT,UINT_PTR,UINT_PTR);
+
 
 #ifdef __cplusplus
 }
 #endif
-#endif
+
+#endif /* __WINE_DDE_H */

Modified: trunk/reactos/include/ddeml.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/ddeml.h?rev=22608&r1=22607&r2=22608&view=diff
==============================================================================
--- trunk/reactos/include/ddeml.h (original)
+++ trunk/reactos/include/ddeml.h Sun Jun 25 14:38:48 2006
@@ -1,326 +1,377 @@
-#ifndef _DDEML_H
-#define _DDEML_H
-#if __GNUC__ >=3
-#pragma GCC system_header
-#endif
+/*
+ * DDEML library definitions
+ *
+ * Copyright 1997 Alexandre Julliard
+ * Copyright 1997 Len White
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifndef __WINE_DDEML_H
+#define __WINE_DDEML_H
 
 #ifdef __cplusplus
 extern "C" {
-#endif
-
-#define EXPENTRY	CALLBACK
-#define CP_WINANSI	1004
-#define CP_WINUNICODE	1200
-#define XTYPF_NOBLOCK	2
-#define XTYPF_NODATA	4
-#define XTYPF_ACKREQ	8
-#define XCLASS_MASK	0xFC00
-#define XCLASS_BOOL	0x1000
-#define XCLASS_DATA	0x2000
-#define XCLASS_FLAGS	0x4000
-#define XCLASS_NOTIFICATION	0x8000
-#define XST_NULL	0
-#define XST_INCOMPLETE	1
-#define XST_CONNECTED	2
-#define XST_INIT1	3
-#define XST_INIT2	4
-#define XST_REQSENT	5
-#define XST_DATARCVD	6
-#define XST_POKESENT	7
-#define XST_POKEACKRCVD	8
-#define XST_EXECSENT	9
-#define XST_EXECACKRCVD	10
-#define XST_ADVSENT 11
-#define XST_UNADVSENT 12
-#define XST_ADVACKRCVD 13
-#define XST_UNADVACKRCVD 14
-#define XST_ADVDATASENT 15
-#define XST_ADVDATAACKRCVD 16
-#define XTYP_ERROR	(XCLASS_NOTIFICATION|XTYPF_NOBLOCK)
-#define XTYP_ADVDATA	(16|XCLASS_FLAGS)
-#define XTYP_ADVREQ	(32|XCLASS_DATA|XTYPF_NOBLOCK)
-#define XTYP_ADVSTART	(0x30|XCLASS_BOOL)
-#define XTYP_ADVSTOP	(0x0040|XCLASS_NOTIFICATION)
-#define XTYP_EXECUTE	(0x0050|XCLASS_FLAGS)
-#define XTYP_CONNECT	(0x0060|XCLASS_BOOL|XTYPF_NOBLOCK)
-#define XTYP_CONNECT_CONFIRM	(0x0070|XCLASS_NOTIFICATION|XTYPF_NOBLOCK)
-#define XTYP_XACT_COMPLETE	(0x0080|XCLASS_NOTIFICATION)
-#define XTYP_POKE	(0x0090|XCLASS_FLAGS)
-#define XTYP_REGISTER	(0x00A0|XCLASS_NOTIFICATION|XTYPF_NOBLOCK)
-#define XTYP_REQUEST	(0x00B0|XCLASS_DATA)
-#define XTYP_DISCONNECT	(0x00C0|XCLASS_NOTIFICATION|XTYPF_NOBLOCK)
-#define XTYP_UNREGISTER	(0x00D0|XCLASS_NOTIFICATION|XTYPF_NOBLOCK)
-#define XTYP_WILDCONNECT	(0x00E0|XCLASS_DATA|XTYPF_NOBLOCK)
-#define XTYP_MASK	0xF0
-#define XTYP_SHIFT	4
-#define TIMEOUT_ASYNC	0xFFFFFFFF
+#endif /* defined(__cplusplus) */
+
+/* Codepage Constants
+ */
+
+#define CP_WINANSI      1004
+#define CP_WINUNICODE   1200
+
+/* DDE synchronisation constants
+ */
+
+#define MSGF_DDEMGR 0x8001
+
 #define QID_SYNC	0xFFFFFFFF
-#define ST_CONNECTED	1
-#define ST_ADVISE	2
-#define ST_ISLOCAL	4
-#define ST_BLOCKED	8
-#define ST_CLIENT	16
-#define ST_TERMINATED	32
-#define ST_INLIST	64
-#define ST_BLOCKNEXT	128
-#define ST_ISSELF	256
-#define CADV_LATEACK 0xFFFF
-#define DMLERR_NO_ERROR	0
-#define DMLERR_FIRST	0x4000
-#define DMLERR_ADVACKTIMEOUT	0x4000
-#define DMLERR_BUSY	0x4001
-#define DMLERR_DATAACKTIMEOUT	0x4002
-#define DMLERR_DLL_NOT_INITIALIZED	0x4003
-#define	DMLERR_DLL_USAGE	0x4004
-#define DMLERR_EXECACKTIMEOUT	0x4005
-#define DMLERR_INVALIDPARAMETER	0x4006
-#define DMLERR_LOW_MEMORY	0x4007
-#define DMLERR_MEMORY_ERROR	0x4008
-#define DMLERR_NOTPROCESSED	0x4009
-#define DMLERR_NO_CONV_ESTABLISHED	0x400a
-#define DMLERR_POKEACKTIMEOUT	0x400b
-#define DMLERR_POSTMSG_FAILED	0x400c
-#define DMLERR_REENTRANCY	0x400d
-#define DMLERR_SERVER_DIED	0x400e
-#define DMLERR_SYS_ERROR	0x400f
-#define DMLERR_UNADVACKTIMEOUT	0x4010
-#define DMLERR_UNFOUND_QUEUE_ID	0x4011
-#define DMLERR_LAST	0x4011
-#define DDE_FACK	0x8000
-#define DDE_FBUSY	0x4000
-#define DDE_FDEFERUPD	0x4000
-#define DDE_FACKREQ	0x8000
-#define DDE_FRELEASE	0x2000
-#define DDE_FREQUESTED	0x1000
-#define DDE_FAPPSTATUS	0x00ff
-#define DDE_FNOTPROCESSED	0
-#define DDE_FACKRESERVED	(~(DDE_FACK|DDE_FBUSY|DDE_FAPPSTATUS))
-#define DDE_FADVRESERVED	(~(DDE_FACKREQ|DDE_FDEFERUPD))
-#define DDE_FDATRESERVED	(~(DDE_FACKREQ|DDE_FRELEASE|DDE_FREQUESTED))
-#define DDE_FPOKRESERVED	(~DDE_FRELEASE)
-#define MSGF_DDEMGR	0x8001
-#define CBR_BLOCK	((HDDEDATA)0xffffffff)
-#define CBF_FAIL_SELFCONNECTIONS	0x1000
-#define CBF_FAIL_CONNECTIONS	0x2000
-#define CBF_FAIL_ADVISES	0x4000
-#define CBF_FAIL_EXECUTES	0x8000
-#define CBF_FAIL_POKES	0x10000
-#define CBF_FAIL_REQUESTS	0x20000
-#define CBF_FAIL_ALLSVRXACTIONS	0x3f000
-#define CBF_SKIP_CONNECT_CONFIRMS	0x40000
-#define CBF_SKIP_REGISTRATIONS	0x80000
-#define CBF_SKIP_UNREGISTRATIONS	0x100000
-#define CBF_SKIP_DISCONNECTS	0x200000
-#define CBF_SKIP_ALLNOTIFICATIONS	0x3c0000
-#define APPCMD_CLIENTONLY	0x10L
-#define APPCMD_FILTERINITS	0x20L
-#define APPCMD_MASK	0xFF0L
-#define APPCLASS_STANDARD	0
-#define APPCLASS_MASK	0xFL
-#define EC_ENABLEALL	0
-#define EC_ENABLEONE	ST_BLOCKNEXT
-#define EC_DISABLE	ST_BLOCKED
-#define EC_QUERYWAITING	2
-#define DNS_REGISTER	1
-#define DNS_UNREGISTER	2
-#define DNS_FILTERON	4
-#define DNS_FILTEROFF	8
-#define HDATA_APPOWNED	1
-#define MAX_MONITORS	4
-#define APPCLASS_MONITOR	1L
-#define XTYP_MONITOR	(XCLASS_NOTIFICATION|XTYPF_NOBLOCK|0xF0)
-#define MF_HSZ_INFO	0x1000000
-#define MF_SENDMSGS	0x2000000
-#define MF_POSTMSGS	0x4000000
-#define MF_CALLBACKS	0x8000000
-#define MF_ERRORS	0x10000000
-#define MF_LINKS	0x20000000
-#define MF_CONV	0x40000000
-#define MF_MASK 0xFF000000
-#define MH_CREATE	1
-#define MH_KEEP	2
-#define MH_DELETE	3
-#define MH_CLEANUP	4
+
+/*   Type variation for MS  deliberate departures from ANSI standards
+ */
+
+#define EXPENTRY CALLBACK
+
+#define SZDDESYS_TOPIC		TEXT("System")
+#define SZDDESYS_ITEM_TOPICS	TEXT("Topics")
+#define SZDDESYS_ITEM_SYSITEMS	TEXT("SysItems")
+#define SZDDESYS_ITEM_RTNMSG	TEXT("ReturnMessage")
+#define SZDDESYS_ITEM_STATUS	TEXT("Status")
+#define SZDDESYS_ITEM_FORMATS	TEXT("Formats")
+#define SZDDESYS_ITEM_HELP	TEXT("Help")
+#define SZDDE_ITEM_ITEMLIST	TEXT("TopicItemList")
+
+/***************************************************
+
+      FLAGS Section - copied from Microsoft SDK as must be standard, probably Copyright Microsoft Corporation
+
+***************************************************/
+
+#define     XST_NULL              0
+#define     XST_INCOMPLETE        1
+#define     XST_CONNECTED         2
+#define     XST_INIT1             3
+#define     XST_INIT2             4
+#define     XST_REQSENT           5
+#define     XST_DATARCVD          6
+#define     XST_POKESENT          7
+#define     XST_POKEACKRCVD       8
+#define     XST_EXECSENT          9
+#define     XST_EXECACKRCVD      10
+#define     XST_ADVSENT          11
+#define     XST_UNADVSENT        12
+#define     XST_ADVACKRCVD       13
+#define     XST_UNADVACKRCVD     14
+#define     XST_ADVDATASENT      15
+#define     XST_ADVDATAACKRCVD   16
+
+#define     ST_CONNECTED            0x0001
+#define     ST_ADVISE               0x0002
+#define     ST_ISLOCAL              0x0004
+#define     ST_BLOCKED              0x0008
+#define     ST_CLIENT               0x0010
+#define     ST_TERMINATED           0x0020
+#define     ST_INLIST               0x0040
+#define     ST_BLOCKNEXT            0x0080
+#define     ST_ISSELF               0x0100
+
+/*
+ * DdeEnableCallback function codes
+ */
+
+#define     EC_ENABLEALL                 0
+#define     EC_ENABLEONE                 ST_BLOCKNEXT
+#define     EC_DISABLE                   ST_BLOCKED
+#define     EC_QUERYWAITING              2
+
+/*
+ * Callback filter flags for use with standard apps.
+ */
+
+#define     CBF_FAIL_SELFCONNECTIONS     0x00001000
+#define     CBF_FAIL_CONNECTIONS         0x00002000
+#define     CBF_FAIL_ADVISES             0x00004000
+#define     CBF_FAIL_EXECUTES            0x00008000
+#define     CBF_FAIL_POKES               0x00010000
+#define     CBF_FAIL_REQUESTS            0x00020000
+#define     CBF_FAIL_ALLSVRXACTIONS      0x0003f000
+
+#define     CBF_SKIP_CONNECT_CONFIRMS    0x00040000
+#define     CBF_SKIP_REGISTRATIONS       0x00080000
+#define     CBF_SKIP_UNREGISTRATIONS     0x00100000
+#define     CBF_SKIP_DISCONNECTS         0x00200000
+#define     CBF_SKIP_ALLNOTIFICATIONS    0x003c0000
+
+#define     CBR_BLOCK                    ((HDDEDATA)~0UL)
+
+/*
+ * Application command flags
+ */
+#define     APPCMD_CLIENTONLY            0x00000010L
+#define     APPCMD_FILTERINITS           0x00000020L
+#define     APPCMD_MASK                  0x00000FF0L
+
+/*
+ * Application classification flags
+ */
+
+#define     APPCLASS_STANDARD            0x00000000L
+#define     APPCLASS_MONITOR             0x00000001L
+#define     APPCLASS_MASK                0x0000000FL
+
+/*
+ * Callback filter flags for use with MONITOR apps - 0 implies no monitor
+ * callbacks.
+ */
+#define     MF_HSZ_INFO                  0x01000000
+#define     MF_SENDMSGS                  0x02000000
+#define     MF_POSTMSGS                  0x04000000
+#define     MF_CALLBACKS                 0x08000000
+#define     MF_ERRORS                    0x10000000
+#define     MF_LINKS                     0x20000000
+#define     MF_CONV                      0x40000000
+
+#define     MF_MASK                      0xFF000000
+
+/*
+ *	DdeNameService service name flags
+ */
+
+#define     DNS_REGISTER		 0x0001
+#define     DNS_UNREGISTER		 0x0002
+#define     DNS_FILTERON		 0x0004
+#define     DNS_FILTEROFF         	 0x0008
+
+
+/****************************************************
+
+      End of Flags section
+
+****************************************************/
+
+/****************************************************
+
+	Message Types Section
+
+****************************************************/
+
+#define XTYPF_NOBLOCK		0x0002		/* CBR_NOBLOCK will not work */
+#define XTYPF_NODATA		0x0004		/* DDE_FDEFERUPD  */
+#define XTYPF_ACKREQ		0x0008		/* DDE_FACKREQ */
+
+#define XCLASS_MASK		0xFC00
+#define XCLASS_BOOL		0x1000
+#define XCLASS_DATA		0x2000
+#define XCLASS_FLAGS		0x4000
+#define	XCLASS_NOTIFICATION	0x8000
+
+#define XTYP_ERROR		(0x0000 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK)
+#define XTYP_ADVDATA		(0x0010 | XCLASS_FLAGS)
+#define XTYP_ADVREQ		(0x0020 | XCLASS_DATA | XTYPF_NOBLOCK)
+#define XTYP_ADVSTART		(0x0030 | XCLASS_BOOL)
+#define XTYP_ADVSTOP		(0x0040 | XCLASS_NOTIFICATION)
+#define XTYP_EXECUTE		(0x0050 | XCLASS_FLAGS)
+#define XTYP_CONNECT		(0x0060 | XCLASS_BOOL | XTYPF_NOBLOCK)
+#define XTYP_CONNECT_CONFIRM	(0x0070 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK)
+#define XTYP_XACT_COMPLETE	(0x0080 | XCLASS_NOTIFICATION )
+#define XTYP_POKE		(0x0090 | XCLASS_FLAGS)
+#define XTYP_REGISTER		(0x00A0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK )
+#define XTYP_REQUEST		(0x00B0 | XCLASS_DATA )
+#define XTYP_DISCONNECT		(0x00C0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK )
+#define XTYP_UNREGISTER		(0x00D0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK )
+#define XTYP_WILDCONNECT	(0x00E0 | XCLASS_DATA | XTYPF_NOBLOCK)
+
+#define XTYP_MASK		0x00F0
+#define XTYP_SHIFT		4
+
+#define TIMEOUT_ASYNC           0xFFFFFFFF
+
+#define CADV_LATEACK		0xFFFF
+
+/**************************************************
+
+	End of Message Types Section
+
+****************************************************/
+
+/*****************************************************
+
+	DDE Codes for wStatus field
+
+*****************************************************/
+
+#define DDE_FACK		0x8000
+#define DDE_FBUSY		0x4000
+#define DDE_FDEFERUPD		0x4000
+#define DDE_FACKREQ		0x8000
+#define DDE_FRELEASE		0x2000
+#define DDE_FREQUESTED		0x1000
+#define DDE_FAPPSTATUS		0x00FF
+#define DDE_FNOTPROCESSED	0x0000
+
+#define DDE_FACKRESERVED        (~(DDE_FACK | DDE_FBUSY | DDE_FAPPSTATUS))
+#define DDE_FADVRESERVED        (~(DDE_FACKREQ | DDE_FDEFERUPD))
+#define DDE_FDATRESERVED        (~(DDE_FACKREQ | DDE_FRELEASE | DDE_FREQUESTED))
+#define DDE_FPOKRESERVED        (~(DDE_FRELEASE))
+
+/*****************************************************
+
+	End of wStatus codes
+
+*****************************************************/
+
+/****************************************************
+
+      Return Codes section again copied from SDK as must be same
+
+*****************************************************/
+
+#define     DMLERR_NO_ERROR                    0       /* must be 0 */
+
+#define     DMLERR_FIRST                       0x4000
+
+#define     DMLERR_ADVACKTIMEOUT               0x4000
+#define     DMLERR_BUSY                        0x4001
+#define     DMLERR_DATAACKTIMEOUT              0x4002
+#define     DMLERR_DLL_NOT_INITIALIZED         0x4003
+#define     DMLERR_DLL_USAGE                   0x4004
+#define     DMLERR_EXECACKTIMEOUT              0x4005
+#define     DMLERR_INVALIDPARAMETER            0x4006
+#define     DMLERR_LOW_MEMORY                  0x4007
+#define     DMLERR_MEMORY_ERROR                0x4008
+#define     DMLERR_NOTPROCESSED                0x4009
+#define     DMLERR_NO_CONV_ESTABLISHED         0x400a
+#define     DMLERR_POKEACKTIMEOUT              0x400b
+#define     DMLERR_POSTMSG_FAILED              0x400c
+#define     DMLERR_REENTRANCY                  0x400d
+#define     DMLERR_SERVER_DIED                 0x400e
+#define     DMLERR_SYS_ERROR                   0x400f
+#define     DMLERR_UNADVACKTIMEOUT             0x4010
+#define     DMLERR_UNFOUND_QUEUE_ID            0x4011
+
+#define     DMLERR_LAST                        0x4011
+
+#define     HDATA_APPOWNED          	       0x0001
+
+/*****************************************************
+
+      End of Return Codes and Microsoft section
+
+******************************************************/
+
+
 
 DECLARE_HANDLE(HCONVLIST);
 DECLARE_HANDLE(HCONV);
 DECLARE_HANDLE(HSZ);
 DECLARE_HANDLE(HDDEDATA);
-typedef HDDEDATA CALLBACK FNCALLBACK(UINT,UINT,HCONV,HSZ,HSZ,HDDEDATA,DWORD,DWORD);
-typedef HDDEDATA(CALLBACK *PFNCALLBACK)(UINT,UINT,HCONV,HSZ,HSZ,HDDEDATA,DWORD,DWORD);
-typedef struct tagHSZPAIR {
-	HSZ	hszSvc;
-	HSZ	hszTopic;
+
+
+
+/*******************************************************
+
+	API Entry Points
+
+*******************************************************/
+
+typedef HDDEDATA (CALLBACK *PFNCALLBACK)(UINT, UINT, HCONV, HSZ, HSZ,
+					 HDDEDATA, ULONG_PTR, ULONG_PTR);
+
+/***************************************************
+
+	Externally visible data structures
+
+***************************************************/
+
+typedef struct tagHSZPAIR
+{
+    HSZ hszSvc;
+    HSZ hszTopic;
 } HSZPAIR, *PHSZPAIR;
-typedef struct tagCONVCONTEXT {
-	UINT	cb;
-	UINT	wFlags;
-	UINT	wCountryID;
-	int	iCodePage;
-	DWORD	dwLangID;
-	DWORD	dwSecurity;
-	SECURITY_QUALITY_OF_SERVICE qos;
-} CONVCONTEXT,*PCONVCONTEXT;
-typedef struct tagCONVINFO {
-	DWORD	cb;
-	DWORD	hUser;
-	HCONV	hConvPartner;
-	HSZ	hszSvcPartner;
-	HSZ	hszServiceReq;
-	HSZ	hszTopic;
-	HSZ	hszItem;
-	UINT	wFmt;
-	UINT	wType;
-	UINT	wStatus;
-	UINT	wConvst;
-	UINT	wLastError;
-	HCONVLIST	hConvList;
-	CONVCONTEXT ConvCtxt;
-	HWND	hwnd;
-	HWND	hwndPartner;
-} CONVINFO,*PCONVINFO;
-typedef struct tagDDEML_MSG_HOOK_DATA {
-	UINT	uiLo;
-	UINT	uiHi;
-	DWORD	cbData;
-	DWORD	Data[8];
-} DDEML_MSG_HOOK_DATA;
-typedef struct tagMONHSZSTRUCTA {
-	UINT	cb;
-	BOOL	fsAction;
-	DWORD	dwTime;
-	HSZ	hsz;
-	HANDLE	hTask;
-	CHAR	str[1];
-} MONHSZSTRUCTA, *PMONHSZSTRUCTA;
-typedef struct tagMONHSZSTRUCTW {
-	UINT	cb;
-	BOOL	fsAction;
-	DWORD	dwTime;
-	HSZ	hsz;
-	HANDLE	hTask;
-	WCHAR	str[1];
-} MONHSZSTRUCTW, *PMONHSZSTRUCTW;
-typedef struct tagMONLINKSTRUCT {
-	UINT	cb;
-	DWORD	dwTime;
-	HANDLE	hTask;
-	BOOL	fEstablished;
-	BOOL	fNoData;
-	HSZ	hszSvc;
-	HSZ	hszTopic;
-	HSZ	hszItem;
-	UINT	wFmt;
-	BOOL	fServer;
-	HCONV	hConvServer;
-	HCONV	hConvClient;
-} MONLINKSTRUCT, *PMONLINKSTRUCT;
-typedef struct tagMONCONVSTRUCT {
-	UINT	cb;
-	BOOL	fConnect;
-	DWORD	dwTime;
-	HANDLE	hTask;
-	HSZ	hszSvc;
-	HSZ	hszTopic;
-	HCONV	hConvClient;
-	HCONV	hConvServer;
-} MONCONVSTRUCT, *PMONCONVSTRUCT;
-typedef struct tagMONCBSTRUCT {
-	UINT	cb;
-	DWORD	dwTime;
-	HANDLE	hTask;
-	DWORD	dwRet;
-	UINT	wType;
-	UINT	wFmt;
-	HCONV	hConv;
-	HSZ	hsz1;
-	HSZ	hsz2;
-	HDDEDATA	hData;
-	ULONG_PTR	dwData1;
-	ULONG_PTR	dwData2;
-	CONVCONTEXT	cc;
-	DWORD	cbData;
-	DWORD	Data[8];
-} MONCBSTRUCT, *PMONCBSTRUCT;
-typedef struct tagMONERRSTRUCT {
-	UINT	cb;
-	UINT	wLastError;
-	DWORD	dwTime;
-	HANDLE	hTask;
-} MONERRSTRUCT, *PMONERRSTRUCT;
-typedef struct tagMONMSGSTRUCT {
-	UINT	cb;
-	HWND	hwndTo;
-	DWORD	dwTime;
-	HANDLE	hTask;
-	UINT	wMsg;
-	WPARAM	wParam;
-	LPARAM	lParam;
-	DDEML_MSG_HOOK_DATA dmhd;
-} MONMSGSTRUCT, *PMONMSGSTRUCT;
-
-BOOL WINAPI DdeAbandonTransaction(DWORD,HCONV,DWORD);
-PBYTE WINAPI DdeAccessData(HDDEDATA,PDWORD);
-HDDEDATA WINAPI DdeAddData(HDDEDATA,PBYTE,DWORD,DWORD);
-HDDEDATA WINAPI DdeClientTransaction(PBYTE,DWORD,HCONV,HSZ,UINT,UINT,DWORD,PDWORD);
-int WINAPI DdeCmpStringHandles(HSZ,HSZ);
-HCONV WINAPI DdeConnect(DWORD,HSZ,HSZ,PCONVCONTEXT);
+
+typedef struct tagCONVCONTEXT
+{
+    UINT  cb;
+    UINT  wFlags;
+    UINT  wCountryID;
+    INT   iCodePage;
+    DWORD   dwLangID;
+    DWORD   dwSecurity;
+} CONVCONTEXT, *PCONVCONTEXT;
+
+typedef struct tagCONVINFO
+{
+    DWORD		cb;
+    DWORD 		hUser;
+    HCONV		hConvPartner;
+    HSZ			hszSvcPartner;
+    HSZ			hszServiceReq;
+    HSZ			hszTopic;
+    HSZ			hszItem;
+    UINT		wFmt;
+    UINT		wType;
+    UINT		wStatus;
+    UINT		wConvst;
+    UINT		wLastError;
+    HCONVLIST		hConvList;
+    CONVCONTEXT		ConvCtxt;
+    HWND		hwnd;
+    HWND		hwndPartner;
+} CONVINFO, *PCONVINFO;
+
+/*            Interface Definitions		*/
+
+
+UINT    WINAPI DdeInitializeA(LPDWORD,PFNCALLBACK,DWORD,DWORD);
+UINT    WINAPI DdeInitializeW(LPDWORD,PFNCALLBACK,DWORD,DWORD);
+#define   DdeInitialize WINELIB_NAME_AW(DdeInitialize)
+BOOL    WINAPI DdeUninitialize(DWORD);
 HCONVLIST WINAPI DdeConnectList(DWORD,HSZ,HSZ,HCONVLIST,PCONVCONTEXT);
-HDDEDATA WINAPI DdeCreateDataHandle(DWORD,PBYTE,DWORD,DWORD,HSZ,UINT,UINT);
-HSZ WINAPI DdeCreateStringHandleA(DWORD,LPSTR,int);
-HSZ WINAPI DdeCreateStringHandleW(DWORD,LPWSTR,int);
-BOOL WINAPI DdeDisconnect(HCONV);
-BOOL WINAPI DdeDisconnectList(HCONVLIST);
-BOOL WINAPI DdeEnableCallback(DWORD,HCONV,UINT);
-BOOL WINAPI DdeFreeDataHandle(HDDEDATA);
-BOOL WINAPI DdeFreeStringHandle(DWORD,HSZ);
-DWORD WINAPI DdeGetData(HDDEDATA,PBYTE,DWORD,DWORD);
-UINT WINAPI DdeGetLastError(DWORD);
-BOOL WINAPI DdeImpersonateClient(HCONV);
-UINT WINAPI DdeInitializeA(PDWORD,PFNCALLBACK,DWORD,DWORD);
-UINT WINAPI DdeInitializeW(PDWORD,PFNCALLBACK,DWORD,DWORD);
-BOOL WINAPI DdeKeepStringHandle(DWORD,HSZ);
-HDDEDATA WINAPI DdeNameService(DWORD,HSZ,HSZ,UINT);
-BOOL WINAPI DdePostAdvise(DWORD,HSZ,HSZ);
-UINT WINAPI DdeQueryConvInfo(HCONV,DWORD,PCONVINFO);
-HCONV WINAPI DdeQueryNextServer(HCONVLIST,HCONV);
-DWORD WINAPI DdeQueryStringA(DWORD,HSZ,LPSTR,DWORD,int);
-DWORD WINAPI DdeQueryStringW(DWORD,HSZ,LPWSTR,DWORD,int);
-HCONV WINAPI DdeReconnect(HCONV);
-BOOL WINAPI DdeSetUserHandle(HCONV,DWORD,DWORD);
-BOOL WINAPI DdeUnaccessData(HDDEDATA);
-BOOL WINAPI DdeUninitialize(DWORD);
-
-#ifdef UNICODE
-#define SZDDESYS_TOPIC	L"System"
-#define SZDDESYS_ITEM_TOPICS	L"Topics"
-#define SZDDESYS_ITEM_SYSITEMS	L"SysItems"
-#define SZDDESYS_ITEM_RTNMSG	L"ReturnMessage"
-#define SZDDESYS_ITEM_STATUS	L"Status"
-#define SZDDESYS_ITEM_FORMATS	L"Formats"
-#define SZDDESYS_ITEM_HELP	L"Help"
-#define SZDDE_ITEM_ITEMLIST	L"TopicItemList"
-#define MONHSZSTRUCT MONHSZSTRUCTA
-#define PMONHSZSTRUCT PMONHSZSTRUCTA
-#define DdeCreateStringHandle DdeCreateStringHandleW
-#define DdeInitialize DdeInitializeW
-#define DdeQueryString DdeQueryStringW
-#else
-#define SZDDESYS_TOPIC	"System"
-#define SZDDESYS_ITEM_TOPICS	"Topics"
-#define SZDDESYS_ITEM_SYSITEMS	"SysItems"
-#define SZDDESYS_ITEM_RTNMSG	"ReturnMessage"
-#define SZDDESYS_ITEM_STATUS	"Status"
-#define SZDDESYS_ITEM_FORMATS	"Formats"
-#define SZDDESYS_ITEM_HELP	"Help"
-#define SZDDE_ITEM_ITEMLIST	"TopicItemList"
-#define MONHSZSTRUCT MONHSZSTRUCTW
-#define PMONHSZSTRUCT PMONHSZSTRUCTW
-#define DdeCreateStringHandle DdeCreateStringHandleA
-#define DdeInitialize DdeInitializeA
-#define DdeQueryString DdeQueryStringA
-#endif
+HCONV     WINAPI DdeQueryNextServer(HCONVLIST, HCONV);
+DWORD     WINAPI DdeQueryStringA(DWORD, HSZ, LPSTR, DWORD, INT);
+DWORD     WINAPI DdeQueryStringW(DWORD, HSZ, LPWSTR, DWORD, INT);
+#define   DdeQueryString WINELIB_NAME_AW(DdeQueryString)
+BOOL      WINAPI DdeDisconnectList(HCONVLIST);
+HCONV     WINAPI DdeConnect(DWORD,HSZ,HSZ,PCONVCONTEXT);
+BOOL      WINAPI DdeDisconnect(HCONV);
+HDDEDATA  WINAPI DdeCreateDataHandle(DWORD,LPBYTE,DWORD,DWORD,HSZ,UINT,UINT);
+HCONV     WINAPI DdeReconnect(HCONV);
+HSZ       WINAPI DdeCreateStringHandleA(DWORD,LPCSTR,INT);
+HSZ       WINAPI DdeCreateStringHandleW(DWORD,LPCWSTR,INT);
+#define   DdeCreateStringHandle WINELIB_NAME_AW(DdeCreateStringHandle)
+BOOL      WINAPI DdeFreeStringHandle(DWORD,HSZ);
+BOOL      WINAPI DdeFreeDataHandle(HDDEDATA);
+BOOL      WINAPI DdeKeepStringHandle(DWORD,HSZ);
+HDDEDATA  WINAPI DdeClientTransaction(LPBYTE,DWORD,HCONV,HSZ,UINT,UINT,DWORD,LPDWORD);
+BOOL	  WINAPI DdeAbandonTransaction(DWORD idInst, HCONV hConv, DWORD idTransaction);
+BOOL      WINAPI DdeImpersonateClient(HCONV);
+BOOL      WINAPI DdePostAdvise(DWORD,HSZ,HSZ);
+HDDEDATA  WINAPI DdeAddData(HDDEDATA,LPBYTE,DWORD,DWORD);
+DWORD     WINAPI DdeGetData(HDDEDATA,LPBYTE,DWORD,DWORD);
+LPBYTE    WINAPI DdeAccessData(HDDEDATA,LPDWORD);
+BOOL      WINAPI DdeUnaccessData(HDDEDATA);
+BOOL      WINAPI DdeEnableCallback(DWORD,HCONV,UINT);
+INT       WINAPI DdeCmpStringHandles(HSZ,HSZ);
+BOOL      WINAPI DdeSetUserHandle(HCONV,DWORD,DWORD);
+
+HDDEDATA  WINAPI DdeNameService(DWORD,HSZ,HSZ,UINT);
+UINT      WINAPI DdeGetLastError(DWORD);
+UINT      WINAPI DdeQueryConvInfo(HCONV,DWORD,PCONVINFO);
+
 #ifdef __cplusplus
-}
-#endif
-#endif /* _DDEML_H */
+} /* extern "C" */
+#endif /* defined(__cplusplus) */
+
+#endif  /* __WINE_DDEML_H */




More information about the Ros-diffs mailing list