From ca2dfb03a3082b3f406ddf7b6f90617d70d800dd Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 9 Mar 2015 19:58:31 +0000 Subject: [PATCH] [OLE32_WINETEST] Sync with Wine Staging 1.7.37. CORE-9246 svn path=/trunk/; revision=66629 --- rostests/winetests/ole32/compobj.c | 359 +++++++++++++++++++++++++- rostests/winetests/ole32/moniker.c | 19 +- rostests/winetests/ole32/storage32.c | 2 +- rostests/winetests/ole32/usrmarshal.c | 4 +- 4 files changed, 359 insertions(+), 25 deletions(-) diff --git a/rostests/winetests/ole32/compobj.c b/rostests/winetests/ole32/compobj.c index c1ff25a6dfb..df13469e098 100644 --- a/rostests/winetests/ole32/compobj.c +++ b/rostests/winetests/ole32/compobj.c @@ -38,6 +38,7 @@ //#include "shlguid.h" #include #include /* for CLSID_FileProtocol */ +#include #include @@ -390,6 +391,7 @@ static void test_CLSIDFromProgID(void) clsid = CLSID_NULL; hr = CLSIDFromProgID(progidW, &clsid); + ok(hr == S_OK, "got 0x%08x\n", hr); /* it returns generated CLSID here */ ok(!IsEqualCLSID(&clsid, &CLSID_non_existent) && !IsEqualCLSID(&clsid, &CLSID_NULL), "got wrong clsid %s\n", wine_dbgstr_guid(&clsid)); @@ -1166,6 +1168,7 @@ static void test_CoGetPSClsid(void) ok(!res, "RegCreateKeyEx returned %d\n", res); res = RegCreateKeyExA(hkey, "ProxyStubClsid32", 0, NULL, 0, KEY_ALL_ACCESS | opposite, NULL, &hkey_psclsid, NULL); + ok(!res, "RegCreateKeyEx returned %d\n", res); res = RegSetValueExA(hkey_psclsid, NULL, 0, REG_SZ, (const BYTE *)clsidA, strlen(clsidA)+1); ok(!res, "RegSetValueEx returned %d\n", res); RegCloseKey(hkey_psclsid); @@ -1919,10 +1922,10 @@ static void test_CoGetContextToken(void) ok(hr == S_OK, "Expected S_OK, got 0x%08x\n", hr); todo_wine ok(ctx == (IObjContext *)token, "Expected interface pointers to be the same\n"); - refs = IUnknown_AddRef((IUnknown *)ctx); + refs = IObjContext_AddRef(ctx); todo_wine ok(refs == 3, "Expected 3, got %u\n", refs); - refs = IUnknown_Release((IUnknown *)ctx); + refs = IObjContext_Release(ctx); todo_wine ok(refs == 2, "Expected 2, got %u\n", refs); refs = IUnknown_Release((IUnknown *)token); @@ -1935,13 +1938,13 @@ static void test_CoGetContextToken(void) ok(token, "Expected token != 0\n"); todo_wine ok(ctx == (IObjContext *)token, "Expected interface pointers to be the same\n"); - refs = IUnknown_AddRef((IUnknown *)ctx); + refs = IObjContext_AddRef(ctx); ok(refs == 2, "Expected 1, got %u\n", refs); - refs = IUnknown_Release((IUnknown *)ctx); + refs = IObjContext_Release(ctx); ok(refs == 1, "Expected 0, got %u\n", refs); - refs = IUnknown_Release((IUnknown *)ctx); + refs = IObjContext_Release(ctx); ok(refs == 0, "Expected 0, got %u\n", refs); CoUninitialize(); @@ -2043,6 +2046,7 @@ static void test_CoInitializeEx(void) /* Cleanup */ CoUninitialize(); OleUninitialize(); + OleUninitialize(); } static void test_OleRegGetMiscStatus(void) @@ -2097,6 +2101,350 @@ static void test_CoCreateGuid(void) ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); } +static void CALLBACK apc_test_proc(ULONG_PTR param) +{ + /* nothing */ +} + +static DWORD CALLBACK release_semaphore_thread( LPVOID arg ) +{ + HANDLE handle = arg; + if (WaitForSingleObject(handle, 200) == WAIT_TIMEOUT) + ReleaseSemaphore(handle, 1, NULL); + return 0; +} + +static DWORD CALLBACK send_message_thread(LPVOID arg) +{ + HWND hWnd = arg; + Sleep(50); + SendMessageA(hWnd, WM_DDE_FIRST, 0, 0); + return 0; +} + +static DWORD CALLBACK post_message_thread(LPVOID arg) +{ + HWND hWnd = arg; + Sleep(50); + PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); + return 0; +} + +static void test_CoWaitForMultipleHandles(void) +{ + static const char cls_name[] = "cowait_test_class"; + HANDLE handles[2], thread; + DWORD index, tid; + WNDCLASSEXA wc; + BOOL success; + HRESULT hr; + HWND hWnd; + MSG msg; + + hr = pCoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + ok(hr == S_OK, "CoInitializeEx failed with error 0x%08x\n", hr); + + memset(&wc, 0, sizeof(wc)); + wc.cbSize = sizeof(wc); + wc.style = CS_VREDRAW | CS_HREDRAW; + wc.hInstance = GetModuleHandleA(0); + wc.hCursor = LoadCursorA(NULL, (LPCSTR)IDC_ARROW); + wc.hbrBackground = NULL; + wc.lpszClassName = cls_name; + wc.lpfnWndProc = DefWindowProcA; + success = RegisterClassExA(&wc) != 0; + ok(success, "RegisterClassExA failed %u\n", GetLastError()); + + hWnd = CreateWindowExA(0, cls_name, "Test", WS_TILEDWINDOW, 0, 0, 640, 480, 0, 0, 0, 0); + ok(hWnd != 0, "CreateWindowExA failed %u\n", GetLastError()); + handles[0] = CreateSemaphoreA(NULL, 1, 1, NULL); + ok(handles[0] != 0, "CreateSemaphoreA failed %u\n", GetLastError()); + handles[1] = CreateSemaphoreA(NULL, 1, 1, NULL); + ok(handles[1] != 0, "CreateSemaphoreA failed %u\n", GetLastError()); + + /* test without flags */ + + PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); + hr = CoWaitForMultipleHandles(0, 50, 0, handles, NULL); + ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got 0x%08x\n", hr); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + ok(success, "CoWaitForMultipleHandles unexpectedly pumped messages\n"); + + index = 0xdeadbeef; + PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); + hr = CoWaitForMultipleHandles(0, 50, 0, NULL, &index); + ok(hr == E_INVALIDARG, "expected E_INVALIDARG, got 0x%08x\n", hr); + ok(index == 0, "expected index 0, got %u\n", index); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + ok(success, "CoWaitForMultipleHandles unexpectedly pumped messages\n"); + + index = 0xdeadbeef; + PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); + hr = CoWaitForMultipleHandles(0, 50, 0, handles, &index); + ok(hr == RPC_E_NO_SYNC, "expected RPC_E_NO_SYNC, got 0x%08x\n", hr); + ok(index == 0, "expected index 0, got %u\n", index); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + ok(success, "CoWaitForMultipleHandles unexpectedly pumped messages\n"); + + index = 0xdeadbeef; + PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); + hr = CoWaitForMultipleHandles(0, 50, 1, handles, &index); + ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr); + ok(index == 0, "expected index 0, got %u\n", index); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + ok(success, "CoWaitForMultipleHandles unexpectedly pumped messages\n"); + + index = 0xdeadbeef; + PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); + hr = CoWaitForMultipleHandles(0, 50, 2, handles, &index); + ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr); + ok(index == 1, "expected index 1, got %u\n", index); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + ok(success, "CoWaitForMultipleHandles unexpectedly pumped messages\n"); + + index = 0xdeadbeef; + PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); + hr = CoWaitForMultipleHandles(0, 50, 2, handles, &index); + ok(hr == RPC_S_CALLPENDING, "expected RPC_S_CALLPENDING, got 0x%08x\n", hr); + ok(index == 0 || broken(index == 0xdeadbeef) /* Win 8 */, "expected index 0, got %u\n", index); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + ok(!success, "CoWaitForMultipleHandles didn't pump any messages\n"); + + /* test PostMessageA/SendMessageA from a different thread */ + + index = 0xdeadbeef; + thread = CreateThread(NULL, 0, post_message_thread, hWnd, 0, &tid); + ok(thread != NULL, "CreateThread failed, error %u\n", GetLastError()); + hr = CoWaitForMultipleHandles(0, 100, 2, handles, &index); + ok(hr == RPC_S_CALLPENDING, "expected RPC_S_CALLPENDING, got 0x%08x\n", hr); + ok(index == 0 || broken(index == 0xdeadbeef) /* Win 8 */, "expected index 0, got %u\n", index); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + ok(!success, "CoWaitForMultipleHandles didn't pump any messages\n"); + index = WaitForSingleObject(thread, 200); + ok(index == WAIT_OBJECT_0, "WaitForSingleObject failed\n"); + CloseHandle(thread); + + index = 0xdeadbeef; + thread = CreateThread(NULL, 0, send_message_thread, hWnd, 0, &tid); + ok(thread != NULL, "CreateThread failed, error %u\n", GetLastError()); + hr = CoWaitForMultipleHandles(0, 100, 2, handles, &index); + ok(hr == RPC_S_CALLPENDING, "expected RPC_S_CALLPENDING, got 0x%08x\n", hr); + ok(index == 0 || broken(index == 0xdeadbeef) /* Win 8 */, "expected index 0, got %u\n", index); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + ok(!success, "CoWaitForMultipleHandles didn't pump any messages\n"); + index = WaitForSingleObject(thread, 200); + ok(index == WAIT_OBJECT_0, "WaitForSingleObject failed\n"); + CloseHandle(thread); + + ReleaseSemaphore(handles[0], 1, NULL); + ReleaseSemaphore(handles[1], 1, NULL); + + /* test with COWAIT_WAITALL */ + + index = 0xdeadbeef; + PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); + hr = CoWaitForMultipleHandles(COWAIT_WAITALL, 50, 2, handles, &index); + ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr); + ok(index == 0, "expected index 0, got %u\n", index); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + ok(success, "CoWaitForMultipleHandles unexpectedly pumped messages\n"); + + index = 0xdeadbeef; + PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); + hr = CoWaitForMultipleHandles(0, 50, 2, handles, &index); + ok(hr == RPC_S_CALLPENDING, "expected RPC_S_CALLPENDING, got 0x%08x\n", hr); + ok(index == 0 || broken(index == 0xdeadbeef) /* Win 8 */, "expected index 0, got %u\n", index); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + ok(!success, "CoWaitForMultipleHandles didn't pump any messages\n"); + + ReleaseSemaphore(handles[0], 1, NULL); + ReleaseSemaphore(handles[1], 1, NULL); + + /* test with COWAIT_ALERTABLE */ + + index = 0xdeadbeef; + PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); + hr = CoWaitForMultipleHandles(COWAIT_ALERTABLE, 50, 1, handles, &index); + ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr); + ok(index == 0, "expected index 0, got %u\n", index); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + ok(success, "CoWaitForMultipleHandles unexpectedly pumped messages\n"); + + index = 0xdeadbeef; + PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); + hr = CoWaitForMultipleHandles(COWAIT_ALERTABLE, 50, 2, handles, &index); + ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr); + ok(index == 1, "expected index 1, got %u\n", index); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + ok(success, "CoWaitForMultipleHandles unexpectedly pumped messages\n"); + + index = 0xdeadbeef; + PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); + hr = CoWaitForMultipleHandles(COWAIT_ALERTABLE, 50, 2, handles, &index); + ok(hr == RPC_S_CALLPENDING, "expected RPC_S_CALLPENDING, got 0x%08x\n", hr); + ok(index == 0 || broken(index == 0xdeadbeef) /* Win 8 */, "expected index 0, got %u\n", index); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + ok(!success, "CoWaitForMultipleHandles didn't pump any messages\n"); + + index = 0xdeadbeef; + PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); + success = QueueUserAPC(apc_test_proc, GetCurrentThread(), 0); + ok(success, "QueueUserAPC failed %u\n", GetLastError()); + hr = CoWaitForMultipleHandles(COWAIT_ALERTABLE, 50, 2, handles, &index); + ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr); + ok(index == WAIT_IO_COMPLETION, "expected index WAIT_IO_COMPLETION, got %u\n", index); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + ok(success, "CoWaitForMultipleHandles unexpectedly pumped messages\n"); + + /* test with COWAIT_INPUTAVAILABLE (semaphores are still locked) */ + + index = 0xdeadbeef; + PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_NOREMOVE); + ok(success, "PeekMessageA returned FALSE\n"); + hr = CoWaitForMultipleHandles(0, 50, 2, handles, &index); + ok(hr == RPC_S_CALLPENDING, "expected RPC_S_CALLPENDING, got 0x%08x\n", hr); + ok(index == 0 || broken(index == 0xdeadbeef) /* Win 8 */, "expected index 0, got %u\n", index); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + ok(!success, "CoWaitForMultipleHandles didn't pump any messages\n"); + + index = 0xdeadbeef; + PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_NOREMOVE); + ok(success, "PeekMessageA returned FALSE\n"); + thread = CreateThread(NULL, 0, release_semaphore_thread, handles[1], 0, &tid); + ok(thread != NULL, "CreateThread failed, error %u\n", GetLastError()); + hr = CoWaitForMultipleHandles(COWAIT_INPUTAVAILABLE, 50, 2, handles, &index); + ok(hr == RPC_S_CALLPENDING || broken(hr == E_INVALIDARG) || broken(hr == S_OK) /* Win 8 */, + "expected RPC_S_CALLPENDING, got 0x%08x\n", hr); + if (hr != S_OK) ReleaseSemaphore(handles[1], 1, NULL); + ok(index == 0 || broken(index == 1) /* Win 8 */, "expected index 0, got %u\n", index); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + ok(!success || broken(success && hr == E_INVALIDARG), + "CoWaitForMultipleHandles didn't pump any messages\n"); + index = WaitForSingleObject(thread, 200); + ok(index == WAIT_OBJECT_0, "WaitForSingleObject failed\n"); + CloseHandle(thread); + + /* test behaviour of WM_QUIT (semaphores are still locked) */ + + PostMessageA(hWnd, WM_QUIT, 40, 0); + memset(&msg, 0, sizeof(msg)); + success = PeekMessageA(&msg, hWnd, WM_QUIT, WM_QUIT, PM_REMOVE); + ok(success, "PeekMessageA failed, error %u\n", GetLastError()); + ok(msg.message == WM_QUIT, "expected msg.message = WM_QUIT, got %u\n", msg.message); + ok(msg.wParam == 40, "expected msg.wParam = 40, got %lu\n", msg.wParam); + success = PeekMessageA(&msg, hWnd, WM_QUIT, WM_QUIT, PM_REMOVE); + ok(!success, "PeekMessageA succeeded\n"); + + index = 0xdeadbeef; + PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); + PostMessageA(hWnd, WM_QUIT, 41, 0); + thread = CreateThread(NULL, 0, post_message_thread, hWnd, 0, &tid); + ok(thread != NULL, "CreateThread failed, error %u\n", GetLastError()); + hr = CoWaitForMultipleHandles(0, 100, 2, handles, &index); + ok(hr == RPC_S_CALLPENDING, "expected RPC_S_CALLPENDING, got 0x%08x\n", hr); + ok(index == 0 || broken(index == 0xdeadbeef) /* Win 8 */, "expected index 0, got %u\n", index); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + todo_wine + ok(success || broken(!success) /* Win 2000/XP/8 */, "PeekMessageA failed, error %u\n", GetLastError()); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + ok(!success, "PeekMessageA succeeded\n"); + memset(&msg, 0, sizeof(msg)); + success = PeekMessageA(&msg, hWnd, WM_QUIT, WM_QUIT, PM_REMOVE); + todo_wine + ok(!success || broken(success) /* Win 2000/XP/8 */, "PeekMessageA succeeded\n"); + if (success) + { + ok(msg.message == WM_QUIT, "expected msg.message = WM_QUIT, got %u\n", msg.message); + ok(msg.wParam == 41, "expected msg.wParam = 41, got %lu\n", msg.wParam); + } + index = WaitForSingleObject(thread, 200); + ok(index == WAIT_OBJECT_0, "WaitForSingleObject failed\n"); + CloseHandle(thread); + + index = 0xdeadbeef; + PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); + PostMessageA(hWnd, WM_QUIT, 42, 0); + thread = CreateThread(NULL, 0, send_message_thread, hWnd, 0, &tid); + ok(thread != NULL, "CreateThread failed, error %u\n", GetLastError()); + hr = CoWaitForMultipleHandles(0, 100, 2, handles, &index); + ok(hr == RPC_S_CALLPENDING, "expected RPC_S_CALLPENDING, got 0x%08x\n", hr); + ok(index == 0 || broken(index == 0xdeadbeef) /* Win 8 */, "expected index 0, got %u\n", index); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + ok(!success, "CoWaitForMultipleHandles didn't pump all WM_DDE_FIRST messages\n"); + memset(&msg, 0, sizeof(msg)); + success = PeekMessageA(&msg, hWnd, WM_QUIT, WM_QUIT, PM_REMOVE); + ok(success, "PeekMessageA failed, error %u\n", GetLastError()); + ok(msg.message == WM_QUIT, "expected msg.message = WM_QUIT, got %u\n", msg.message); + ok(msg.wParam == 42, "expected msg.wParam = 42, got %lu\n", msg.wParam); + index = WaitForSingleObject(thread, 200); + ok(index == WAIT_OBJECT_0, "WaitForSingleObject failed\n"); + CloseHandle(thread); + + PostQuitMessage(43); + memset(&msg, 0, sizeof(msg)); + success = PeekMessageA(&msg, hWnd, WM_QUIT, WM_QUIT, PM_REMOVE); + ok(success || broken(!success) /* Win 8 */, "PeekMessageA failed, error %u\n", GetLastError()); + if (!success) + win_skip("PostQuitMessage didn't queue a WM_QUIT message, skipping tests\n"); + else + { + ok(msg.message == WM_QUIT, "expected msg.message = WM_QUIT, got %u\n", msg.message); + ok(msg.wParam == 43, "expected msg.wParam = 43, got %lu\n", msg.wParam); + success = PeekMessageA(&msg, hWnd, WM_QUIT, WM_QUIT, PM_REMOVE); + ok(!success, "PeekMessageA succeeded\n"); + + index = 0xdeadbeef; + PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); + PostQuitMessage(44); + thread = CreateThread(NULL, 0, post_message_thread, hWnd, 0, &tid); + ok(thread != NULL, "CreateThread failed, error %u\n", GetLastError()); + hr = CoWaitForMultipleHandles(0, 100, 2, handles, &index); + ok(hr == RPC_S_CALLPENDING, "expected RPC_S_CALLPENDING, got 0x%08x\n", hr); + ok(index == 0 || broken(index == 0xdeadbeef) /* Win 8 */, "expected index 0, got %u\n", index); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + ok(success, "PeekMessageA failed, error %u\n", GetLastError()); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + todo_wine + ok(!success, "PeekMessageA succeeded\n"); + success = PeekMessageA(&msg, hWnd, WM_QUIT, WM_QUIT, PM_REMOVE); + todo_wine + ok(!success, "CoWaitForMultipleHandles didn't remove WM_QUIT messages\n"); + index = WaitForSingleObject(thread, 200); + ok(index == WAIT_OBJECT_0, "WaitForSingleObject failed\n"); + CloseHandle(thread); + + index = 0xdeadbeef; + PostMessageA(hWnd, WM_DDE_FIRST, 0, 0); + PostQuitMessage(45); + thread = CreateThread(NULL, 0, send_message_thread, hWnd, 0, &tid); + ok(thread != NULL, "CreateThread failed, error %u\n", GetLastError()); + hr = CoWaitForMultipleHandles(0, 100, 2, handles, &index); + ok(hr == RPC_S_CALLPENDING, "expected RPC_S_CALLPENDING, got 0x%08x\n", hr); + ok(index == 0 || broken(index == 0xdeadbeef) /* Win 8 */, "expected index 0, got %u\n", index); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + ok(success, "PeekMessageA failed, error %u\n", GetLastError()); + success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE); + todo_wine + ok(!success, "PeekMessageA succeeded\n"); + success = PeekMessageA(&msg, hWnd, WM_QUIT, WM_QUIT, PM_REMOVE); + ok(!success, "CoWaitForMultipleHandles didn't remove WM_QUIT messages\n"); + index = WaitForSingleObject(thread, 200); + ok(index == WAIT_OBJECT_0, "WaitForSingleObject failed\n"); + CloseHandle(thread); + } + + CloseHandle(handles[0]); + CloseHandle(handles[1]); + DestroyWindow(hWnd); + + success = UnregisterClassA(cls_name, GetModuleHandleA(0)); + ok(success, "UnregisterClass failed %u\n", GetLastError()); + + CoUninitialize(); +} + static void init_funcs(void) { HMODULE hOle32 = GetModuleHandleA("ole32"); @@ -2157,4 +2505,5 @@ START_TEST(compobj) test_CoInitializeEx(); test_OleRegGetMiscStatus(); test_CoCreateGuid(); + test_CoWaitForMultipleHandles(); } diff --git a/rostests/winetests/ole32/moniker.c b/rostests/winetests/ole32/moniker.c index 2418ff155fd..27d93ca000d 100644 --- a/rostests/winetests/ole32/moniker.c +++ b/rostests/winetests/ole32/moniker.c @@ -62,14 +62,6 @@ static char const * const *expected_method_list; static const WCHAR wszFileName1[] = {'c',':','\\','w','i','n','d','o','w','s','\\','t','e','s','t','1','.','d','o','c',0}; static const WCHAR wszFileName2[] = {'c',':','\\','w','i','n','d','o','w','s','\\','t','e','s','t','2','.','d','o','c',0}; -static const CLSID CLSID_WineTest = -{ /* 9474ba1a-258b-490b-bc13-516e9239ace0 */ - 0x9474ba1a, - 0x258b, - 0x490b, - {0xbc, 0x13, 0x51, 0x6e, 0x92, 0x39, 0xac, 0xe0} -}; - static const CLSID CLSID_TestMoniker = { /* b306bfbc-496e-4f53-b93e-2ff9c83223d7 */ 0xb306bfbc, @@ -2028,9 +2020,7 @@ static void test_save_load_filemoniker(void) hr = IMoniker_Save(pMk, pStm, TRUE); ok_ole_success(hr, "IMoniker_Save"); - - hr = IMoniker_Release(pMk); - ok_ole_success(hr, "IMoniker_Release"); + IMoniker_Release(pMk); /* overwrite the constants with various values */ hr = IStream_Seek(pStm, zero_pos, STREAM_SEEK_SET, NULL); @@ -2061,11 +2051,8 @@ static void test_save_load_filemoniker(void) hr = IMoniker_Load(pMk, pStm); ok_ole_success(hr, "IMoniker_Load"); - hr = IMoniker_Release(pMk); - ok_ole_success(hr, "IMoniker_Release"); - - hr = IStream_Release(pStm); - ok_ole_success(hr, "IStream_Release"); + IMoniker_Release(pMk); + IStream_Release(pStm); } START_TEST(moniker) diff --git a/rostests/winetests/ole32/storage32.c b/rostests/winetests/ole32/storage32.c index 4427968226b..360ff67187c 100644 --- a/rostests/winetests/ole32/storage32.c +++ b/rostests/winetests/ole32/storage32.c @@ -1052,7 +1052,7 @@ static void test_streamenum(void) r = IStorage_CreateStream(stg, stmname, STGM_SHARE_EXCLUSIVE | STGM_READWRITE, 0, 0, &stm ); ok(r==S_OK, "IStorage->CreateStream failed\n"); - r = IStream_Release(stm); + IStream_Release(stm); /* first enum ... should be 1 stream */ r = IStorage_EnumElements(stg, 0, NULL, 0, &ee); diff --git a/rostests/winetests/ole32/usrmarshal.c b/rostests/winetests/ole32/usrmarshal.c index cec2ece0010..28d4ee63cd1 100644 --- a/rostests/winetests/ole32/usrmarshal.c +++ b/rostests/winetests/ole32/usrmarshal.c @@ -281,7 +281,6 @@ static void test_marshal_HENHMETAFILE(void) ok(*(DWORD *)wirehemf == (size - 0x10), "wirestgm + 0xc should be size - 0x10 instead of 0x%08x\n", *(DWORD *)wirehemf); wirehemf += sizeof(DWORD); ok(*(DWORD *)wirehemf == EMR_HEADER, "wirestgm + 0x10 should be EMR_HEADER instead of %d\n", *(DWORD *)wirehemf); - wirehemf += sizeof(DWORD); /* ... rest of data not tested - refer to tests for GetEnhMetaFileBits * at this point */ @@ -306,7 +305,6 @@ static void test_marshal_HENHMETAFILE(void) ok(*(DWORD *)wirehemf == WDT_REMOTE_CALL, "wirestgm + 0x0 should be WDT_REMOTE_CALL instead of 0x%08x\n", *(DWORD *)wirehemf); wirehemf += sizeof(DWORD); ok(*(DWORD *)wirehemf == (DWORD)(DWORD_PTR)hemf, "wirestgm + 0x4 should be hemf instead of 0x%08x\n", *(DWORD *)wirehemf); - wirehemf += sizeof(DWORD); init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE); HENHMETAFILE_UserUnmarshal(&umcb.Flags, buffer, &hemf2); @@ -442,7 +440,6 @@ static void test_marshal_HMETAFILEPICT(void) ok(*(DWORD *)wirehmfp == (buffer_end - buffer - 0x28), "wirestgm + 0x24 should be size - 0x34 instead of 0x%08x\n", *(DWORD *)wirehmfp); wirehmfp += sizeof(DWORD); ok(*(WORD *)wirehmfp == 1, "wirehmfp + 0x28 should be 1 instead of 0x%08x\n", *(DWORD *)wirehmfp); - wirehmfp += sizeof(DWORD); /* ... rest of data not tested - refer to tests for GetMetaFileBits * at this point */ @@ -585,6 +582,7 @@ static void marshal_WdtpInterfacePointer(DWORD umcb_ctx, DWORD ctx) ok(size == 0, "size should be 0 bytes, not %d\n", size); buffer = HeapAlloc(GetProcessHeap(), 0, size); buffer_end = WdtpInterfacePointer_UserMarshal(&umcb.Flags, ctx, buffer, unk, &IID_IUnknown); + ok(buffer_end == buffer, "buffer_end %p buffer %p\n", buffer_end, buffer); HeapFree(GetProcessHeap(), 0, buffer); /* Now for a non-NULL pointer. The marshalled data are two size DWORDS and then