2 * Component Object Tests
4 * Copyright 2005 Robert Shearman
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
31 #include "wine/test.h"
33 /* functions that are not present on all versions of Windows */
34 HRESULT (WINAPI
* pCoInitializeEx
)(LPVOID lpReserved
, DWORD dwCoInit
);
36 #define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x\n", hr)
37 #define ok_more_than_one_lock() ok(cLocks > 0, "Number of locks should be > 0, but actually is %d\n", cLocks)
38 #define ok_no_locks() ok(cLocks == 0, "Number of locks should be 0, but actually is %d\n", cLocks)
40 static const CLSID CLSID_non_existent
= { 0x12345678, 0x1234, 0x1234, { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 } };
41 static const CLSID CLSID_CDeviceMoniker
= { 0x4315d437, 0x5b8c, 0x11d0, { 0xbd, 0x3b, 0x00, 0xa0, 0xc9, 0x11, 0xce, 0x86 } };
42 static const WCHAR devicedotone
[] = {'d','e','v','i','c','e','.','1',0};
43 static const WCHAR wszNonExistent
[] = {'N','o','n','E','x','i','s','t','e','n','t',0};
44 static const WCHAR wszCLSID_CDeviceMoniker
[] =
47 '4','3','1','5','d','4','3','7','-',
51 '0','0','a','0','c','9','1','1','c','e','8','6',
55 static const IID IID_IWineTest
=
60 {0xa1, 0xa2, 0x5d, 0x5a, 0x36, 0x54, 0xd3, 0xbd}
61 }; /* 5201163f-8164-4fd0-a1a2-5d5a3654d3bd */
65 static void LockModule(void)
67 InterlockedIncrement(&cLocks
);
70 static void UnlockModule(void)
72 InterlockedDecrement(&cLocks
);
75 static HRESULT WINAPI
Test_IClassFactory_QueryInterface(
80 if (ppvObj
== NULL
) return E_POINTER
;
82 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
83 IsEqualGUID(riid
, &IID_IClassFactory
))
85 *ppvObj
= (LPVOID
)iface
;
86 IClassFactory_AddRef(iface
);
94 static ULONG WINAPI
Test_IClassFactory_AddRef(LPCLASSFACTORY iface
)
97 return 2; /* non-heap-based object */
100 static ULONG WINAPI
Test_IClassFactory_Release(LPCLASSFACTORY iface
)
103 return 1; /* non-heap-based object */
106 static HRESULT WINAPI
Test_IClassFactory_CreateInstance(
107 LPCLASSFACTORY iface
,
113 if (pUnkOuter
) return CLASS_E_NOAGGREGATION
;
114 return E_NOINTERFACE
;
117 static HRESULT WINAPI
Test_IClassFactory_LockServer(
118 LPCLASSFACTORY iface
,
124 static const IClassFactoryVtbl TestClassFactory_Vtbl
=
126 Test_IClassFactory_QueryInterface
,
127 Test_IClassFactory_AddRef
,
128 Test_IClassFactory_Release
,
129 Test_IClassFactory_CreateInstance
,
130 Test_IClassFactory_LockServer
133 static IClassFactory Test_ClassFactory
= { &TestClassFactory_Vtbl
};
135 static void test_ProgIDFromCLSID(void)
138 HRESULT hr
= ProgIDFromCLSID(&CLSID_CDeviceMoniker
, &progid
);
139 ok(hr
== S_OK
, "ProgIDFromCLSID failed with error 0x%08x\n", hr
);
142 ok(!lstrcmpiW(progid
, devicedotone
), "Didn't get expected prog ID\n");
143 CoTaskMemFree(progid
);
146 progid
= (LPWSTR
)0xdeadbeef;
147 hr
= ProgIDFromCLSID(&CLSID_non_existent
, &progid
);
148 ok(hr
== REGDB_E_CLASSNOTREG
, "ProgIDFromCLSID returned %08x\n", hr
);
149 ok(progid
== NULL
, "ProgIDFromCLSID returns with progid %p\n", progid
);
151 hr
= ProgIDFromCLSID(&CLSID_CDeviceMoniker
, NULL
);
152 ok(hr
== E_INVALIDARG
, "ProgIDFromCLSID should return E_INVALIDARG instead of 0x%08x\n", hr
);
155 static void test_CLSIDFromProgID(void)
158 HRESULT hr
= CLSIDFromProgID(devicedotone
, &clsid
);
159 ok(hr
== S_OK
, "CLSIDFromProgID failed with error 0x%08x\n", hr
);
160 ok(IsEqualCLSID(&clsid
, &CLSID_CDeviceMoniker
), "clsid wasn't equal to CLSID_CDeviceMoniker\n");
162 hr
= CLSIDFromString((LPOLESTR
)devicedotone
, &clsid
);
163 ok_ole_success(hr
, "CLSIDFromString");
164 ok(IsEqualCLSID(&clsid
, &CLSID_CDeviceMoniker
), "clsid wasn't equal to CLSID_CDeviceMoniker\n");
166 /* test some failure cases */
168 hr
= CLSIDFromProgID(wszNonExistent
, NULL
);
169 ok(hr
== E_INVALIDARG
, "CLSIDFromProgID should have returned E_INVALIDARG instead of 0x%08x\n", hr
);
171 hr
= CLSIDFromProgID(NULL
, &clsid
);
172 ok(hr
== E_INVALIDARG
, "CLSIDFromProgID should have returned E_INVALIDARG instead of 0x%08x\n", hr
);
174 memset(&clsid
, 0xcc, sizeof(clsid
));
175 hr
= CLSIDFromProgID(wszNonExistent
, &clsid
);
176 ok(hr
== CO_E_CLASSSTRING
, "CLSIDFromProgID on nonexistent ProgID should have returned CO_E_CLASSSTRING instead of 0x%08x\n", hr
);
177 ok(IsEqualCLSID(&clsid
, &CLSID_NULL
), "CLSIDFromProgID should have set clsid to all-zeros on failure\n");
180 static void test_CLSIDFromString(void)
183 HRESULT hr
= CLSIDFromString((LPOLESTR
)wszCLSID_CDeviceMoniker
, &clsid
);
184 ok_ole_success(hr
, "CLSIDFromString");
185 ok(IsEqualCLSID(&clsid
, &CLSID_CDeviceMoniker
), "clsid wasn't equal to CLSID_CDeviceMoniker\n");
187 hr
= CLSIDFromString(NULL
, &clsid
);
188 ok_ole_success(hr
, "CLSIDFromString");
189 ok(IsEqualCLSID(&clsid
, &CLSID_NULL
), "clsid wasn't equal to CLSID_NULL\n");
192 static void test_CoCreateInstance(void)
194 REFCLSID rclsid
= &CLSID_MyComputer
;
195 IUnknown
*pUnk
= (IUnknown
*)0xdeadbeef;
196 HRESULT hr
= CoCreateInstance(rclsid
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IUnknown
, (void **)&pUnk
);
197 ok(hr
== CO_E_NOTINITIALIZED
, "CoCreateInstance should have returned CO_E_NOTINITIALIZED instead of 0x%08x\n", hr
);
198 ok(pUnk
== NULL
, "CoCreateInstance should have changed the passed in pointer to NULL, instead of %p\n", pUnk
);
201 hr
= CoCreateInstance(rclsid
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IUnknown
, (void **)&pUnk
);
202 ok_ole_success(hr
, "CoCreateInstance");
203 IUnknown_Release(pUnk
);
206 hr
= CoCreateInstance(rclsid
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IUnknown
, (void **)&pUnk
);
207 ok(hr
== CO_E_NOTINITIALIZED
, "CoCreateInstance should have returned CO_E_NOTINITIALIZED instead of 0x%08x\n", hr
);
210 static void test_CoGetClassObject(void)
212 IUnknown
*pUnk
= (IUnknown
*)0xdeadbeef;
213 HRESULT hr
= CoGetClassObject(&CLSID_MyComputer
, CLSCTX_INPROC_SERVER
, NULL
, &IID_IUnknown
, (void **)&pUnk
);
214 ok(hr
== CO_E_NOTINITIALIZED
, "CoGetClassObject should have returned CO_E_NOTINITIALIZED instead of 0x%08x\n", hr
);
215 ok(pUnk
== NULL
, "CoGetClassObject should have changed the passed in pointer to NULL, instead of %p\n", pUnk
);
217 hr
= CoGetClassObject(&CLSID_MyComputer
, CLSCTX_INPROC_SERVER
, NULL
, &IID_IUnknown
, NULL
);
218 ok(hr
== E_INVALIDARG
, "CoGetClassObject should have returned E_INVALIDARG instead of 0x%08x\n", hr
);
221 static ATOM
register_dummy_class(void)
229 GetModuleHandle(NULL
),
231 LoadCursor(NULL
, IDC_ARROW
),
232 (HBRUSH
)(COLOR_BTNFACE
+1),
234 TEXT("WineOleTestClass"),
237 return RegisterClass(&wc
);
240 static void test_ole_menu(void)
245 hwndFrame
= CreateWindow(MAKEINTATOM(register_dummy_class()), "Test", 0, CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
, NULL
, NULL
, NULL
, NULL
);
246 hr
= OleSetMenuDescriptor(NULL
, hwndFrame
, NULL
, NULL
, NULL
);
247 todo_wine
ok_ole_success(hr
, "OleSetMenuDescriptor");
249 DestroyWindow(hwndFrame
);
253 static HRESULT WINAPI
MessageFilter_QueryInterface(IMessageFilter
*iface
, REFIID riid
, void ** ppvObj
)
255 if (ppvObj
== NULL
) return E_POINTER
;
257 if (IsEqualGUID(riid
, &IID_IUnknown
) ||
258 IsEqualGUID(riid
, &IID_IClassFactory
))
260 *ppvObj
= (LPVOID
)iface
;
261 IMessageFilter_AddRef(iface
);
265 return E_NOINTERFACE
;
268 static ULONG WINAPI
MessageFilter_AddRef(IMessageFilter
*iface
)
270 return 2; /* non-heap object */
273 static ULONG WINAPI
MessageFilter_Release(IMessageFilter
*iface
)
275 return 1; /* non-heap object */
278 static DWORD WINAPI
MessageFilter_HandleInComingCall(
279 IMessageFilter
*iface
,
281 HTASK threadIDCaller
,
283 LPINTERFACEINFO lpInterfaceInfo
)
285 trace("HandleInComingCall\n");
286 return SERVERCALL_ISHANDLED
;
289 static DWORD WINAPI
MessageFilter_RetryRejectedCall(
290 IMessageFilter
*iface
,
291 HTASK threadIDCallee
,
295 trace("RetryRejectedCall\n");
299 static DWORD WINAPI
MessageFilter_MessagePending(
300 IMessageFilter
*iface
,
301 HTASK threadIDCallee
,
305 trace("MessagePending\n");
306 return PENDINGMSG_WAITNOPROCESS
;
309 static const IMessageFilterVtbl MessageFilter_Vtbl
=
311 MessageFilter_QueryInterface
,
312 MessageFilter_AddRef
,
313 MessageFilter_Release
,
314 MessageFilter_HandleInComingCall
,
315 MessageFilter_RetryRejectedCall
,
316 MessageFilter_MessagePending
319 static IMessageFilter MessageFilter
= { &MessageFilter_Vtbl
};
321 static void test_CoRegisterMessageFilter(void)
324 IMessageFilter
*prev_filter
;
326 hr
= CoRegisterMessageFilter(&MessageFilter
, &prev_filter
);
327 ok(hr
== CO_E_NOT_SUPPORTED
,
328 "CoRegisterMessageFilter should have failed with CO_E_NOT_SUPPORTED instead of 0x%08x\n",
331 pCoInitializeEx(NULL
, COINIT_MULTITHREADED
);
332 prev_filter
= (IMessageFilter
*)0xdeadbeef;
333 hr
= CoRegisterMessageFilter(&MessageFilter
, &prev_filter
);
334 ok(hr
== CO_E_NOT_SUPPORTED
,
335 "CoRegisterMessageFilter should have failed with CO_E_NOT_SUPPORTED instead of 0x%08x\n",
337 ok(prev_filter
== (IMessageFilter
*)0xdeadbeef,
338 "prev_filter should have been set to %p\n", prev_filter
);
341 pCoInitializeEx(NULL
, COINIT_APARTMENTTHREADED
);
343 hr
= CoRegisterMessageFilter(NULL
, NULL
);
344 ok_ole_success(hr
, "CoRegisterMessageFilter");
346 prev_filter
= (IMessageFilter
*)0xdeadbeef;
347 hr
= CoRegisterMessageFilter(NULL
, &prev_filter
);
348 ok_ole_success(hr
, "CoRegisterMessageFilter");
349 ok(prev_filter
== NULL
, "prev_filter should have been set to NULL instead of %p\n", prev_filter
);
351 hr
= CoRegisterMessageFilter(&MessageFilter
, &prev_filter
);
352 ok_ole_success(hr
, "CoRegisterMessageFilter");
353 ok(prev_filter
== NULL
, "prev_filter should have been set to NULL instead of %p\n", prev_filter
);
355 hr
= CoRegisterMessageFilter(NULL
, NULL
);
356 ok_ole_success(hr
, "CoRegisterMessageFilter");
361 static HRESULT WINAPI
Test_IUnknown_QueryInterface(
366 if (ppvObj
== NULL
) return E_POINTER
;
368 if (IsEqualIID(riid
, &IID_IUnknown
) ||
369 IsEqualIID(riid
, &IID_IWineTest
))
371 *ppvObj
= (LPVOID
)iface
;
372 IUnknown_AddRef(iface
);
377 return E_NOINTERFACE
;
380 static ULONG WINAPI
Test_IUnknown_AddRef(LPUNKNOWN iface
)
382 return 2; /* non-heap-based object */
385 static ULONG WINAPI
Test_IUnknown_Release(LPUNKNOWN iface
)
387 return 1; /* non-heap-based object */
390 static const IUnknownVtbl TestUnknown_Vtbl
=
392 Test_IUnknown_QueryInterface
,
393 Test_IUnknown_AddRef
,
394 Test_IUnknown_Release
,
397 static IUnknown Test_Unknown
= { &TestUnknown_Vtbl
};
399 static HRESULT WINAPI
PSFactoryBuffer_QueryInterface(
400 IPSFactoryBuffer
* This
,
401 /* [in] */ REFIID riid
,
402 /* [iid_is][out] */ void **ppvObject
)
404 if (IsEqualIID(riid
, &IID_IUnknown
) ||
405 IsEqualIID(riid
, &IID_IPSFactoryBuffer
))
408 IPSFactoryBuffer_AddRef(This
);
411 return E_NOINTERFACE
;
414 static ULONG WINAPI
PSFactoryBuffer_AddRef(
415 IPSFactoryBuffer
* This
)
420 static ULONG WINAPI
PSFactoryBuffer_Release(
421 IPSFactoryBuffer
* This
)
426 static HRESULT WINAPI
PSFactoryBuffer_CreateProxy(
427 IPSFactoryBuffer
* This
,
428 /* [in] */ IUnknown
*pUnkOuter
,
429 /* [in] */ REFIID riid
,
430 /* [out] */ IRpcProxyBuffer
**ppProxy
,
431 /* [out] */ void **ppv
)
436 static HRESULT WINAPI
PSFactoryBuffer_CreateStub(
437 IPSFactoryBuffer
* This
,
438 /* [in] */ REFIID riid
,
439 /* [unique][in] */ IUnknown
*pUnkServer
,
440 /* [out] */ IRpcStubBuffer
**ppStub
)
445 static IPSFactoryBufferVtbl PSFactoryBufferVtbl
=
447 PSFactoryBuffer_QueryInterface
,
448 PSFactoryBuffer_AddRef
,
449 PSFactoryBuffer_Release
,
450 PSFactoryBuffer_CreateProxy
,
451 PSFactoryBuffer_CreateStub
454 static IPSFactoryBuffer PSFactoryBuffer
= { &PSFactoryBufferVtbl
};
456 static const CLSID CLSID_WineTestPSFactoryBuffer
=
461 {0xa1, 0xa2, 0x5d, 0x5a, 0x36, 0x54, 0xd3, 0xbd}
462 }; /* 52011640-8164-4fd0-a1a2-5d5a3654d3bd */
464 static void test_CoRegisterPSClsid(void)
467 DWORD dwRegistrationKey
;
471 hr
= CoRegisterPSClsid(&IID_IWineTest
, &CLSID_WineTestPSFactoryBuffer
);
472 ok(hr
== CO_E_NOTINITIALIZED
, "CoRegisterPSClsid should have returened CO_E_NOTINITIALIZED instead of 0x%08x\n", hr
);
474 pCoInitializeEx(NULL
, COINIT_APARTMENTTHREADED
);
476 hr
= CoRegisterClassObject(&CLSID_WineTestPSFactoryBuffer
, (IUnknown
*)&PSFactoryBuffer
,
477 CLSCTX_INPROC_SERVER
, REGCLS_MULTIPLEUSE
, &dwRegistrationKey
);
478 ok_ole_success(hr
, "CoRegisterClassObject");
480 hr
= CoRegisterPSClsid(&IID_IWineTest
, &CLSID_WineTestPSFactoryBuffer
);
481 ok_ole_success(hr
, "CoRegisterPSClsid");
483 hr
= CreateStreamOnHGlobal(NULL
, TRUE
, &stream
);
484 ok_ole_success(hr
, "CreateStreamOnHGlobal");
486 hr
= CoMarshalInterface(stream
, &IID_IWineTest
, (IUnknown
*)&Test_Unknown
, MSHCTX_INPROC
, NULL
, MSHLFLAGS_NORMAL
);
487 ok(hr
== E_NOTIMPL
, "CoMarshalInterface should have returned E_NOTIMPL instead of 0x%08x\n", hr
);
488 IStream_Release(stream
);
490 hr
= CoRevokeClassObject(dwRegistrationKey
);
491 ok_ole_success(hr
, "CoRevokeClassObject");
495 pCoInitializeEx(NULL
, COINIT_APARTMENTTHREADED
);
497 hr
= CoGetPSClsid(&IID_IWineTest
, &clsid
);
498 ok(hr
== REGDB_E_IIDNOTREG
, "CoGetPSClsid should have returned REGDB_E_IIDNOTREG instead of 0x%08x\n", hr
);
503 static void test_CoGetPSClsid(void)
508 hr
= CoGetPSClsid(&IID_IClassFactory
, &clsid
);
509 ok(hr
== CO_E_NOTINITIALIZED
,
510 "CoGetPSClsid should have returned CO_E_NOTINITIALIZED instead of 0x%08x\n",
513 pCoInitializeEx(NULL
, COINIT_APARTMENTTHREADED
);
515 hr
= CoGetPSClsid(&IID_IClassFactory
, &clsid
);
516 ok_ole_success(hr
, "CoGetPSClsid");
518 hr
= CoGetPSClsid(&IID_IWineTest
, &clsid
);
519 ok(hr
== REGDB_E_IIDNOTREG
,
520 "CoGetPSClsid for random IID returned 0x%08x instead of REGDB_E_IIDNOTREG\n",
523 hr
= CoGetPSClsid(&IID_IClassFactory
, NULL
);
524 ok(hr
== E_INVALIDARG
,
525 "CoGetPSClsid for null clsid returned 0x%08x instead of E_INVALIDARG\n",
531 /* basic test, mainly for invalid arguments. see marshal.c for more */
532 static void test_CoUnmarshalInterface(void)
538 hr
= CoUnmarshalInterface(NULL
, &IID_IUnknown
, (void **)&pProxy
);
539 ok(hr
== E_INVALIDARG
, "CoUnmarshalInterface should have returned E_INVALIDARG instead of 0x%08x\n", hr
);
541 hr
= CreateStreamOnHGlobal(NULL
, TRUE
, &pStream
);
542 ok_ole_success(hr
, "CreateStreamOnHGlobal");
544 hr
= CoUnmarshalInterface(pStream
, &IID_IUnknown
, (void **)&pProxy
);
545 ok(hr
== STG_E_READFAULT
, "CoUnmarshalInterface should have returned STG_E_READFAULT instead of 0x%08x\n", hr
);
547 hr
= CoUnmarshalInterface(pStream
, &IID_IUnknown
, NULL
);
548 ok(hr
== E_INVALIDARG
, "CoUnmarshalInterface should have returned E_INVALIDARG instead of 0x%08x\n", hr
);
550 IStream_Release(pStream
);
553 static void test_CoGetInterfaceAndReleaseStream(void)
558 pCoInitializeEx(NULL
, COINIT_APARTMENTTHREADED
);
560 hr
= CoGetInterfaceAndReleaseStream(NULL
, &IID_IUnknown
, (void**)&pUnk
);
561 ok(hr
== E_INVALIDARG
, "hr %08x\n", hr
);
566 /* basic test, mainly for invalid arguments. see marshal.c for more */
567 static void test_CoMarshalInterface(void)
571 static const LARGE_INTEGER llZero
;
573 pCoInitializeEx(NULL
, COINIT_APARTMENTTHREADED
);
575 hr
= CreateStreamOnHGlobal(NULL
, TRUE
, &pStream
);
576 ok_ole_success(hr
, "CreateStreamOnHGlobal");
578 hr
= CoMarshalInterface(pStream
, &IID_IUnknown
, NULL
, MSHCTX_INPROC
, NULL
, MSHLFLAGS_NORMAL
);
579 ok(hr
== E_INVALIDARG
, "CoMarshalInterface should have returned E_INVALIDARG instead of 0x%08x\n", hr
);
581 hr
= CoMarshalInterface(NULL
, &IID_IUnknown
, (IUnknown
*)&Test_ClassFactory
, MSHCTX_INPROC
, NULL
, MSHLFLAGS_NORMAL
);
582 ok(hr
== E_INVALIDARG
, "CoMarshalInterface should have returned E_INVALIDARG instead of 0x%08x\n", hr
);
584 hr
= CoMarshalInterface(pStream
, &IID_IUnknown
, (IUnknown
*)&Test_ClassFactory
, MSHCTX_INPROC
, NULL
, MSHLFLAGS_NORMAL
);
585 ok_ole_success(hr
, "CoMarshalInterface");
587 /* stream not rewound */
588 hr
= CoReleaseMarshalData(pStream
);
589 ok(hr
== STG_E_READFAULT
, "CoReleaseMarshalData should have returned STG_E_READFAULT instead of 0x%08x\n", hr
);
591 hr
= IStream_Seek(pStream
, llZero
, STREAM_SEEK_SET
, NULL
);
592 ok_ole_success(hr
, "IStream_Seek");
594 hr
= CoReleaseMarshalData(pStream
);
595 ok_ole_success(hr
, "CoReleaseMarshalData");
597 IStream_Release(pStream
);
602 static void test_CoMarshalInterThreadInterfaceInStream(void)
606 IClassFactory
*pProxy
;
608 pCoInitializeEx(NULL
, COINIT_APARTMENTTHREADED
);
612 hr
= CoMarshalInterThreadInterfaceInStream(&IID_IUnknown
, (IUnknown
*)&Test_ClassFactory
, NULL
);
613 ok(hr
== E_INVALIDARG
, "CoMarshalInterThreadInterfaceInStream should have returned E_INVALIDARG instead of 0x%08x\n", hr
);
615 hr
= CoMarshalInterThreadInterfaceInStream(&IID_IUnknown
, NULL
, &pStream
);
616 ok(hr
== E_INVALIDARG
, "CoMarshalInterThreadInterfaceInStream should have returned E_INVALIDARG instead of 0x%08x\n", hr
);
620 hr
= CoMarshalInterThreadInterfaceInStream(&IID_IUnknown
, (IUnknown
*)&Test_ClassFactory
, &pStream
);
621 ok_ole_success(hr
, "CoMarshalInterThreadInterfaceInStream");
623 ok_more_than_one_lock();
625 hr
= CoUnmarshalInterface(pStream
, &IID_IClassFactory
, (void **)&pProxy
);
626 ok_ole_success(hr
, "CoUnmarshalInterface");
628 IClassFactory_Release(pProxy
);
637 HMODULE hOle32
= GetModuleHandle("ole32");
638 if (!(pCoInitializeEx
= (void*)GetProcAddress(hOle32
, "CoInitializeEx")))
640 trace("You need DCOM95 installed to run this test\n");
644 test_ProgIDFromCLSID();
645 test_CLSIDFromProgID();
646 test_CLSIDFromString();
647 test_CoCreateInstance();
649 test_CoGetClassObject();
650 test_CoRegisterMessageFilter();
651 test_CoRegisterPSClsid();
653 test_CoUnmarshalInterface();
654 test_CoGetInterfaceAndReleaseStream();
655 test_CoMarshalInterface();
656 test_CoMarshalInterThreadInterfaceInStream();