ole32: Don't process window events when APC calls are queued.

This commit is contained in:
Sebastian Lackner 2014-11-05 00:49:59 +01:00 committed by Alexandre Julliard
parent bbf6891030
commit f6f55058e4
2 changed files with 14 additions and 4 deletions

View File

@ -4427,6 +4427,7 @@ HRESULT WINAPI CoWaitForMultipleHandles(DWORD dwFlags, DWORD dwTimeout,
DWORD start_time = GetTickCount(); DWORD start_time = GetTickCount();
APARTMENT *apt = COM_CurrentApt(); APARTMENT *apt = COM_CurrentApt();
BOOL message_loop = apt && !apt->multi_threaded; BOOL message_loop = apt && !apt->multi_threaded;
BOOL check_apc = (dwFlags & COWAIT_ALERTABLE) != 0;
TRACE("(0x%08x, 0x%08x, %d, %p, %p)\n", dwFlags, dwTimeout, cHandles, TRACE("(0x%08x, 0x%08x, %d, %p, %p)\n", dwFlags, dwTimeout, cHandles,
pHandles, lpdwindex); pHandles, lpdwindex);
@ -4460,9 +4461,19 @@ HRESULT WINAPI CoWaitForMultipleHandles(DWORD dwFlags, DWORD dwTimeout,
TRACE("waiting for rpc completion or window message\n"); TRACE("waiting for rpc completion or window message\n");
res = MsgWaitForMultipleObjectsEx(cHandles, pHandles, res = WAIT_TIMEOUT;
(dwTimeout == INFINITE) ? INFINITE : start_time + dwTimeout - now,
QS_SENDMESSAGE | QS_ALLPOSTMESSAGE | QS_PAINT, wait_flags); if (check_apc)
{
res = WaitForMultipleObjectsEx(cHandles, pHandles,
(dwFlags & COWAIT_WAITALL) != 0, 0, TRUE);
check_apc = FALSE;
}
if (res == WAIT_TIMEOUT)
res = MsgWaitForMultipleObjectsEx(cHandles, pHandles,
(dwTimeout == INFINITE) ? INFINITE : start_time + dwTimeout - now,
QS_SENDMESSAGE | QS_ALLPOSTMESSAGE | QS_PAINT, wait_flags);
if (res == WAIT_OBJECT_0 + cHandles) /* messages available */ if (res == WAIT_OBJECT_0 + cHandles) /* messages available */
{ {

View File

@ -2241,7 +2241,6 @@ static void test_CoWaitForMultipleHandles(void)
ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr); 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); 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); success = PeekMessageA(&msg, hWnd, WM_DDE_FIRST, WM_DDE_FIRST, PM_REMOVE);
todo_wine
ok(success, "CoWaitForMultipleHandles unexpectedly pumped messages\n"); ok(success, "CoWaitForMultipleHandles unexpectedly pumped messages\n");
/* test with COWAIT_INPUTAVAILABLE (semaphores are still locked) */ /* test with COWAIT_INPUTAVAILABLE (semaphores are still locked) */