static DWORD CALLBACK host_object_proc(LPVOID p) { struct host_object_data *data = p; HRESULT hr; MSG msg; CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); if (data->filter) { IMessageFilter * prev_filter = NULL; hr = CoRegisterMessageFilter(data->filter, &prev_filter); if (prev_filter) IMessageFilter_Release(prev_filter); ok_ole_success(hr, CoRegisterMessageFilter); } hr = CoMarshalInterface(data->stream, &data->iid, data->object, MSHCTX_INPROC, NULL, data->marshal_flags); ok_ole_success(hr, CoMarshalInterface); /* force the message queue to be created before signaling parent thread */ PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); SetEvent(data->marshal_event); while (GetMessage(&msg, NULL, 0, 0)) { if (msg.hwnd == NULL && msg.message == RELEASEMARSHALDATA) { trace("releasing marshal data\n"); CoReleaseMarshalData(data->stream); SetEvent((HANDLE)msg.lParam); } else DispatchMessage(&msg); } HeapFree(GetProcessHeap(), 0, data); CoUninitialize(); return hr; }
static void test_CoRegisterMessageFilter(void) { HRESULT hr; IMessageFilter *prev_filter; #if 0 /* crashes without an apartment! */ hr = CoRegisterMessageFilter(&MessageFilter, &prev_filter); #endif pCoInitializeEx(NULL, COINIT_MULTITHREADED); prev_filter = (IMessageFilter *)0xdeadbeef; hr = CoRegisterMessageFilter(&MessageFilter, &prev_filter); ok(hr == CO_E_NOT_SUPPORTED, "CoRegisterMessageFilter should have failed with CO_E_NOT_SUPPORTED instead of 0x%08lx\n", hr); ok(prev_filter == (IMessageFilter *)0xdeadbeef, "prev_filter should have been set to %p\n", prev_filter); CoUninitialize(); pCoInitializeEx(NULL, COINIT_APARTMENTTHREADED); hr = CoRegisterMessageFilter(NULL, NULL); ok_ole_success(hr, "CoRegisterMessageFilter"); prev_filter = (IMessageFilter *)0xdeadbeef; hr = CoRegisterMessageFilter(NULL, &prev_filter); ok_ole_success(hr, "CoRegisterMessageFilter"); ok(prev_filter == NULL, "prev_filter should have been set to NULL instead of %p\n", prev_filter); hr = CoRegisterMessageFilter(&MessageFilter, &prev_filter); ok_ole_success(hr, "CoRegisterMessageFilter"); ok(prev_filter == NULL, "prev_filter should have been set to NULL instead of %p\n", prev_filter); hr = CoRegisterMessageFilter(NULL, NULL); ok_ole_success(hr, "CoRegisterMessageFilter"); CoUninitialize(); }