user32/tests: Skip some tests when DdeClientTransaction() returns NULL. This avoids some crashes on Win9x.

Francois Gouget fgouget at free.fr
Fri Nov 9 05:42:32 CST 2007


---

This causes nasty crashes on Win98: white modal Win98 dialog saying the 
application performed an illegal operation, then the standard dialog, 
but the debugger is never triggered. I suspect this is because the crash 
happens in the Win98 code. I also suspect this is what prevents winetest 
from completing (since 20071103) in my nightly tests, though I've been 
able to nurse it to completion on the 6th.

Even with this patch there's still a crash but I have not managed to 
identify where :-(


 dlls/user32/tests/dde.c |   71 +++++++++++++++++++++++++++--------------------
 1 files changed, 41 insertions(+), 30 deletions(-)

diff --git a/dlls/user32/tests/dde.c b/dlls/user32/tests/dde.c
index ca9fe20..0c5dc1f 100644
--- a/dlls/user32/tests/dde.c
+++ b/dlls/user32/tests/dde.c
@@ -285,57 +285,66 @@ static void test_ddeml_client(void)
     DdeGetLastError(client_pid);
     hdata = DdeClientTransaction(NULL, 0, conversation, item, CF_TEXT, XTYP_REQUEST, default_timeout, &res);
     ret = DdeGetLastError(client_pid);
-    ok(hdata != NULL, "Expected non-NULL hdata, got %p\n", hdata);
     ok(ret == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", ret);
     todo_wine
     {
         ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %08x\n", res);
     }
-
-    str = (LPSTR)DdeAccessData(hdata, &size);
-    ok(!lstrcmpA(str, "requested data\r\n"), "Expected 'requested data\\r\\n', got %s\n", str);
-    ok(size == 19, "Expected 19, got %d\n", size);
-
-    ret = DdeUnaccessData(hdata);
-    ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
+    if (hdata == NULL)
+        ok(FALSE, "hdata is NULL\n");
+    else
+    {
+        str = (LPSTR)DdeAccessData(hdata, &size);
+        ok(!lstrcmpA(str, "requested data\r\n"), "Expected 'requested data\\r\\n', got %s\n", str);
+        ok(size == 19, "Expected 19, got %d\n", size);
+        
+        ret = DdeUnaccessData(hdata);
+        ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
+    }
 
     /* XTYP_REQUEST, fAckReq = TRUE */
     res = 0xdeadbeef;
     DdeGetLastError(client_pid);
     hdata = DdeClientTransaction(NULL, 0, conversation, item, CF_TEXT, XTYP_REQUEST, default_timeout, &res);
     ret = DdeGetLastError(client_pid);
-    ok(hdata != NULL, "Expected non-NULL hdata\n");
     todo_wine
     {
         ok(res == DDE_FNOTPROCESSED, "Expected DDE_FNOTPROCESSED, got %d\n", res);
         ok(ret == DMLERR_MEMORY_ERROR, "Expected DMLERR_MEMORY_ERROR, got %d\n", ret);
     }
+    if (hdata == NULL)
+        ok(FALSE, "hdata is NULL\n");
+    else
+    {
+        str = (LPSTR)DdeAccessData(hdata, &size);
+        ok(!lstrcmpA(str, "requested data\r\n"), "Expected 'requested data\\r\\n', got %s\n", str);
+        ok(size == 19, "Expected 19, got %d\n", size);
 
-    str = (LPSTR)DdeAccessData(hdata, &size);
-    ok(!lstrcmpA(str, "requested data\r\n"), "Expected 'requested data\\r\\n', got %s\n", str);
-    ok(size == 19, "Expected 19, got %d\n", size);
-
-    ret = DdeUnaccessData(hdata);
-    ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
+        ret = DdeUnaccessData(hdata);
+        ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
+    }
 
     /* XTYP_REQUEST, all params normal */
     res = 0xdeadbeef;
     DdeGetLastError(client_pid);
     hdata = DdeClientTransaction(NULL, 0, conversation, item, CF_TEXT, XTYP_REQUEST, default_timeout, &res);
     ret = DdeGetLastError(client_pid);
-    ok(hdata != NULL, "Expected non-NULL hdata\n");
     ok(ret == DMLERR_NO_ERROR, "Expected DMLERR_NO_ERROR, got %d\n", ret);
     todo_wine
     {
         ok(res == DDE_FNOTPROCESSED, "Expected DDE_FNOTPROCESSED, got %d\n", res);
     }
+    if (hdata == NULL)
+        ok(FALSE, "hdata is NULL\n");
+    else
+    {
+        str = (LPSTR)DdeAccessData(hdata, &size);
+        ok(!lstrcmpA(str, "requested data\r\n"), "Expected 'requested data\\r\\n', got %s\n", str);
+        ok(size == 19, "Expected 19, got %d\n", size);
 
-    str = (LPSTR)DdeAccessData(hdata, &size);
-    ok(!lstrcmpA(str, "requested data\r\n"), "Expected 'requested data\\r\\n', got %s\n", str);
-    ok(size == 19, "Expected 19, got %d\n", size);
-
-    ret = DdeUnaccessData(hdata);
-    ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
+        ret = DdeUnaccessData(hdata);
+        ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
+    }
 
     /* XTYP_REQUEST, no item */
     res = 0xdeadbeef;
@@ -444,22 +453,24 @@ static void test_ddeml_client(void)
     DdeGetLastError(client_pid);
     hdata = DdeClientTransaction(NULL, 0, conversation, item, CF_TEXT, XTYP_REQUEST, default_timeout, &res);
     ret = DdeGetLastError(client_pid);
-    ok(hdata != NULL, "Expected non-NULL hdata\n");
     ok(ret == DMLERR_NO_ERROR, "Expected DMLERR_NO_ERROR, got %d\n", ret);
     todo_wine
     {
         ok(res == DDE_FNOTPROCESSED, "Expected DDE_FNOTPROCESSED, got %d\n", res);
     }
+    if (hdata == NULL)
+        ok(FALSE, "hdata is NULL\n");
+    else
+    {
+        str = (LPSTR)DdeAccessData(hdata, &size);
+        ok(!lstrcmpA(str, "command executed\r\n"), "Expected 'command executed\\r\\n', got %s\n", str);
+        ok(size == 21, "Expected 21, got %d\n", size);
 
-    str = (LPSTR)DdeAccessData(hdata, &size);
-    ok(!lstrcmpA(str, "command executed\r\n"), "Expected 'command executed\\r\\n', got %s\n", str);
-    ok(size == 21, "Expected 21, got %d\n", size);
-
-    ret = DdeUnaccessData(hdata);
-    ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
+        ret = DdeUnaccessData(hdata);
+        ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
+    }
 
     /* invalid transactions */
-
     res = 0xdeadbeef;
     DdeGetLastError(client_pid);
     op = DdeClientTransaction(NULL, 0, conversation, item, CF_TEXT, XTYP_ADVREQ, default_timeout, &res);
-- 
1.5.3.4




More information about the wine-patches mailing list