Robert Shearman : ole: Add a test for WM_QUIT behaviour during COM calls.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jan 20 13:20:18 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 98734cc89410637a012568713e599169f8b288d7
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=98734cc89410637a012568713e599169f8b288d7

Author: Robert Shearman <rob at codeweavers.com>
Date:   Fri Jan 20 16:14:32 2006 +0100

ole: Add a test for WM_QUIT behaviour during COM calls.

---

 dlls/ole32/tests/marshal.c |   94 +++++++++++++++++++++++++++++++++++++-------
 1 files changed, 79 insertions(+), 15 deletions(-)

diff --git a/dlls/ole32/tests/marshal.c b/dlls/ole32/tests/marshal.c
index a9eec4c..dc445e5 100644
--- a/dlls/ole32/tests/marshal.c
+++ b/dlls/ole32/tests/marshal.c
@@ -37,16 +37,18 @@ HRESULT (WINAPI * pCoInitializeEx)(LPVOI
 #define ok_no_locks() ok(cLocks == 0, "Number of locks should be 0, but actually is %ld\n", cLocks)
 #define ok_ole_success(hr, func) ok(hr == S_OK, #func " failed with error 0x%08lx\n", hr)
 
+static const IID IID_IWineTest =
+{
+    0x5201163f,
+    0x8164,
+    0x4fd0,
+    {0xa1, 0xa2, 0x5d, 0x5a, 0x36, 0x54, 0xd3, 0xbd}
+}; /* 5201163f-8164-4fd0-a1a2-5d5a3654d3bd */
+
 static void test_CoGetPSClsid(void)
 {
 	HRESULT hr;
 	CLSID clsid;
-	static const CLSID IID_IWineTest = {
-	    0x5201163f,
-	    0x8164,
-	    0x4fd0,
-	    {0xa1, 0xa2, 0x5d, 0x5a, 0x36, 0x54, 0xd3, 0xbd}
-	}; /* 5201163f-8164-4fd0-a1a2-5d5a3654d3bd */
 
 	hr = CoGetPSClsid(&IID_IClassFactory, &clsid);
 	ok_ole_success(hr, CoGetPSClsid);
@@ -277,12 +279,6 @@ static void test_no_marshaler(void)
 {
     IStream *pStream;
     HRESULT hr;
-    static const CLSID IID_IWineTest = {
-        0x5201163f,
-        0x8164,
-        0x4fd0,
-        {0xa1, 0xa2, 0x5d, 0x5a, 0x36, 0x54, 0xd3, 0xbd}
-    }; /* 5201163f-8164-4fd0-a1a2-5d5a3654d3bd */
 
     hr = CreateStreamOnHGlobal(NULL, TRUE, &pStream);
     ok_ole_success(hr, CreateStreamOnHGlobal);
@@ -1401,8 +1397,11 @@ static HRESULT WINAPI TestRE_IClassFacto
     LPVOID *ppvObj)
 {
     DWORD_PTR res;
-    BOOL ret = SendMessageTimeout(hwnd_app, WM_NULL, 0, 0, SMTO_BLOCK, 5000, &res);
-    ok(ret, "Timed out sending a message to originating window during RPC call\n");
+    if (IsEqualIID(riid, &IID_IWineTest))
+    {
+        BOOL ret = SendMessageTimeout(hwnd_app, WM_NULL, 0, 0, SMTO_BLOCK, 5000, &res);
+        ok(ret, "Timed out sending a message to originating window during RPC call\n");
+    }
     return S_FALSE;
 }
 
@@ -1445,7 +1444,9 @@ static LRESULT CALLBACK window_proc(HWND
 
         ok_more_than_one_lock();
 
-        hr = IClassFactory_CreateInstance(proxy, NULL, &IID_IUnknown, (void **)&object);
+        /* note the use of the magic IID_IWineTest value to tell remote thread
+         * to try to send a message back to us */
+        hr = IClassFactory_CreateInstance(proxy, NULL, &IID_IWineTest, (void **)&object);
 
         IClassFactory_Release(proxy);
 
@@ -1457,6 +1458,43 @@ static LRESULT CALLBACK window_proc(HWND
 
         return 0;
     }
+    case WM_USER+1:
+    {
+        HRESULT hr;
+        IStream *pStream = NULL;
+        IClassFactory *proxy = NULL;
+        IUnknown *object;
+        DWORD tid;
+        HANDLE thread;
+
+        cLocks = 0;
+
+        hr = CreateStreamOnHGlobal(NULL, TRUE, &pStream);
+        ok_ole_success(hr, CreateStreamOnHGlobal);
+        tid = start_host_object(pStream, &IID_IClassFactory, (IUnknown*)&TestRE_ClassFactory, MSHLFLAGS_NORMAL, &thread);
+
+        ok_more_than_one_lock();
+
+        IStream_Seek(pStream, ullZero, STREAM_SEEK_SET, NULL);
+        hr = CoUnmarshalInterface(pStream, &IID_IClassFactory, (void **)&proxy);
+        ok_ole_success(hr, CoReleaseMarshalData);
+        IStream_Release(pStream);
+
+        ok_more_than_one_lock();
+
+        /* post quit message before a doing a COM call to show that a pending
+        * WM_QUIT message doesn't stop the call from succeeding */
+        PostMessage(hwnd, WM_QUIT, 0, 0);
+        hr = IClassFactory_CreateInstance(proxy, NULL, &IID_IUnknown, (void **)&object);
+
+        IClassFactory_Release(proxy);
+
+        ok_no_locks();
+
+        end_host_object(tid, thread);
+
+        return 0;
+    }
     default:
         return DefWindowProc(hwnd, msg, wparam, lparam);
     }
@@ -1475,6 +1513,7 @@ static void test_message_reentrancy(void
     hwnd_app = CreateWindow("WineCOMTest", NULL, 0, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, NULL, 0);
     ok(hwnd_app != NULL, "Window creation failed\n");
 
+    /* start message re-entrancy test */
     PostMessage(hwnd_app, WM_USER, 0, 0);
 
     while (GetMessage(&msg, NULL, 0, 0))
@@ -1484,6 +1523,23 @@ static void test_message_reentrancy(void
     }
 }
 
+static void test_WM_QUIT_handling(void)
+{
+    MSG msg;
+
+    hwnd_app = CreateWindow("WineCOMTest", NULL, 0, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, NULL, 0);
+    ok(hwnd_app != NULL, "Window creation failed\n");
+
+    /* start WM_QUIT handling test */
+    PostMessage(hwnd_app, WM_USER+1, 0, 0);
+
+    while (GetMessage(&msg, NULL, 0, 0))
+    {
+        TranslateMessage(&msg);
+        DispatchMessage(&msg);
+    }
+}
+
 /* doesn't pass with Win9x COM DLLs (even though Essential COM says it should) */
 #if 0
 
@@ -1852,9 +1908,16 @@ static void test_marshal_HENHMETAFILE(vo
 
 START_TEST(marshal)
 {
+    WNDCLASS wndclass;
     HMODULE hOle32 = GetModuleHandle("ole32");
     if (!(pCoInitializeEx = (void*)GetProcAddress(hOle32, "CoInitializeEx"))) goto no_test;
 
+    /* register a window class used in several tests */
+    memset(&wndclass, 0, sizeof(wndclass));
+    wndclass.lpfnWndProc = window_proc;
+    wndclass.lpszClassName = "WineCOMTest";
+    RegisterClass(&wndclass);
+
     pCoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
 
     /* FIXME: test CoCreateInstanceEx */
@@ -1889,6 +1952,7 @@ START_TEST(marshal)
     test_stubbuffer(&IID_IClassFactory);
     test_proxybuffer(&IID_IClassFactory);
     test_message_reentrancy();
+    test_WM_QUIT_handling();
 
 /*    test_out_of_process_com(); */
 




More information about the wine-cvs mailing list