Handle CBR_BLOCK in EXECUTE and ADVISE DDE transactions
Dmitry Timoshkov
dmitry at baikal.ru
Tue Feb 1 08:07:02 CST 2005
Hello,
attached patch allows Excel to communicate with MSQuery.
Changelog:
Dmitry Timoshkov <dmitry at codeweavers.com>
Handle CBR_BLOCK in EXECUTE and ADVISE DDE transactions.
diff -up cvs/hq/wine/dlls/user/dde/client.c wine/dlls/user/dde/client.c
--- cvs/hq/wine/dlls/user/dde/client.c 2004-08-03 13:24:30.000000000 +0900
+++ wine/dlls/user/dde/client.c 2005-02-01 16:04:22.000000000 +0800
@@ -166,7 +166,7 @@ HCONV WINAPI DdeConnect(DWORD idInst, HS
hwndClient = CreateWindowA(WDML_szClientConvClassA, NULL, WS_POPUP, 0, 0, 0, 0, 0, 0, 0, 0);
}
- SetWindowLongA(hwndClient, GWL_WDML_INSTANCE, (DWORD)pInstance);
+ SetWindowLongPtrW(hwndClient, GWL_WDML_INSTANCE, (LONG_PTR)pInstance);
if (hszService)
{
@@ -1271,6 +1271,8 @@ static LRESULT CALLBACK WDML_ClientProc(
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))
diff -up cvs/hq/wine/dlls/user/dde/dde_private.h wine/dlls/user/dde/dde_private.h
--- cvs/hq/wine/dlls/user/dde/dde_private.h 2004-08-03 13:24:30.000000000 +0900
+++ wine/dlls/user/dde/dde_private.h 2005-02-01 21:21:54.000000000 +0800
@@ -173,7 +173,7 @@ extern CRITICAL_SECTION WDML_CritSect;
/* header for the DDE Data objects */
typedef struct tagDDE_DATAHANDLE_HEAD
{
- short cfFormat;
+ WORD cfFormat;
WORD bAppOwned;
} DDE_DATAHANDLE_HEAD;
diff -up cvs/hq/wine/dlls/user/dde/misc.c wine/dlls/user/dde/misc.c
--- cvs/hq/wine/dlls/user/dde/misc.c 2004-08-03 13:24:30.000000000 +0900
+++ wine/dlls/user/dde/misc.c 2005-02-01 21:23:13.000000000 +0800
@@ -1277,9 +1277,13 @@ HDDEDATA WINAPI DdeCreateDataHandle(DWOR
DDE_DATAHANDLE_HEAD* pDdh;
WCHAR psz[MAX_BUFFER_LEN];
- GetAtomNameW(HSZ2ATOM(hszItem), psz, MAX_BUFFER_LEN);
+ if (!GetAtomNameW(HSZ2ATOM(hszItem), psz, MAX_BUFFER_LEN))
+ {
+ psz[0] = HSZ2ATOM(hszItem);
+ psz[1] = 0;
+ }
- TRACE("(%ld,%p,cb %ld, cbOff %ld,%p <%s>,%x,%x)\n",
+ 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)
@@ -1309,6 +1313,7 @@ HDDEDATA WINAPI DdeCreateDataHandle(DWOR
}
GlobalUnlock(hMem);
+ TRACE("=> %p\n", hMem);
return (HDDEDATA)hMem;
}
@@ -1416,7 +1421,7 @@ LPBYTE WINAPI DdeAccessData(HDDEDATA hDa
{
*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);
}
@@ -1491,8 +1496,8 @@ HDDEDATA WDML_Global2DataHandle(H
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:
@@ -1550,7 +1555,8 @@ HGLOBAL WDML_DataHandle2Global(HDDEDATA
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:
diff -up cvs/hq/wine/dlls/user/dde/server.c wine/dlls/user/dde/server.c
--- cvs/hq/wine/dlls/user/dde/server.c 2004-08-03 13:24:30.000000000 +0900
+++ wine/dlls/user/dde/server.c 2005-02-01 21:24:53.000000000 +0800
@@ -562,7 +562,7 @@ static WDML_XACT* WDML_ServerQueueReques
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))
{
@@ -574,12 +574,13 @@ static WDML_QUEUE_STATE WDML_ServerHandl
switch ((ULONG_PTR)hDdeData)
{
case 0:
- WDML_PostAck(pConv, WDML_SERVER_SIDE, 0, FALSE, FALSE, pXAct->atom,
- pXAct->lParam, WM_DDE_REQUEST);
+ 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);
@@ -589,12 +590,17 @@ static WDML_QUEUE_STATE WDML_ServerHandl
{
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;
}
/******************************************************************
@@ -633,8 +639,8 @@ static WDML_QUEUE_STATE WDML_ServerHandl
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 |
@@ -646,15 +652,18 @@ static WDML_QUEUE_STATE WDML_ServerHandl
hDdeData = WDML_InvokeCallback(pConv->instance, XTYP_ADVSTART, pDdeAdvise->cfFormat,
(HCONV)pConv, pConv->hszTopic, pXAct->hszItem, 0, 0, 0);
}
- else
- {
- hDdeData = 0;
- }
- if ((UINT)hDdeData)
+ switch ((ULONG_PTR)hDdeData)
{
- fAck = TRUE;
+ 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);
@@ -670,11 +679,7 @@ static WDML_QUEUE_STATE WDML_ServerHandl
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);
@@ -792,8 +797,11 @@ static WDML_QUEUE_STATE WDML_ServerHandl
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;
@@ -801,7 +809,7 @@ static WDML_QUEUE_STATE WDML_ServerHandl
fBusy = TRUE;
break;
default:
- WARN("Bad result code\n");
+ FIXME("Unsupported returned value %p\n", hDdeData);
/* fall through */
case DDE_FNOTPROCESSED:
break;
@@ -985,6 +993,8 @@ static LRESULT CALLBACK WDML_ServerConvP
WDML_CONV* pConv;
WDML_XACT* pXAct = NULL;
+ TRACE("%p %04x %08x %08lx\n", hwndServer, iMsg, wParam , lParam);
+
if (iMsg == WM_DESTROY)
{
EnterCriticalSection(&WDML_CritSect);
More information about the wine-patches
mailing list