2 * Object Linking and Embedding 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 #define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x\n", hr)
35 static IPersistStorage OleObjectPersistStg;
36 static IOleCache *cache;
37 static IRunnableObject *runnable;
39 static const CLSID CLSID_WineTest =
40 { /* 9474ba1a-258b-490b-bc13-516e9239ace0 */
44 {0xbc, 0x13, 0x51, 0x6e, 0x92, 0x39, 0xac, 0xe0}
47 #define TEST_OPTIONAL 0x1
49 struct expected_method
55 static const struct expected_method *expected_method_list;
56 static FORMATETC *g_expected_fetc = NULL;
58 static BOOL g_showRunnable = TRUE;
59 static BOOL g_isRunning = TRUE;
60 static BOOL g_failGetMiscStatus;
62 #define CHECK_EXPECTED_METHOD(method_name) \
64 trace("%s\n", method_name); \
65 ok(expected_method_list->method != NULL, "Extra method %s called\n", method_name); \
66 if (expected_method_list->method) \
68 while (expected_method_list->flags & TEST_OPTIONAL && \
69 strcmp(expected_method_list->method, method_name) != 0) \
70 expected_method_list++; \
71 ok(!strcmp(expected_method_list->method, method_name), "Expected %s to be called instead of %s\n", \
72 expected_method_list->method, method_name); \
73 expected_method_list++; \
77 #define CHECK_NO_EXTRA_METHODS() \
79 while (expected_method_list->flags & TEST_OPTIONAL) \
80 expected_method_list++; \
81 ok(!expected_method_list->method, "Method sequence starting from %s not called\n", expected_method_list->method); \
84 static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **ppv)
86 CHECK_EXPECTED_METHOD("OleObject_QueryInterface");
90 if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IOleObject))
92 else if (IsEqualIID(riid, &IID_IPersistStorage))
93 *ppv = &OleObjectPersistStg;
94 else if (IsEqualIID(riid, &IID_IOleCache))
96 else if (IsEqualIID(riid, &IID_IRunnableObject) && g_showRunnable)
100 IUnknown_AddRef((IUnknown*)*ppv);
104 trace("OleObject_QueryInterface: returning E_NOINTERFACE\n");
105 return E_NOINTERFACE;
108 static ULONG WINAPI OleObject_AddRef(IOleObject *iface)
110 CHECK_EXPECTED_METHOD("OleObject_AddRef");
114 static ULONG WINAPI OleObject_Release(IOleObject *iface)
116 CHECK_EXPECTED_METHOD("OleObject_Release");
120 static HRESULT WINAPI OleObject_SetClientSite
123 IOleClientSite *pClientSite
126 CHECK_EXPECTED_METHOD("OleObject_SetClientSite");
130 static HRESULT WINAPI OleObject_GetClientSite
133 IOleClientSite **ppClientSite
136 CHECK_EXPECTED_METHOD("OleObject_GetClientSite");
140 static HRESULT WINAPI OleObject_SetHostNames
143 LPCOLESTR szContainerApp,
144 LPCOLESTR szContainerObj
147 CHECK_EXPECTED_METHOD("OleObject_SetHostNames");
151 static HRESULT WINAPI OleObject_Close
157 CHECK_EXPECTED_METHOD("OleObject_Close");
161 static HRESULT WINAPI OleObject_SetMoniker
164 DWORD dwWhichMoniker,
168 CHECK_EXPECTED_METHOD("OleObject_SetMoniker");
172 static HRESULT WINAPI OleObject_GetMoniker
176 DWORD dwWhichMoniker,
180 CHECK_EXPECTED_METHOD("OleObject_GetMoniker");
184 static HRESULT WINAPI OleObject_InitFromData
187 IDataObject *pDataObject,
192 CHECK_EXPECTED_METHOD("OleObject_InitFromData");
196 static HRESULT WINAPI OleObject_GetClipboardData
200 IDataObject **ppDataObject
203 CHECK_EXPECTED_METHOD("OleObject_GetClipboardData");
207 static HRESULT WINAPI OleObject_DoVerb
212 IOleClientSite *pActiveSite,
218 CHECK_EXPECTED_METHOD("OleObject_DoVerb");
222 static HRESULT WINAPI OleObject_EnumVerbs
225 IEnumOLEVERB **ppEnumOleVerb
228 CHECK_EXPECTED_METHOD("OleObject_EnumVerbs");
232 static HRESULT WINAPI OleObject_Update
237 CHECK_EXPECTED_METHOD("OleObject_Update");
241 static HRESULT WINAPI OleObject_IsUpToDate
246 CHECK_EXPECTED_METHOD("OleObject_IsUpToDate");
250 static HRESULT WINAPI OleObject_GetUserClassID
256 CHECK_EXPECTED_METHOD("OleObject_GetUserClassID");
260 static HRESULT WINAPI OleObject_GetUserType
264 LPOLESTR *pszUserType
267 CHECK_EXPECTED_METHOD("OleObject_GetUserType");
271 static HRESULT WINAPI OleObject_SetExtent
278 CHECK_EXPECTED_METHOD("OleObject_SetExtent");
282 static HRESULT WINAPI OleObject_GetExtent
289 CHECK_EXPECTED_METHOD("OleObject_GetExtent");
293 static HRESULT WINAPI OleObject_Advise
296 IAdviseSink *pAdvSink,
300 CHECK_EXPECTED_METHOD("OleObject_Advise");
304 static HRESULT WINAPI OleObject_Unadvise
310 CHECK_EXPECTED_METHOD("OleObject_Unadvise");
314 static HRESULT WINAPI OleObject_EnumAdvise
317 IEnumSTATDATA **ppenumAdvise
320 CHECK_EXPECTED_METHOD("OleObject_EnumAdvise");
324 static HRESULT WINAPI OleObject_GetMiscStatus
331 CHECK_EXPECTED_METHOD("OleObject_GetMiscStatus");
332 if(!g_failGetMiscStatus)
334 *pdwStatus = OLEMISC_RECOMPOSEONRESIZE;
344 static HRESULT WINAPI OleObject_SetColorScheme
350 CHECK_EXPECTED_METHOD("OleObject_SetColorScheme");
354 static const IOleObjectVtbl OleObjectVtbl =
356 OleObject_QueryInterface,
359 OleObject_SetClientSite,
360 OleObject_GetClientSite,
361 OleObject_SetHostNames,
363 OleObject_SetMoniker,
364 OleObject_GetMoniker,
365 OleObject_InitFromData,
366 OleObject_GetClipboardData,
370 OleObject_IsUpToDate,
371 OleObject_GetUserClassID,
372 OleObject_GetUserType,
377 OleObject_EnumAdvise,
378 OleObject_GetMiscStatus,
379 OleObject_SetColorScheme
382 static IOleObject OleObject = { &OleObjectVtbl };
384 static HRESULT WINAPI OleObjectPersistStg_QueryInterface(IPersistStorage *iface, REFIID riid, void **ppv)
386 trace("OleObjectPersistStg_QueryInterface\n");
387 return IUnknown_QueryInterface((IUnknown *)&OleObject, riid, ppv);
390 static ULONG WINAPI OleObjectPersistStg_AddRef(IPersistStorage *iface)
392 CHECK_EXPECTED_METHOD("OleObjectPersistStg_AddRef");
396 static ULONG WINAPI OleObjectPersistStg_Release(IPersistStorage *iface)
398 CHECK_EXPECTED_METHOD("OleObjectPersistStg_Release");
402 static HRESULT WINAPI OleObjectPersistStg_GetClassId(IPersistStorage *iface, CLSID *clsid)
404 CHECK_EXPECTED_METHOD("OleObjectPersistStg_GetClassId");
408 static HRESULT WINAPI OleObjectPersistStg_IsDirty
410 IPersistStorage *iface
413 CHECK_EXPECTED_METHOD("OleObjectPersistStg_IsDirty");
417 static HRESULT WINAPI OleObjectPersistStg_InitNew
419 IPersistStorage *iface,
423 CHECK_EXPECTED_METHOD("OleObjectPersistStg_InitNew");
427 static HRESULT WINAPI OleObjectPersistStg_Load
429 IPersistStorage *iface,
433 CHECK_EXPECTED_METHOD("OleObjectPersistStg_Load");
437 static HRESULT WINAPI OleObjectPersistStg_Save
439 IPersistStorage *iface,
444 CHECK_EXPECTED_METHOD("OleObjectPersistStg_Save");
448 static HRESULT WINAPI OleObjectPersistStg_SaveCompleted
450 IPersistStorage *iface,
454 CHECK_EXPECTED_METHOD("OleObjectPersistStg_SaveCompleted");
458 static HRESULT WINAPI OleObjectPersistStg_HandsOffStorage
460 IPersistStorage *iface
463 CHECK_EXPECTED_METHOD("OleObjectPersistStg_HandsOffStorage");
467 static const IPersistStorageVtbl OleObjectPersistStgVtbl =
469 OleObjectPersistStg_QueryInterface,
470 OleObjectPersistStg_AddRef,
471 OleObjectPersistStg_Release,
472 OleObjectPersistStg_GetClassId,
473 OleObjectPersistStg_IsDirty,
474 OleObjectPersistStg_InitNew,
475 OleObjectPersistStg_Load,
476 OleObjectPersistStg_Save,
477 OleObjectPersistStg_SaveCompleted,
478 OleObjectPersistStg_HandsOffStorage
481 static IPersistStorage OleObjectPersistStg = { &OleObjectPersistStgVtbl };
483 static HRESULT WINAPI OleObjectCache_QueryInterface(IOleCache *iface, REFIID riid, void **ppv)
485 return IUnknown_QueryInterface((IUnknown *)&OleObject, riid, ppv);
488 static ULONG WINAPI OleObjectCache_AddRef(IOleCache *iface)
490 CHECK_EXPECTED_METHOD("OleObjectCache_AddRef");
494 static ULONG WINAPI OleObjectCache_Release(IOleCache *iface)
496 CHECK_EXPECTED_METHOD("OleObjectCache_Release");
500 static HRESULT WINAPI OleObjectCache_Cache
503 FORMATETC *pformatetc,
508 CHECK_EXPECTED_METHOD("OleObjectCache_Cache");
509 if (g_expected_fetc) {
510 ok(pformatetc != NULL, "pformatetc should not be NULL\n");
512 ok(pformatetc->cfFormat == g_expected_fetc->cfFormat,
513 "cfFormat: %x\n", pformatetc->cfFormat);
514 ok((pformatetc->ptd != NULL) == (g_expected_fetc->ptd != NULL),
515 "ptd: %p\n", pformatetc->ptd);
516 ok(pformatetc->dwAspect == g_expected_fetc->dwAspect,
517 "dwAspect: %x\n", pformatetc->dwAspect);
518 ok(pformatetc->lindex == g_expected_fetc->lindex,
519 "lindex: %x\n", pformatetc->lindex);
520 ok(pformatetc->tymed == g_expected_fetc->tymed,
521 "tymed: %x\n", pformatetc->tymed);
524 ok(pformatetc == NULL, "pformatetc should be NULL\n");
528 static HRESULT WINAPI OleObjectCache_Uncache
534 CHECK_EXPECTED_METHOD("OleObjectCache_Uncache");
538 static HRESULT WINAPI OleObjectCache_EnumCache
541 IEnumSTATDATA **ppenumSTATDATA
544 CHECK_EXPECTED_METHOD("OleObjectCache_EnumCache");
549 static HRESULT WINAPI OleObjectCache_InitCache
552 IDataObject *pDataObject
555 CHECK_EXPECTED_METHOD("OleObjectCache_InitCache");
560 static HRESULT WINAPI OleObjectCache_SetData
563 FORMATETC *pformatetc,
568 CHECK_EXPECTED_METHOD("OleObjectCache_SetData");
573 static const IOleCacheVtbl OleObjectCacheVtbl =
575 OleObjectCache_QueryInterface,
576 OleObjectCache_AddRef,
577 OleObjectCache_Release,
578 OleObjectCache_Cache,
579 OleObjectCache_Uncache,
580 OleObjectCache_EnumCache,
581 OleObjectCache_InitCache,
582 OleObjectCache_SetData
585 static IOleCache OleObjectCache = { &OleObjectCacheVtbl };
587 static HRESULT WINAPI OleObjectCF_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
589 if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IClassFactory))
592 IUnknown_AddRef(iface);
596 return E_NOINTERFACE;
599 static ULONG WINAPI OleObjectCF_AddRef(IClassFactory *iface)
604 static ULONG WINAPI OleObjectCF_Release(IClassFactory *iface)
609 static HRESULT WINAPI OleObjectCF_CreateInstance(IClassFactory *iface, IUnknown *punkOuter, REFIID riid, void **ppv)
611 return IUnknown_QueryInterface((IUnknown *)&OleObject, riid, ppv);
614 static HRESULT WINAPI OleObjectCF_LockServer(IClassFactory *iface, BOOL lock)
619 static const IClassFactoryVtbl OleObjectCFVtbl =
621 OleObjectCF_QueryInterface,
624 OleObjectCF_CreateInstance,
625 OleObjectCF_LockServer
628 static IClassFactory OleObjectCF = { &OleObjectCFVtbl };
630 static HRESULT WINAPI OleObjectRunnable_QueryInterface(IRunnableObject *iface, REFIID riid, void **ppv)
632 return IUnknown_QueryInterface((IUnknown *)&OleObject, riid, ppv);
635 static ULONG WINAPI OleObjectRunnable_AddRef(IRunnableObject *iface)
637 CHECK_EXPECTED_METHOD("OleObjectRunnable_AddRef");
641 static ULONG WINAPI OleObjectRunnable_Release(IRunnableObject *iface)
643 CHECK_EXPECTED_METHOD("OleObjectRunnable_Release");
647 static HRESULT WINAPI OleObjectRunnable_GetRunningClass(
648 IRunnableObject *iface,
651 CHECK_EXPECTED_METHOD("OleObjectRunnable_GetRunningClass");
655 static HRESULT WINAPI OleObjectRunnable_Run(
656 IRunnableObject *iface,
659 CHECK_EXPECTED_METHOD("OleObjectRunnable_Run");
663 static BOOL WINAPI OleObjectRunnable_IsRunning(IRunnableObject *iface)
665 CHECK_EXPECTED_METHOD("OleObjectRunnable_IsRunning");
669 static HRESULT WINAPI OleObjectRunnable_LockRunning(
670 IRunnableObject *iface,
672 BOOL fLastUnlockCloses)
674 CHECK_EXPECTED_METHOD("OleObjectRunnable_LockRunning");
678 static HRESULT WINAPI OleObjectRunnable_SetContainedObject(
679 IRunnableObject *iface,
682 CHECK_EXPECTED_METHOD("OleObjectRunnable_SetContainedObject");
686 static const IRunnableObjectVtbl OleObjectRunnableVtbl =
688 OleObjectRunnable_QueryInterface,
689 OleObjectRunnable_AddRef,
690 OleObjectRunnable_Release,
691 OleObjectRunnable_GetRunningClass,
692 OleObjectRunnable_Run,
693 OleObjectRunnable_IsRunning,
694 OleObjectRunnable_LockRunning,
695 OleObjectRunnable_SetContainedObject
698 static IRunnableObject OleObjectRunnable = { &OleObjectRunnableVtbl };
700 static const CLSID CLSID_Equation3 = {0x0002CE02, 0x0000, 0x0000, {0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46} };
702 static void test_OleCreate(IStorage *pStorage)
707 static const struct expected_method methods_olerender_none[] =
709 { "OleObject_QueryInterface", 0 },
710 { "OleObject_AddRef", 0 },
711 { "OleObject_QueryInterface", 0 },
712 { "OleObject_AddRef", TEST_OPTIONAL },
713 { "OleObject_Release", TEST_OPTIONAL },
714 { "OleObject_QueryInterface", TEST_OPTIONAL },
715 { "OleObjectPersistStg_AddRef", 0 },
716 { "OleObjectPersistStg_InitNew", 0 },
717 { "OleObjectPersistStg_Release", 0 },
718 { "OleObject_Release", 0 },
719 { "OleObject_Release", TEST_OPTIONAL },
722 static const struct expected_method methods_olerender_draw[] =
724 { "OleObject_QueryInterface", 0 },
725 { "OleObject_AddRef", 0 },
726 { "OleObject_QueryInterface", 0 },
727 { "OleObject_AddRef", TEST_OPTIONAL /* NT4 only */ },
728 { "OleObject_Release", TEST_OPTIONAL /* NT4 only */ },
729 { "OleObject_QueryInterface", TEST_OPTIONAL /* NT4 only */ },
730 { "OleObjectPersistStg_AddRef", 0 },
731 { "OleObjectPersistStg_InitNew", 0 },
732 { "OleObjectPersistStg_Release", 0 },
733 { "OleObject_QueryInterface", 0 },
734 { "OleObjectRunnable_AddRef", 0 },
735 { "OleObjectRunnable_Run", 0 },
736 { "OleObjectRunnable_Release", 0 },
737 { "OleObject_QueryInterface", 0 },
738 { "OleObjectCache_AddRef", 0 },
739 { "OleObjectCache_Cache", 0 },
740 { "OleObjectCache_Release", 0 },
741 { "OleObject_Release", 0 },
742 { "OleObject_Release", TEST_OPTIONAL /* NT4 only */ },
745 static const struct expected_method methods_olerender_format[] =
747 { "OleObject_QueryInterface", 0 },
748 { "OleObject_AddRef", 0 },
749 { "OleObject_QueryInterface", 0 },
750 { "OleObject_AddRef", 0 },
751 { "OleObject_GetMiscStatus", 0 },
752 { "OleObject_QueryInterface", 0 },
753 { "OleObjectPersistStg_AddRef", 0 },
754 { "OleObjectPersistStg_InitNew", 0 },
755 { "OleObjectPersistStg_Release", 0 },
756 { "OleObject_SetClientSite", 0 },
757 { "OleObject_Release", 0 },
758 { "OleObject_QueryInterface", 0 },
759 { "OleObjectRunnable_AddRef", 0 },
760 { "OleObjectRunnable_Run", 0 },
761 { "OleObjectRunnable_Release", 0 },
762 { "OleObject_QueryInterface", 0 },
763 { "OleObjectCache_AddRef", 0 },
764 { "OleObjectCache_Cache", 0 },
765 { "OleObjectCache_Release", 0 },
766 { "OleObject_Release", 0 },
769 static const struct expected_method methods_olerender_asis[] =
771 { "OleObject_QueryInterface", 0 },
772 { "OleObject_AddRef", 0 },
773 { "OleObject_QueryInterface", 0 },
774 { "OleObject_AddRef", TEST_OPTIONAL /* NT4 only */ },
775 { "OleObject_Release", TEST_OPTIONAL /* NT4 only */ },
776 { "OleObject_QueryInterface", TEST_OPTIONAL /* NT4 only */ },
777 { "OleObjectPersistStg_AddRef", 0 },
778 { "OleObjectPersistStg_InitNew", 0 },
779 { "OleObjectPersistStg_Release", 0 },
780 { "OleObject_Release", 0 },
781 { "OleObject_Release", TEST_OPTIONAL /* NT4 only */ },
784 static const struct expected_method methods_olerender_draw_no_runnable[] =
786 { "OleObject_QueryInterface", 0 },
787 { "OleObject_AddRef", 0 },
788 { "OleObject_QueryInterface", 0 },
789 { "OleObject_AddRef", TEST_OPTIONAL /* NT4 only */ },
790 { "OleObject_Release", TEST_OPTIONAL /* NT4 only */ },
791 { "OleObject_QueryInterface", TEST_OPTIONAL /* NT4 only */ },
792 { "OleObjectPersistStg_AddRef", 0 },
793 { "OleObjectPersistStg_InitNew", 0 },
794 { "OleObjectPersistStg_Release", 0 },
795 { "OleObject_QueryInterface", 0 },
796 { "OleObject_QueryInterface", 0 },
797 { "OleObjectCache_AddRef", 0 },
798 { "OleObjectCache_Cache", 0 },
799 { "OleObjectCache_Release", 0 },
800 { "OleObject_Release", 0 },
801 { "OleObject_Release", TEST_OPTIONAL /* NT4 only */ },
804 static const struct expected_method methods_olerender_draw_no_cache[] =
806 { "OleObject_QueryInterface", 0 },
807 { "OleObject_AddRef", 0 },
808 { "OleObject_QueryInterface", 0 },
809 { "OleObject_AddRef", TEST_OPTIONAL /* NT4 only */ },
810 { "OleObject_Release", TEST_OPTIONAL /* NT4 only */ },
811 { "OleObject_QueryInterface", TEST_OPTIONAL /* NT4 only */ },
812 { "OleObjectPersistStg_AddRef", 0 },
813 { "OleObjectPersistStg_InitNew", 0 },
814 { "OleObjectPersistStg_Release", 0 },
815 { "OleObject_QueryInterface", 0 },
816 { "OleObjectRunnable_AddRef", 0 },
817 { "OleObjectRunnable_Run", 0 },
818 { "OleObjectRunnable_Release", 0 },
819 { "OleObject_QueryInterface", 0 },
820 { "OleObject_Release", 0 },
821 { "OleObject_Release", TEST_OPTIONAL /* NT4 only */ },
825 g_expected_fetc = &formatetc;
826 formatetc.cfFormat = 0;
827 formatetc.ptd = NULL;
828 formatetc.dwAspect = DVASPECT_CONTENT;
829 formatetc.lindex = -1;
830 formatetc.tymed = TYMED_NULL;
831 runnable = &OleObjectRunnable;
832 cache = &OleObjectCache;
833 expected_method_list = methods_olerender_none;
834 trace("OleCreate with OLERENDER_NONE:\n");
835 hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_NONE, NULL, NULL, pStorage, (void **)&pObject);
836 ok_ole_success(hr, "OleCreate");
837 IOleObject_Release(pObject);
838 CHECK_NO_EXTRA_METHODS();
840 expected_method_list = methods_olerender_draw;
841 trace("OleCreate with OLERENDER_DRAW:\n");
842 hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_DRAW, NULL, NULL, pStorage, (void **)&pObject);
843 ok_ole_success(hr, "OleCreate");
844 IOleObject_Release(pObject);
845 CHECK_NO_EXTRA_METHODS();
847 formatetc.cfFormat = CF_TEXT;
848 formatetc.ptd = NULL;
849 formatetc.dwAspect = DVASPECT_CONTENT;
850 formatetc.lindex = -1;
851 formatetc.tymed = TYMED_HGLOBAL;
852 expected_method_list = methods_olerender_format;
853 trace("OleCreate with OLERENDER_FORMAT:\n");
854 hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_FORMAT, &formatetc, (IOleClientSite *)0xdeadbeef, pStorage, (void **)&pObject);
856 broken(hr == E_INVALIDARG), /* win2k */
857 "OleCreate failed with error 0x%08x\n", hr);
860 IOleObject_Release(pObject);
861 CHECK_NO_EXTRA_METHODS();
864 expected_method_list = methods_olerender_asis;
865 trace("OleCreate with OLERENDER_ASIS:\n");
866 hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_ASIS, NULL, NULL, pStorage, (void **)&pObject);
867 ok_ole_success(hr, "OleCreate");
868 IOleObject_Release(pObject);
869 CHECK_NO_EXTRA_METHODS();
871 formatetc.cfFormat = 0;
872 formatetc.tymed = TYMED_NULL;
874 expected_method_list = methods_olerender_draw_no_runnable;
875 trace("OleCreate with OLERENDER_DRAW (no IRunnableObject):\n");
876 hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_DRAW, NULL, NULL, pStorage, (void **)&pObject);
877 ok_ole_success(hr, "OleCreate");
878 IOleObject_Release(pObject);
879 CHECK_NO_EXTRA_METHODS();
881 runnable = &OleObjectRunnable;
883 expected_method_list = methods_olerender_draw_no_cache;
884 trace("OleCreate with OLERENDER_DRAW (no IOleCache):\n");
885 hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_DRAW, NULL, NULL, pStorage, (void **)&pObject);
886 ok_ole_success(hr, "OleCreate");
887 IOleObject_Release(pObject);
888 CHECK_NO_EXTRA_METHODS();
892 static void test_OleLoad(IStorage *pStorage)
897 static const struct expected_method methods_oleload[] =
899 { "OleObject_QueryInterface", 0 },
900 { "OleObject_AddRef", 0 },
901 { "OleObject_QueryInterface", 0 },
902 { "OleObject_AddRef", 0 },
903 { "OleObject_GetMiscStatus", 0 },
904 { "OleObject_QueryInterface", 0 },
905 { "OleObjectPersistStg_AddRef", 0 },
906 { "OleObjectPersistStg_Load", 0 },
907 { "OleObjectPersistStg_Release", 0 },
908 { "OleObject_SetClientSite", 0 },
909 { "OleObject_Release", 0 },
910 { "OleObject_QueryInterface", 0 },
911 { "OleObject_GetMiscStatus", 0 },
912 { "OleObject_Release", 0 },
916 /* Test once with IOleObject_GetMiscStatus failing */
917 expected_method_list = methods_oleload;
918 g_failGetMiscStatus = TRUE;
920 hr = OleLoad(pStorage, &IID_IOleObject, (IOleClientSite *)0xdeadbeef, (void **)&pObject);
922 broken(hr == E_INVALIDARG), /* win98 and win2k */
923 "OleLoad failed with error 0x%08x\n", hr);
926 DWORD dwStatus = 0xdeadbeef;
927 hr = IOleObject_GetMiscStatus(pObject, DVASPECT_CONTENT, &dwStatus);
928 ok(hr == E_FAIL, "Got 0x%08x\n", hr);
929 ok(dwStatus == 0x1234, "Got 0x%08x\n", dwStatus);
931 IOleObject_Release(pObject);
932 CHECK_NO_EXTRA_METHODS();
935 /* Test again, let IOleObject_GetMiscStatus succeed. */
936 g_failGetMiscStatus = FALSE;
937 expected_method_list = methods_oleload;
939 hr = OleLoad(pStorage, &IID_IOleObject, (IOleClientSite *)0xdeadbeef, (void **)&pObject);
941 broken(hr == E_INVALIDARG), /* win98 and win2k */
942 "OleLoad failed with error 0x%08x\n", hr);
945 DWORD dwStatus = 0xdeadbeef;
946 hr = IOleObject_GetMiscStatus(pObject, DVASPECT_CONTENT, &dwStatus);
947 ok(hr == S_OK, "Got 0x%08x\n", hr);
948 ok(dwStatus == 1, "Got 0x%08x\n", dwStatus);
950 IOleObject_Release(pObject);
951 CHECK_NO_EXTRA_METHODS();
955 static BOOL STDMETHODCALLTYPE draw_continue(ULONG_PTR param)
957 CHECK_EXPECTED_METHOD("draw_continue");
961 static BOOL STDMETHODCALLTYPE draw_continue_false(ULONG_PTR param)
963 CHECK_EXPECTED_METHOD("draw_continue_false");
967 static HRESULT WINAPI AdviseSink_QueryInterface(IAdviseSink *iface, REFIID riid, void **ppv)
969 if (IsEqualIID(riid, &IID_IAdviseSink) || IsEqualIID(riid, &IID_IUnknown))
972 IUnknown_AddRef(iface);
976 return E_NOINTERFACE;
979 static ULONG WINAPI AdviseSink_AddRef(IAdviseSink *iface)
984 static ULONG WINAPI AdviseSink_Release(IAdviseSink *iface)
990 static void WINAPI AdviseSink_OnDataChange(
992 FORMATETC *pFormatetc,
995 CHECK_EXPECTED_METHOD("AdviseSink_OnDataChange");
998 static void WINAPI AdviseSink_OnViewChange(
1003 CHECK_EXPECTED_METHOD("AdviseSink_OnViewChange");
1006 static void WINAPI AdviseSink_OnRename(
1010 CHECK_EXPECTED_METHOD("AdviseSink_OnRename");
1013 static void WINAPI AdviseSink_OnSave(IAdviseSink *iface)
1015 CHECK_EXPECTED_METHOD("AdviseSink_OnSave");
1018 static void WINAPI AdviseSink_OnClose(IAdviseSink *iface)
1020 CHECK_EXPECTED_METHOD("AdviseSink_OnClose");
1023 static const IAdviseSinkVtbl AdviseSinkVtbl =
1025 AdviseSink_QueryInterface,
1028 AdviseSink_OnDataChange,
1029 AdviseSink_OnViewChange,
1030 AdviseSink_OnRename,
1035 static IAdviseSink AdviseSink = { &AdviseSinkVtbl };
1037 static HRESULT WINAPI DataObject_QueryInterface(
1042 if (IsEqualIID(riid, &IID_IDataObject) || IsEqualIID(riid, &IID_IUnknown))
1051 static ULONG WINAPI DataObject_AddRef(
1057 static ULONG WINAPI DataObject_Release(
1063 static HRESULT WINAPI DataObject_GetData(
1065 LPFORMATETC pformatetcIn,
1068 CHECK_EXPECTED_METHOD("DataObject_GetData");
1072 static HRESULT WINAPI DataObject_GetDataHere(
1074 LPFORMATETC pformatetc,
1077 CHECK_EXPECTED_METHOD("DataObject_GetDataHere");
1081 static HRESULT WINAPI DataObject_QueryGetData(
1083 LPFORMATETC pformatetc)
1085 CHECK_EXPECTED_METHOD("DataObject_QueryGetData");
1089 static HRESULT WINAPI DataObject_GetCanonicalFormatEtc(
1091 LPFORMATETC pformatectIn,
1092 LPFORMATETC pformatetcOut)
1094 CHECK_EXPECTED_METHOD("DataObject_GetCanonicalFormatEtc");
1098 static HRESULT WINAPI DataObject_SetData(
1100 LPFORMATETC pformatetc,
1104 CHECK_EXPECTED_METHOD("DataObject_SetData");
1108 static HRESULT WINAPI DataObject_EnumFormatEtc(
1111 IEnumFORMATETC** ppenumFormatEtc)
1113 CHECK_EXPECTED_METHOD("DataObject_EnumFormatEtc");
1117 static HRESULT WINAPI DataObject_DAdvise(
1119 FORMATETC* pformatetc,
1121 IAdviseSink* pAdvSink,
1122 DWORD* pdwConnection)
1124 CHECK_EXPECTED_METHOD("DataObject_DAdvise");
1129 static HRESULT WINAPI DataObject_DUnadvise(
1133 CHECK_EXPECTED_METHOD("DataObject_DUnadvise");
1137 static HRESULT WINAPI DataObject_EnumDAdvise(
1139 IEnumSTATDATA** ppenumAdvise)
1141 CHECK_EXPECTED_METHOD("DataObject_EnumDAdvise");
1142 return OLE_E_ADVISENOTSUPPORTED;
1145 static IDataObjectVtbl DataObjectVtbl =
1147 DataObject_QueryInterface,
1151 DataObject_GetDataHere,
1152 DataObject_QueryGetData,
1153 DataObject_GetCanonicalFormatEtc,
1155 DataObject_EnumFormatEtc,
1157 DataObject_DUnadvise,
1158 DataObject_EnumDAdvise
1161 static IDataObject DataObject = { &DataObjectVtbl };
1163 static void test_data_cache(void)
1166 IOleCache2 *pOleCache;
1168 IPersistStorage *pPS;
1169 IViewObject *pViewObject;
1170 IOleCacheControl *pOleCacheControl;
1172 STGMEDIUM stgmedium;
1178 char szSystemDir[MAX_PATH];
1179 WCHAR wszPath[MAX_PATH];
1180 static const WCHAR wszShell32[] = {'\\','s','h','e','l','l','3','2','.','d','l','l',0};
1182 static const struct expected_method methods_cacheinitnew[] =
1184 { "AdviseSink_OnViewChange", 0 },
1185 { "AdviseSink_OnViewChange", 0 },
1186 { "draw_continue", 1 },
1187 { "draw_continue_false", 1 },
1188 { "DataObject_DAdvise", 0 },
1189 { "DataObject_DAdvise", 0 },
1190 { "DataObject_DUnadvise", 0 },
1191 { "DataObject_DUnadvise", 0 },
1194 static const struct expected_method methods_cacheload[] =
1196 { "AdviseSink_OnViewChange", 0 },
1197 { "draw_continue", 1 },
1198 { "draw_continue", 1 },
1199 { "draw_continue", 1 },
1200 { "DataObject_GetData", 0 },
1201 { "DataObject_GetData", 0 },
1202 { "DataObject_GetData", 0 },
1206 GetSystemDirectory(szSystemDir, sizeof(szSystemDir)/sizeof(szSystemDir[0]));
1208 expected_method_list = methods_cacheinitnew;
1210 fmtetc.cfFormat = CF_METAFILEPICT;
1211 fmtetc.dwAspect = DVASPECT_ICON;
1214 fmtetc.tymed = TYMED_MFPICT;
1216 hr = StgCreateDocfile(NULL, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE | STGM_DELETEONRELEASE, 0, &pStorage);
1217 ok_ole_success(hr, "StgCreateDocfile");
1219 /* Test with new data */
1221 hr = CreateDataCache(NULL, &CLSID_NULL, &IID_IOleCache2, (LPVOID *)&pOleCache);
1222 ok_ole_success(hr, "CreateDataCache");
1224 hr = IOleCache_QueryInterface(pOleCache, &IID_IPersistStorage, (LPVOID *)&pPS);
1225 ok_ole_success(hr, "IOleCache_QueryInterface(IID_IPersistStorage)");
1226 hr = IOleCache_QueryInterface(pOleCache, &IID_IViewObject, (LPVOID *)&pViewObject);
1227 ok_ole_success(hr, "IOleCache_QueryInterface(IID_IViewObject)");
1228 hr = IOleCache_QueryInterface(pOleCache, &IID_IOleCacheControl, (LPVOID *)&pOleCacheControl);
1229 ok_ole_success(hr, "IOleCache_QueryInterface(IID_IOleCacheControl)");
1231 hr = IViewObject_SetAdvise(pViewObject, DVASPECT_ICON, ADVF_PRIMEFIRST, &AdviseSink);
1232 ok_ole_success(hr, "IViewObject_SetAdvise");
1234 hr = IPersistStorage_InitNew(pPS, pStorage);
1235 ok_ole_success(hr, "IPersistStorage_InitNew");
1237 hr = IPersistStorage_IsDirty(pPS);
1238 ok_ole_success(hr, "IPersistStorage_IsDirty");
1240 hr = IPersistStorage_GetClassID(pPS, &clsid);
1241 ok_ole_success(hr, "IPersistStorage_GetClassID");
1242 ok(IsEqualCLSID(&clsid, &IID_NULL), "clsid should be blank\n");
1244 hr = IOleCache_Uncache(pOleCache, 0xdeadbeef);
1245 ok(hr == OLE_E_NOCONNECTION, "IOleCache_Uncache with invalid value should return OLE_E_NOCONNECTION instead of 0x%x\n", hr);
1247 /* Both tests crash on NT4 and below. StgCreatePropSetStg is only available on w2k and above. */
1248 if (GetProcAddress(GetModuleHandleA("ole32.dll"), "StgCreatePropSetStg"))
1250 hr = IOleCache_Cache(pOleCache, NULL, 0, &dwConnection);
1251 ok(hr == E_INVALIDARG, "IOleCache_Cache with NULL fmtetc should have returned E_INVALIDARG instead of 0x%08x\n", hr);
1253 hr = IOleCache_Cache(pOleCache, NULL, 0, NULL);
1254 ok(hr == E_INVALIDARG, "IOleCache_Cache with NULL pdwConnection should have returned E_INVALIDARG instead of 0x%08x\n", hr);
1258 skip("tests with NULL parameters will crash on NT4 and below\n");
1261 for (fmtetc.cfFormat = CF_TEXT; fmtetc.cfFormat < CF_MAX; fmtetc.cfFormat++)
1264 fmtetc.dwAspect = DVASPECT_THUMBNAIL;
1265 for (i = 0; i < 7; i++)
1267 fmtetc.tymed = 1 << i;
1268 hr = IOleCache_Cache(pOleCache, &fmtetc, 0, &dwConnection);
1269 if ((fmtetc.cfFormat == CF_METAFILEPICT && fmtetc.tymed == TYMED_MFPICT) ||
1270 (fmtetc.cfFormat == CF_BITMAP && fmtetc.tymed == TYMED_GDI) ||
1271 (fmtetc.cfFormat == CF_DIB && fmtetc.tymed == TYMED_HGLOBAL) ||
1272 (fmtetc.cfFormat == CF_ENHMETAFILE && fmtetc.tymed == TYMED_ENHMF))
1273 ok(hr == S_OK, "IOleCache_Cache cfFormat = %d, tymed = %d should have returned S_OK instead of 0x%08x\n",
1274 fmtetc.cfFormat, fmtetc.tymed, hr);
1275 else if (fmtetc.tymed == TYMED_HGLOBAL)
1276 ok(hr == CACHE_S_FORMATETC_NOTSUPPORTED ||
1277 broken(hr == S_OK && fmtetc.cfFormat == CF_BITMAP) /* Win9x & NT4 */,
1278 "IOleCache_Cache cfFormat = %d, tymed = %d should have returned CACHE_S_FORMATETC_NOTSUPPORTED instead of 0x%08x\n",
1279 fmtetc.cfFormat, fmtetc.tymed, hr);
1281 ok(hr == DV_E_TYMED, "IOleCache_Cache cfFormat = %d, tymed = %d should have returned DV_E_TYMED instead of 0x%08x\n",
1282 fmtetc.cfFormat, fmtetc.tymed, hr);
1285 hr = IOleCache_Uncache(pOleCache, dwConnection);
1286 ok_ole_success(hr, "IOleCache_Uncache");
1291 fmtetc.cfFormat = CF_BITMAP;
1292 fmtetc.dwAspect = DVASPECT_THUMBNAIL;
1293 fmtetc.tymed = TYMED_GDI;
1294 hr = IOleCache_Cache(pOleCache, &fmtetc, 0, &dwConnection);
1295 ok_ole_success(hr, "IOleCache_Cache");
1297 fmtetc.cfFormat = 0;
1298 fmtetc.dwAspect = DVASPECT_ICON;
1299 fmtetc.tymed = TYMED_MFPICT;
1300 hr = IOleCache_Cache(pOleCache, &fmtetc, 0, &dwConnection);
1301 ok_ole_success(hr, "IOleCache_Cache");
1303 MultiByteToWideChar(CP_ACP, 0, szSystemDir, -1, wszPath, sizeof(wszPath)/sizeof(wszPath[0]));
1304 memcpy(wszPath+lstrlenW(wszPath), wszShell32, sizeof(wszShell32));
1306 fmtetc.cfFormat = CF_METAFILEPICT;
1307 stgmedium.tymed = TYMED_MFPICT;
1308 U(stgmedium).hMetaFilePict = OleMetafilePictFromIconAndLabel(
1309 LoadIcon(NULL, IDI_APPLICATION), wszPath, wszPath, 0);
1310 stgmedium.pUnkForRelease = NULL;
1312 fmtetc.dwAspect = DVASPECT_CONTENT;
1313 hr = IOleCache_SetData(pOleCache, &fmtetc, &stgmedium, FALSE);
1314 ok(hr == OLE_E_BLANK, "IOleCache_SetData for aspect not in cache should have return OLE_E_BLANK instead of 0x%08x\n", hr);
1316 fmtetc.dwAspect = DVASPECT_ICON;
1317 hr = IOleCache_SetData(pOleCache, &fmtetc, &stgmedium, FALSE);
1318 ok_ole_success(hr, "IOleCache_SetData");
1320 hr = IViewObject_Freeze(pViewObject, DVASPECT_ICON, -1, NULL, &dwFreeze);
1322 ok_ole_success(hr, "IViewObject_Freeze");
1323 hr = IViewObject_Freeze(pViewObject, DVASPECT_CONTENT, -1, NULL, &dwFreeze);
1324 ok(hr == OLE_E_BLANK, "IViewObject_Freeze with uncached aspect should have returned OLE_E_BLANK instead of 0x%08x\n", hr);
1329 rcBounds.right = 100;
1330 rcBounds.bottom = 100;
1331 hdcMem = CreateCompatibleDC(NULL);
1333 hr = IViewObject_Draw(pViewObject, DVASPECT_ICON, -1, NULL, NULL, NULL, hdcMem, &rcBounds, NULL, draw_continue, 0xdeadbeef);
1334 ok_ole_success(hr, "IViewObject_Draw");
1336 hr = IViewObject_Draw(pViewObject, DVASPECT_CONTENT, -1, NULL, NULL, NULL, hdcMem, &rcBounds, NULL, draw_continue, 0xdeadbeef);
1337 ok(hr == OLE_E_BLANK, "IViewObject_Draw with uncached aspect should have returned OLE_E_BLANK instead of 0x%08x\n", hr);
1339 /* a NULL draw_continue fn ptr */
1340 hr = IViewObject_Draw(pViewObject, DVASPECT_ICON, -1, NULL, NULL, NULL, hdcMem, &rcBounds, NULL, NULL, 0xdeadbeef);
1341 ok_ole_success(hr, "IViewObject_Draw");
1343 /* draw_continue that returns FALSE to abort drawing */
1344 hr = IViewObject_Draw(pViewObject, DVASPECT_ICON, -1, NULL, NULL, NULL, hdcMem, &rcBounds, NULL, draw_continue_false, 0xdeadbeef);
1346 broken(hr == S_OK), /* win9x may skip the callbacks */
1347 "IViewObject_Draw with draw_continue_false returns 0x%08x\n", hr);
1351 hr = IOleCacheControl_OnRun(pOleCacheControl, &DataObject);
1353 ok_ole_success(hr, "IOleCacheControl_OnRun");
1356 hr = IPersistStorage_Save(pPS, pStorage, TRUE);
1357 ok_ole_success(hr, "IPersistStorage_Save");
1359 hr = IPersistStorage_SaveCompleted(pPS, NULL);
1360 ok_ole_success(hr, "IPersistStorage_SaveCompleted");
1362 hr = IPersistStorage_IsDirty(pPS);
1363 ok(hr == S_FALSE, "IPersistStorage_IsDirty should have returned S_FALSE instead of 0x%x\n", hr);
1365 IPersistStorage_Release(pPS);
1366 IViewObject_Release(pViewObject);
1367 IOleCache_Release(pOleCache);
1368 IOleCacheControl_Release(pOleCacheControl);
1371 CHECK_NO_EXTRA_METHODS();
1374 /* Test with loaded data */
1375 trace("Testing loaded data with CreateDataCache:\n");
1376 expected_method_list = methods_cacheload;
1378 hr = CreateDataCache(NULL, &CLSID_NULL, &IID_IOleCache2, (LPVOID *)&pOleCache);
1379 ok_ole_success(hr, "CreateDataCache");
1381 hr = IOleCache_QueryInterface(pOleCache, &IID_IPersistStorage, (LPVOID *)&pPS);
1382 ok_ole_success(hr, "IOleCache_QueryInterface(IID_IPersistStorage)");
1383 hr = IOleCache_QueryInterface(pOleCache, &IID_IViewObject, (LPVOID *)&pViewObject);
1384 ok_ole_success(hr, "IOleCache_QueryInterface(IID_IViewObject)");
1386 hr = IViewObject_SetAdvise(pViewObject, DVASPECT_ICON, ADVF_PRIMEFIRST, &AdviseSink);
1387 ok_ole_success(hr, "IViewObject_SetAdvise");
1389 hr = IPersistStorage_Load(pPS, pStorage);
1390 ok_ole_success(hr, "IPersistStorage_Load");
1392 hr = IPersistStorage_IsDirty(pPS);
1393 ok(hr == S_FALSE, "IPersistStorage_IsDirty should have returned S_FALSE instead of 0x%x\n", hr);
1395 fmtetc.cfFormat = 0;
1396 fmtetc.dwAspect = DVASPECT_ICON;
1399 fmtetc.tymed = TYMED_MFPICT;
1400 hr = IOleCache_Cache(pOleCache, &fmtetc, 0, &dwConnection);
1401 ok(hr == CACHE_S_SAMECACHE, "IOleCache_Cache with already loaded data format type should return CACHE_S_SAMECACHE instead of 0x%x\n", hr);
1405 rcBounds.right = 100;
1406 rcBounds.bottom = 100;
1407 hdcMem = CreateCompatibleDC(NULL);
1409 hr = IViewObject_Draw(pViewObject, DVASPECT_ICON, -1, NULL, NULL, NULL, hdcMem, &rcBounds, NULL, draw_continue, 0xdeadbeef);
1410 ok_ole_success(hr, "IViewObject_Draw");
1412 hr = IViewObject_Draw(pViewObject, DVASPECT_CONTENT, -1, NULL, NULL, NULL, hdcMem, &rcBounds, NULL, draw_continue, 0xdeadbeef);
1413 ok(hr == OLE_E_BLANK, "IViewObject_Draw with uncached aspect should have returned OLE_E_BLANK instead of 0x%08x\n", hr);
1415 /* unload the cached storage object, causing it to be reloaded */
1416 hr = IOleCache2_DiscardCache(pOleCache, DISCARDCACHE_NOSAVE);
1417 ok_ole_success(hr, "IOleCache2_DiscardCache");
1418 hr = IViewObject_Draw(pViewObject, DVASPECT_ICON, -1, NULL, NULL, NULL, hdcMem, &rcBounds, NULL, draw_continue, 0xdeadbeef);
1419 ok_ole_success(hr, "IViewObject_Draw");
1421 /* unload the cached storage object, but don't allow it to be reloaded */
1422 hr = IPersistStorage_HandsOffStorage(pPS);
1423 ok_ole_success(hr, "IPersistStorage_HandsOffStorage");
1424 hr = IViewObject_Draw(pViewObject, DVASPECT_ICON, -1, NULL, NULL, NULL, hdcMem, &rcBounds, NULL, draw_continue, 0xdeadbeef);
1425 ok_ole_success(hr, "IViewObject_Draw");
1426 hr = IOleCache2_DiscardCache(pOleCache, DISCARDCACHE_NOSAVE);
1427 ok_ole_success(hr, "IOleCache2_DiscardCache");
1428 hr = IViewObject_Draw(pViewObject, DVASPECT_ICON, -1, NULL, NULL, NULL, hdcMem, &rcBounds, NULL, draw_continue, 0xdeadbeef);
1429 ok(hr == OLE_E_BLANK, "IViewObject_Draw with uncached aspect should have returned OLE_E_BLANK instead of 0x%08x\n", hr);
1434 hr = IOleCache_InitCache(pOleCache, &DataObject);
1435 ok(hr == CACHE_E_NOCACHE_UPDATED, "IOleCache_InitCache should have returned CACHE_E_NOCACHE_UPDATED instead of 0x%08x\n", hr);
1438 IPersistStorage_Release(pPS);
1439 IViewObject_Release(pViewObject);
1440 IOleCache_Release(pOleCache);
1443 CHECK_NO_EXTRA_METHODS();
1446 IStorage_Release(pStorage);
1447 ReleaseStgMedium(&stgmedium);
1450 static void test_default_handler(void)
1453 IOleObject *pObject;
1454 IRunnableObject *pRunnableObject;
1455 IOleClientSite *pClientSite;
1456 IDataObject *pDataObject;
1460 LPOLESTR pszUserType;
1465 IOleInPlaceObject *pInPlaceObj;
1466 IEnumOLEVERB *pEnumVerbs;
1467 static const WCHAR wszUnknown[] = {'U','n','k','n','o','w','n',0};
1468 static const WCHAR wszHostName[] = {'W','i','n','e',' ','T','e','s','t',' ','P','r','o','g','r','a','m',0};
1469 static const WCHAR wszDelim[] = {'!',0};
1471 hr = CoCreateInstance(&CLSID_WineTest, NULL, CLSCTX_INPROC_HANDLER, &IID_IOleObject, (void **)&pObject);
1472 ok(hr == REGDB_E_CLASSNOTREG, "CoCreateInstance should have failed with REGDB_E_CLASSNOTREG instead of 0x%08x\n", hr);
1474 hr = OleCreateDefaultHandler(&CLSID_WineTest, NULL, &IID_IOleObject, (void **)&pObject);
1475 ok_ole_success(hr, "OleCreateDefaultHandler");
1477 hr = IOleObject_QueryInterface(pObject, &IID_IOleInPlaceObject, (void **)&pInPlaceObj);
1478 ok(hr == E_NOINTERFACE, "IOleObject_QueryInterface(&IID_IOleInPlaceObject) should return E_NOINTERFACE instead of 0x%08x\n", hr);
1480 hr = IOleObject_Advise(pObject, &AdviseSink, &dwAdvConn);
1481 ok_ole_success(hr, "IOleObject_Advise");
1483 hr = IOleObject_Close(pObject, OLECLOSE_NOSAVE);
1484 ok_ole_success(hr, "IOleObject_Close");
1486 /* FIXME: test IOleObject_EnumAdvise */
1488 hr = IOleObject_EnumVerbs(pObject, &pEnumVerbs);
1489 ok(hr == REGDB_E_CLASSNOTREG, "IOleObject_EnumVerbs should have returned REGDB_E_CLASSNOTREG instead of 0x%08x\n", hr);
1491 hr = IOleObject_GetClientSite(pObject, &pClientSite);
1492 ok_ole_success(hr, "IOleObject_GetClientSite");
1494 hr = IOleObject_GetClipboardData(pObject, 0, &pDataObject);
1495 ok(hr == OLE_E_NOTRUNNING,
1496 "IOleObject_GetClipboardData should have returned OLE_E_NOTRUNNING instead of 0x%08x\n",
1499 hr = IOleObject_GetExtent(pObject, DVASPECT_CONTENT, &sizel);
1500 ok(hr == OLE_E_BLANK, "IOleObject_GetExtent should have returned OLE_E_BLANK instead of 0x%08x\n",
1503 hr = IOleObject_GetMiscStatus(pObject, DVASPECT_CONTENT, &dwStatus);
1504 ok(hr == REGDB_E_CLASSNOTREG, "IOleObject_GetMiscStatus should have returned REGDB_E_CLASSNOTREG instead of 0x%08x\n", hr);
1506 hr = IOleObject_GetUserClassID(pObject, &clsid);
1507 ok_ole_success(hr, "IOleObject_GetUserClassID");
1508 ok(IsEqualCLSID(&clsid, &CLSID_WineTest), "clsid != CLSID_WineTest\n");
1510 hr = IOleObject_GetUserType(pObject, USERCLASSTYPE_FULL, &pszUserType);
1512 ok_ole_success(hr, "IOleObject_GetUserType");
1513 ok(!lstrcmpW(pszUserType, wszUnknown), "Retrieved user type was wrong\n");
1516 hr = IOleObject_InitFromData(pObject, NULL, TRUE, 0);
1517 ok(hr == OLE_E_NOTRUNNING, "IOleObject_InitFromData should have returned OLE_E_NOTRUNNING instead of 0x%08x\n", hr);
1519 hr = IOleObject_IsUpToDate(pObject);
1520 ok(hr == OLE_E_NOTRUNNING, "IOleObject_IsUpToDate should have returned OLE_E_NOTRUNNING instead of 0x%08x\n", hr);
1522 palette.palNumEntries = 1;
1523 palette.palVersion = 2;
1524 memset(&palette.palPalEntry[0], 0, sizeof(palette.palPalEntry[0]));
1525 hr = IOleObject_SetColorScheme(pObject, &palette);
1526 ok(hr == OLE_E_NOTRUNNING, "IOleObject_SetColorScheme should have returned OLE_E_NOTRUNNING instead of 0x%08x\n", hr);
1528 sizel.cx = sizel.cy = 0;
1529 hr = IOleObject_SetExtent(pObject, DVASPECT_CONTENT, &sizel);
1531 hr = IOleObject_SetHostNames(pObject, wszHostName, NULL);
1532 ok_ole_success(hr, "IOleObject_SetHostNames");
1534 hr = CreateItemMoniker(wszDelim, wszHostName, &pMoniker);
1535 ok_ole_success(hr, "CreateItemMoniker");
1536 hr = IOleObject_SetMoniker(pObject, OLEWHICHMK_CONTAINER, pMoniker);
1537 ok_ole_success(hr, "IOleObject_SetMoniker");
1538 IMoniker_Release(pMoniker);
1540 hr = IOleObject_GetMoniker(pObject, OLEGETMONIKER_ONLYIFTHERE, OLEWHICHMK_CONTAINER, &pMoniker);
1541 ok(hr == E_FAIL, "IOleObject_GetMoniker should have returned E_FAIL instead of 0x%08x\n", hr);
1543 hr = IOleObject_Update(pObject);
1545 ok(hr == REGDB_E_CLASSNOTREG, "IOleObject_Update should have returned REGDB_E_CLASSNOTREG instead of 0x%08x\n", hr);
1547 hr = IOleObject_QueryInterface(pObject, &IID_IDataObject, (void **)&pDataObject);
1548 ok_ole_success(hr, "IOleObject_QueryInterface");
1550 fmtetc.cfFormat = CF_TEXT;
1552 fmtetc.dwAspect = DVASPECT_CONTENT;
1554 fmtetc.tymed = TYMED_NULL;
1555 hr = IDataObject_DAdvise(pDataObject, &fmtetc, 0, &AdviseSink, &dwAdvConn);
1556 ok_ole_success(hr, "IDataObject_DAdvise");
1558 fmtetc.cfFormat = CF_ENHMETAFILE;
1560 fmtetc.dwAspect = DVASPECT_CONTENT;
1562 fmtetc.tymed = TYMED_ENHMF;
1563 hr = IDataObject_DAdvise(pDataObject, &fmtetc, 0, &AdviseSink, &dwAdvConn);
1564 ok_ole_success(hr, "IDataObject_DAdvise");
1566 fmtetc.cfFormat = CF_ENHMETAFILE;
1568 fmtetc.dwAspect = DVASPECT_CONTENT;
1570 fmtetc.tymed = TYMED_ENHMF;
1571 hr = IDataObject_QueryGetData(pDataObject, &fmtetc);
1573 ok(hr == OLE_E_NOTRUNNING, "IDataObject_QueryGetData should have returned OLE_E_NOTRUNNING instead of 0x%08x\n", hr);
1575 fmtetc.cfFormat = CF_TEXT;
1577 fmtetc.dwAspect = DVASPECT_CONTENT;
1579 fmtetc.tymed = TYMED_NULL;
1580 hr = IDataObject_QueryGetData(pDataObject, &fmtetc);
1582 ok(hr == OLE_E_NOTRUNNING, "IDataObject_QueryGetData should have returned OLE_E_NOTRUNNING instead of 0x%08x\n", hr);
1584 hr = IOleObject_QueryInterface(pObject, &IID_IRunnableObject, (void **)&pRunnableObject);
1585 ok_ole_success(hr, "IOleObject_QueryInterface");
1587 hr = IRunnableObject_SetContainedObject(pRunnableObject, TRUE);
1588 ok_ole_success(hr, "IRunnableObject_SetContainedObject");
1590 hr = IRunnableObject_Run(pRunnableObject, NULL);
1591 ok(hr == REGDB_E_CLASSNOTREG, "IOleObject_Run should have returned REGDB_E_CLASSNOTREG instead of 0x%08x\n", hr);
1593 hr = IOleObject_Close(pObject, OLECLOSE_NOSAVE);
1594 ok_ole_success(hr, "IOleObject_Close");
1596 IRunnableObject_Release(pRunnableObject);
1597 IOleObject_Release(pObject);
1600 static void test_runnable(void)
1602 static const struct expected_method methods_query_runnable[] =
1604 { "OleObject_QueryInterface", 0 },
1605 { "OleObjectRunnable_AddRef", 0 },
1606 { "OleObjectRunnable_IsRunning", 0 },
1607 { "OleObjectRunnable_Release", 0 },
1611 static const struct expected_method methods_no_runnable[] =
1613 { "OleObject_QueryInterface", 0 },
1617 IOleObject *object = &OleObject;
1619 expected_method_list = methods_query_runnable;
1620 ok(OleIsRunning(object), "Object should be running\n");
1621 CHECK_NO_EXTRA_METHODS();
1623 g_isRunning = FALSE;
1624 expected_method_list = methods_query_runnable;
1625 ok(OleIsRunning(object) == FALSE, "Object should not be running\n");
1626 CHECK_NO_EXTRA_METHODS();
1628 g_showRunnable = FALSE; /* QueryInterface(IID_IRunnableObject, ...) will fail */
1629 expected_method_list = methods_no_runnable;
1630 ok(OleIsRunning(object), "Object without IRunnableObject should be running\n");
1631 CHECK_NO_EXTRA_METHODS();
1634 g_showRunnable = TRUE;
1637 static HRESULT WINAPI Unknown_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
1640 if (IsEqualIID(riid, &IID_IUnknown)) *ppv = iface;
1643 IUnknown_AddRef((IUnknown *)*ppv);
1646 return E_NOINTERFACE;
1649 static ULONG WINAPI Unknown_AddRef(IUnknown *iface)
1654 static ULONG WINAPI Unknown_Release(IUnknown *iface)
1659 static const IUnknownVtbl UnknownVtbl =
1661 Unknown_QueryInterface,
1666 static IUnknown Unknown = { &UnknownVtbl };
1668 static void test_OleLockRunning(void)
1672 hr = OleLockRunning((LPUNKNOWN)&Unknown, TRUE, FALSE);
1673 ok(hr == S_OK, "OleLockRunning failed 0x%08x\n", hr);
1685 hr = CoRegisterClassObject(&CLSID_Equation3, (IUnknown *)&OleObjectCF, CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, &dwRegister);
1686 ok_ole_success(hr, "CoRegisterClassObject");
1688 hr = StgCreateDocfile(NULL, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE | STGM_DELETEONRELEASE, 0, &pStorage);
1689 ok_ole_success(hr, "StgCreateDocfile");
1691 test_OleCreate(pStorage);
1693 hr = IStorage_Stat(pStorage, &statstg, STATFLAG_NONAME);
1694 ok_ole_success(hr, "IStorage_Stat");
1695 ok(IsEqualCLSID(&CLSID_Equation3, &statstg.clsid), "Wrong CLSID in storage\n");
1697 test_OleLoad(pStorage);
1699 IStorage_Release(pStorage);
1701 hr = CoRevokeClassObject(dwRegister);
1702 ok_ole_success(hr, "CoRevokeClassObject");
1705 test_default_handler();
1707 test_OleLockRunning();