ole32: Don't process window events when APC calls are queued.
This commit is contained in:
parent
bbf6891030
commit
f6f55058e4
|
@ -4427,6 +4427,7 @@ HRESULT WINAPI CoWaitForMultipleHandles(DWORD dwFlags, DWORD dwTimeout,
|
|||
DWORD start_time = GetTickCount();
|
||||
APARTMENT *apt = COM_CurrentApt();
|
||||
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,
|
||||
pHandles, lpdwindex);
|
||||
|
@ -4460,9 +4461,19 @@ HRESULT WINAPI CoWaitForMultipleHandles(DWORD dwFlags, DWORD dwTimeout,
|
|||
|
||||
TRACE("waiting for rpc completion or window message\n");
|
||||
|
||||
res = MsgWaitForMultipleObjectsEx(cHandles, pHandles,
|
||||
(dwTimeout == INFINITE) ? INFINITE : start_time + dwTimeout - now,
|
||||
QS_SENDMESSAGE | QS_ALLPOSTMESSAGE | QS_PAINT, wait_flags);
|
||||
res = WAIT_TIMEOUT;
|
||||
|
||||
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 */
|
||||
{
|
||||
|
|
|
@ -2241,7 +2241,6 @@ static void test_CoWaitForMultipleHandles(void)
|
|||
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);
|
||||
todo_wine
|
||||
ok(success, "CoWaitForMultipleHandles unexpectedly pumped messages\n");
|
||||
|
||||
/* test with COWAIT_INPUTAVAILABLE (semaphores are still locked) */
|
||||
|
|
Loading…
Reference in New Issue