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
30 #include "wine/test.h"
32 #define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08lx\n", hr)
34 static IPersistStorage OleObjectPersistStg;
35 static IOleCache OleObjectCache;
36 static IRunnableObject OleObjectRunnable;
38 static char const * const *expected_method_list;
40 #define CHECK_EXPECTED_METHOD(method_name) \
42 trace("%s\n", method_name); \
43 ok(*expected_method_list != NULL, "Extra method %s called\n", method_name); \
44 if (*expected_method_list) \
46 ok(!strcmp(*expected_method_list, method_name), "Expected %s to be called instead of %s\n", \
47 *expected_method_list, method_name); \
48 expected_method_list++; \
52 static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **ppv)
54 CHECK_EXPECTED_METHOD("OleObject_QueryInterface");
55 if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IOleObject))
58 IUnknown_AddRef(iface);
61 else if (IsEqualIID(riid, &IID_IPersistStorage))
63 *ppv = &OleObjectPersistStg;
64 IUnknown_AddRef((IUnknown *)*ppv);
67 else if (IsEqualIID(riid, &IID_IOleCache))
69 *ppv = &OleObjectCache;
70 IUnknown_AddRef((IUnknown *)*ppv);
73 else if (IsEqualIID(riid, &IID_IRunnableObject))
75 *ppv = &OleObjectRunnable;
76 IUnknown_AddRef((IUnknown *)*ppv);
80 trace("OleObject_QueryInterface: returning E_NOINTERFACE\n");
85 static ULONG WINAPI OleObject_AddRef(IOleObject *iface)
87 CHECK_EXPECTED_METHOD("OleObject_AddRef");
91 static ULONG WINAPI OleObject_Release(IOleObject *iface)
93 CHECK_EXPECTED_METHOD("OleObject_Release");
97 static HRESULT WINAPI OleObject_SetClientSite
100 IOleClientSite *pClientSite
103 CHECK_EXPECTED_METHOD("OleObject_SetClientSite");
107 static HRESULT WINAPI OleObject_GetClientSite
110 IOleClientSite **ppClientSite
113 CHECK_EXPECTED_METHOD("OleObject_GetClientSite");
117 static HRESULT WINAPI OleObject_SetHostNames
120 LPCOLESTR szContainerApp,
121 LPCOLESTR szContainerObj
124 CHECK_EXPECTED_METHOD("OleObject_SetHostNames");
128 static HRESULT WINAPI OleObject_Close
134 CHECK_EXPECTED_METHOD("OleObject_Close");
138 static HRESULT WINAPI OleObject_SetMoniker
141 DWORD dwWhichMoniker,
145 CHECK_EXPECTED_METHOD("OleObject_SetMoniker");
149 static HRESULT WINAPI OleObject_GetMoniker
153 DWORD dwWhichMoniker,
157 CHECK_EXPECTED_METHOD("OleObject_GetMoniker");
161 static HRESULT WINAPI OleObject_InitFromData
164 IDataObject *pDataObject,
169 CHECK_EXPECTED_METHOD("OleObject_InitFromData");
173 static HRESULT WINAPI OleObject_GetClipboardData
177 IDataObject **ppDataObject
180 CHECK_EXPECTED_METHOD("OleObject_GetClipboardData");
184 static HRESULT WINAPI OleObject_DoVerb
189 IOleClientSite *pActiveSite,
195 CHECK_EXPECTED_METHOD("OleObject_DoVerb");
199 static HRESULT WINAPI OleObject_EnumVerbs
202 IEnumOLEVERB **ppEnumOleVerb
205 CHECK_EXPECTED_METHOD("OleObject_EnumVerbs");
209 static HRESULT WINAPI OleObject_Update
214 CHECK_EXPECTED_METHOD("OleObject_Update");
218 static HRESULT WINAPI OleObject_IsUpToDate
223 CHECK_EXPECTED_METHOD("OleObject_IsUpToDate");
227 HRESULT WINAPI OleObject_GetUserClassID
233 CHECK_EXPECTED_METHOD("OleObject_GetUserClassID");
237 HRESULT WINAPI OleObject_GetUserType
241 LPOLESTR *pszUserType
244 CHECK_EXPECTED_METHOD("OleObject_GetUserType");
248 HRESULT WINAPI OleObject_SetExtent
255 CHECK_EXPECTED_METHOD("OleObject_SetExtent");
259 HRESULT WINAPI OleObject_GetExtent
266 CHECK_EXPECTED_METHOD("OleObject_GetExtent");
270 HRESULT WINAPI OleObject_Advise
273 IAdviseSink *pAdvSink,
277 CHECK_EXPECTED_METHOD("OleObject_Advise");
281 HRESULT WINAPI OleObject_Unadvise
287 CHECK_EXPECTED_METHOD("OleObject_Unadvise");
291 HRESULT WINAPI OleObject_EnumAdvise
294 IEnumSTATDATA **ppenumAdvise
297 CHECK_EXPECTED_METHOD("OleObject_EnumAdvise");
301 HRESULT WINAPI OleObject_GetMiscStatus
308 CHECK_EXPECTED_METHOD("OleObject_GetMiscStatus");
309 *pdwStatus = DVASPECT_CONTENT;
313 HRESULT WINAPI OleObject_SetColorScheme
319 CHECK_EXPECTED_METHOD("OleObject_SetColorScheme");
323 static IOleObjectVtbl OleObjectVtbl =
325 OleObject_QueryInterface,
328 OleObject_SetClientSite,
329 OleObject_GetClientSite,
330 OleObject_SetHostNames,
332 OleObject_SetMoniker,
333 OleObject_GetMoniker,
334 OleObject_InitFromData,
335 OleObject_GetClipboardData,
339 OleObject_IsUpToDate,
340 OleObject_GetUserClassID,
341 OleObject_GetUserType,
346 OleObject_EnumAdvise,
347 OleObject_GetMiscStatus,
348 OleObject_SetColorScheme
351 static IOleObject OleObject = { &OleObjectVtbl };
353 static HRESULT WINAPI OleObjectPersistStg_QueryInterface(IPersistStorage *iface, REFIID riid, void **ppv)
355 trace("OleObjectPersistStg_QueryInterface\n");
356 return IUnknown_QueryInterface((IUnknown *)&OleObject, riid, ppv);
359 static ULONG WINAPI OleObjectPersistStg_AddRef(IPersistStorage *iface)
361 CHECK_EXPECTED_METHOD("OleObjectPersistStg_AddRef");
365 static ULONG WINAPI OleObjectPersistStg_Release(IPersistStorage *iface)
367 CHECK_EXPECTED_METHOD("OleObjectPersistStg_Release");
371 static HRESULT WINAPI OleObjectPersistStg_GetClassId(IPersistStorage *iface, CLSID *clsid)
373 CHECK_EXPECTED_METHOD("OleObjectPersistStg_GetClassId");
377 HRESULT WINAPI OleObjectPersistStg_IsDirty
379 IPersistStorage *iface
382 CHECK_EXPECTED_METHOD("OleObjectPersistStg_IsDirty");
386 HRESULT WINAPI OleObjectPersistStg_InitNew
388 IPersistStorage *iface,
392 CHECK_EXPECTED_METHOD("OleObjectPersistStg_InitNew");
396 HRESULT WINAPI OleObjectPersistStg_Load
398 IPersistStorage *iface,
402 CHECK_EXPECTED_METHOD("OleObjectPersistStg_Load");
406 HRESULT WINAPI OleObjectPersistStg_Save
408 IPersistStorage *iface,
413 CHECK_EXPECTED_METHOD("OleObjectPersistStg_Save");
417 HRESULT WINAPI OleObjectPersistStg_SaveCompleted
419 IPersistStorage *iface,
423 CHECK_EXPECTED_METHOD("OleObjectPersistStg_SaveCompleted");
427 HRESULT WINAPI OleObjectPersistStg_HandsOffStorage
429 IPersistStorage *iface
432 CHECK_EXPECTED_METHOD("OleObjectPersistStg_HandsOffStorage");
436 static IPersistStorageVtbl OleObjectPersistStgVtbl =
438 OleObjectPersistStg_QueryInterface,
439 OleObjectPersistStg_AddRef,
440 OleObjectPersistStg_Release,
441 OleObjectPersistStg_GetClassId,
442 OleObjectPersistStg_IsDirty,
443 OleObjectPersistStg_InitNew,
444 OleObjectPersistStg_Load,
445 OleObjectPersistStg_Save,
446 OleObjectPersistStg_SaveCompleted,
447 OleObjectPersistStg_HandsOffStorage
450 static IPersistStorage OleObjectPersistStg = { &OleObjectPersistStgVtbl };
452 static HRESULT WINAPI OleObjectCache_QueryInterface(IOleCache *iface, REFIID riid, void **ppv)
454 return IUnknown_QueryInterface((IUnknown *)&OleObject, riid, ppv);
457 static ULONG WINAPI OleObjectCache_AddRef(IOleCache *iface)
459 CHECK_EXPECTED_METHOD("OleObjectCache_AddRef");
463 static ULONG WINAPI OleObjectCache_Release(IOleCache *iface)
465 CHECK_EXPECTED_METHOD("OleObjectCache_Release");
469 HRESULT WINAPI OleObjectCache_Cache
472 FORMATETC *pformatetc,
477 CHECK_EXPECTED_METHOD("OleObjectCache_Cache");
481 HRESULT WINAPI OleObjectCache_Uncache
487 CHECK_EXPECTED_METHOD("OleObjectCache_Uncache");
491 HRESULT WINAPI OleObjectCache_EnumCache
494 IEnumSTATDATA **ppenumSTATDATA
497 CHECK_EXPECTED_METHOD("OleObjectCache_EnumCache");
502 HRESULT WINAPI OleObjectCache_InitCache
505 IDataObject *pDataObject
508 CHECK_EXPECTED_METHOD("OleObjectCache_InitCache");
513 HRESULT WINAPI OleObjectCache_SetData
516 FORMATETC *pformatetc,
521 CHECK_EXPECTED_METHOD("OleObjectCache_SetData");
526 static IOleCacheVtbl OleObjectCacheVtbl =
528 OleObjectCache_QueryInterface,
529 OleObjectCache_AddRef,
530 OleObjectCache_Release,
531 OleObjectCache_Cache,
532 OleObjectCache_Uncache,
533 OleObjectCache_EnumCache,
534 OleObjectCache_InitCache,
535 OleObjectCache_SetData
538 static IOleCache OleObjectCache = { &OleObjectCacheVtbl };
540 static HRESULT WINAPI OleObjectCF_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
542 if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IClassFactory))
545 IUnknown_AddRef(iface);
549 return E_NOINTERFACE;
552 static ULONG WINAPI OleObjectCF_AddRef(IClassFactory *iface)
557 static ULONG WINAPI OleObjectCF_Release(IClassFactory *iface)
562 static HRESULT WINAPI OleObjectCF_CreateInstance(IClassFactory *iface, IUnknown *punkOuter, REFIID riid, void **ppv)
564 return IUnknown_QueryInterface((IUnknown *)&OleObject, riid, ppv);
567 static HRESULT WINAPI OleObjectCF_LockServer(IClassFactory *iface, BOOL lock)
572 static IClassFactoryVtbl OleObjectCFVtbl =
574 OleObjectCF_QueryInterface,
577 OleObjectCF_CreateInstance,
578 OleObjectCF_LockServer
581 static IClassFactory OleObjectCF = { &OleObjectCFVtbl };
583 static HRESULT WINAPI OleObjectRunnable_QueryInterface(IRunnableObject *iface, REFIID riid, void **ppv)
585 return IUnknown_QueryInterface((IUnknown *)&OleObject, riid, ppv);
588 static ULONG WINAPI OleObjectRunnable_AddRef(IRunnableObject *iface)
590 CHECK_EXPECTED_METHOD("OleObjectRunnable_AddRef");
594 static ULONG WINAPI OleObjectRunnable_Release(IRunnableObject *iface)
596 CHECK_EXPECTED_METHOD("OleObjectRunnable_Release");
600 HRESULT WINAPI OleObjectRunnable_GetRunningClass(
601 IRunnableObject *iface,
604 CHECK_EXPECTED_METHOD("OleObjectRunnable_GetRunningClass");
608 HRESULT WINAPI OleObjectRunnable_Run(
609 IRunnableObject *iface,
612 CHECK_EXPECTED_METHOD("OleObjectRunnable_Run");
616 BOOL WINAPI OleObjectRunnable_IsRunning(IRunnableObject *iface)
618 CHECK_EXPECTED_METHOD("OleObjectRunnable_IsRunning");
622 HRESULT WINAPI OleObjectRunnable_LockRunning(
623 IRunnableObject *iface,
625 BOOL fLastUnlockCloses)
627 CHECK_EXPECTED_METHOD("OleObjectRunnable_LockRunning");
631 HRESULT WINAPI OleObjectRunnable_SetContainedObject(
632 IRunnableObject *iface,
635 CHECK_EXPECTED_METHOD("OleObjectRunnable_SetContainedObject");
639 static IRunnableObjectVtbl OleObjectRunnableVtbl =
641 OleObjectRunnable_QueryInterface,
642 OleObjectRunnable_AddRef,
643 OleObjectRunnable_Release,
644 OleObjectRunnable_GetRunningClass,
645 OleObjectRunnable_Run,
646 OleObjectRunnable_IsRunning,
647 OleObjectRunnable_LockRunning,
648 OleObjectRunnable_SetContainedObject
651 static IRunnableObject OleObjectRunnable = { &OleObjectRunnableVtbl };
653 static const CLSID CLSID_Equation3 = {0x0002CE02, 0x0000, 0x0000, {0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46} };
655 static void test_OleCreate(IStorage *pStorage)
660 static const char *methods_olerender_none[] =
662 "OleObject_QueryInterface",
664 "OleObject_QueryInterface",
665 "OleObjectPersistStg_AddRef",
666 "OleObjectPersistStg_InitNew",
667 "OleObjectPersistStg_Release",
671 static const char *methods_olerender_draw[] =
673 "OleObject_QueryInterface",
675 "OleObject_QueryInterface",
676 "OleObjectPersistStg_AddRef",
677 "OleObjectPersistStg_InitNew",
678 "OleObjectPersistStg_Release",
679 "OleObject_QueryInterface",
680 "OleObjectRunnable_AddRef",
681 "OleObjectRunnable_Run",
682 "OleObjectRunnable_Release",
683 "OleObject_QueryInterface",
684 "OleObjectCache_AddRef",
685 "OleObjectCache_Cache",
686 "OleObjectCache_Release",
690 static const char *methods_olerender_format[] =
692 "OleObject_QueryInterface",
694 "OleObject_QueryInterface",
696 "OleObject_GetMiscStatus",
697 "OleObject_QueryInterface",
698 "OleObjectPersistStg_AddRef",
699 "OleObjectPersistStg_InitNew",
700 "OleObjectPersistStg_Release",
701 "OleObject_SetClientSite",
703 "OleObject_QueryInterface",
704 "OleObjectRunnable_AddRef",
705 "OleObjectRunnable_Run",
706 "OleObjectRunnable_Release",
707 "OleObject_QueryInterface",
708 "OleObjectCache_AddRef",
709 "OleObjectCache_Cache",
710 "OleObjectCache_Release",
714 static const char *methods_olerender_asis[] =
716 "OleObject_QueryInterface",
718 "OleObject_QueryInterface",
719 "OleObjectPersistStg_AddRef",
720 "OleObjectPersistStg_InitNew",
721 "OleObjectPersistStg_Release",
726 expected_method_list = methods_olerender_none;
727 trace("OleCreate with OLERENDER_NONE:\n");
728 hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_NONE, NULL, NULL, pStorage, (void **)&pObject);
729 ok_ole_success(hr, "OleCreate");
730 IOleObject_Release(pObject);
731 ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list);
733 expected_method_list = methods_olerender_draw;
734 trace("OleCreate with OLERENDER_DRAW:\n");
735 hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_DRAW, NULL, NULL, pStorage, (void **)&pObject);
736 ok_ole_success(hr, "OleCreate");
737 IOleObject_Release(pObject);
738 ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list);
740 formatetc.cfFormat = CF_TEXT;
741 formatetc.ptd = NULL;
742 formatetc.dwAspect = DVASPECT_CONTENT;
743 formatetc.lindex = -1;
744 formatetc.tymed = TYMED_HGLOBAL;
745 expected_method_list = methods_olerender_format;
746 trace("OleCreate with OLERENDER_FORMAT:\n");
747 hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_FORMAT, &formatetc, (IOleClientSite *)0xdeadbeef, pStorage, (void **)&pObject);
748 ok_ole_success(hr, "OleCreate");
749 IOleObject_Release(pObject);
750 ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list);
752 expected_method_list = methods_olerender_asis;
753 trace("OleCreate with OLERENDER_ASIS:\n");
754 hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_ASIS, NULL, NULL, pStorage, (void **)&pObject);
755 ok_ole_success(hr, "OleCreate");
756 IOleObject_Release(pObject);
757 ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list);
762 static void test_OleLoad(IStorage *pStorage)
767 static const char *methods_oleload[] =
769 "OleObject_QueryInterface",
771 "OleObject_QueryInterface",
773 "OleObject_GetMiscStatus",
774 "OleObject_QueryInterface",
775 "OleObjectPersistStg_AddRef",
776 "OleObjectPersistStg_Load",
777 "OleObjectPersistStg_Release",
778 "OleObject_SetClientSite",
780 "OleObject_QueryInterface",
785 expected_method_list = methods_oleload;
787 hr = OleLoad(pStorage, &IID_IOleObject, (IOleClientSite *)0xdeadbeef, (void **)&pObject);
788 ok_ole_success(hr, "OleLoad");
789 IOleObject_Release(pObject);
790 ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list);
802 hr = CoRegisterClassObject(&CLSID_Equation3, (IUnknown *)&OleObjectCF, CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, &dwRegister);
803 ok_ole_success(hr, "CoRegisterClassObject");
805 hr = StgCreateDocfile(NULL, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE | STGM_DELETEONRELEASE, 0, &pStorage);
806 ok_ole_success(hr, "StgCreateDocfile");
808 test_OleCreate(pStorage);
810 hr = IStorage_Stat(pStorage, &statstg, STATFLAG_NONAME);
811 ok_ole_success(hr, "IStorage_Stat");
812 ok(IsEqualCLSID(&CLSID_Equation3, &statstg.clsid), "Wrong CLSID in storage\n");
814 test_OleLoad(pStorage);
816 IStorage_Release(pStorage);
818 hr = CoRevokeClassObject(dwRegister);
819 ok_ole_success(hr, "CoRevokeClassObject");