ReactOS 0.4.16-dev-2332-g4cba65d
ole2.c
Go to the documentation of this file.
1/*
2 * Object Linking and Embedding Tests
3 *
4 * Copyright 2005 Robert Shearman
5 * Copyright 2017 Dmitry Timoshkov
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22#define COBJMACROS
23#define CONST_VTABLE
24#define WIN32_LEAN_AND_MEAN
25
26#include <stdarg.h>
27
28#include "windef.h"
29#include "winbase.h"
30#include "wingdi.h"
31#include "objbase.h"
32#include "shlguid.h"
33
34#include "wine/test.h"
35
36#define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error %#08lx\n", hr)
37
38#define DEFINE_EXPECT(func) \
39 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
40
41#define SET_EXPECT(func) \
42 expect_ ## func = TRUE
43
44#define CHECK_EXPECT2(func) \
45 do { \
46 ok(expect_ ##func, "unexpected call " #func "\n"); \
47 called_ ## func = TRUE; \
48 }while(0)
49
50#define CHECK_EXPECT(func) \
51 do { \
52 CHECK_EXPECT2(func); \
53 expect_ ## func = FALSE; \
54 }while(0)
55
56#define CHECK_CALLED(func) \
57 do { \
58 ok(called_ ## func, "expected " #func "\n"); \
59 expect_ ## func = called_ ## func = FALSE; \
60 }while(0)
61
63DEFINE_EXPECT(Storage_OpenStream_CompObj);
64DEFINE_EXPECT(Storage_OpenStream_OlePres);
66DEFINE_EXPECT(Storage_CreateStream_CompObj);
67DEFINE_EXPECT(Storage_CreateStream_OlePres);
68DEFINE_EXPECT(Storage_OpenStream_Ole);
70
73
77
79{ /* 9474ba1a-258b-490b-bc13-516e9239acd0 */
80 0x9474ba1a,
81 0x258b,
82 0x490b,
83 {0xbc, 0x13, 0x51, 0x6e, 0x92, 0x39, 0xac, 0xd0}
84};
85
86static const CLSID CLSID_WineTest =
87{ /* 9474ba1a-258b-490b-bc13-516e9239ace0 */
88 0x9474ba1a,
89 0x258b,
90 0x490b,
91 {0xbc, 0x13, 0x51, 0x6e, 0x92, 0x39, 0xac, 0xe0}
92};
93
94static const IID IID_WineTest =
95{ /* 9474ba1a-258b-490b-bc13-516e9239ace1 */
96 0x9474ba1a,
97 0x258b,
98 0x490b,
99 {0xbc, 0x13, 0x51, 0x6e, 0x92, 0x39, 0xac, 0xe1}
100};
101
102#define TEST_TODO 0x2
103
105{
106 const char *method;
107 unsigned int flags;
108 FORMATETC fmt;
109};
110
112static FORMATETC *g_expected_fetc = NULL;
113
118
120
121static FORMATETC *data_object_format;
122static const BYTE *data_object_dib;
123
124/****************************************************************************
125 * PresentationDataHeader
126 *
127 * This structure represents the header of the \002OlePresXXX stream in
128 * the OLE object storage.
129 */
130typedef struct PresentationDataHeader
131{
132 /* clipformat:
133 * - standard clipformat:
134 * DWORD length = 0xffffffff;
135 * DWORD cfFormat;
136 * - or custom clipformat:
137 * DWORD length;
138 * CHAR format_name[length]; (null-terminated)
139 */
140 DWORD tdSize; /* This is actually a truncated DVTARGETDEVICE, if tdSize > sizeof(DWORD)
141 then there are tdSize - sizeof(DWORD) more bytes before dvAspect */
142 DVASPECT dvAspect;
144 DWORD advf;
145 DWORD unknown7; /* 0 */
150
151#ifdef __REACTOS__
152static inline void check_expected_method_fmt(const char *method_name, const FORMATETC *fmt)
153#else
154static void inline check_expected_method_fmt(const char *method_name, const FORMATETC *fmt)
155#endif
156{
157 if (winetest_debug > 1) trace("%s\n", method_name);
158 ok(expected_method_list->method != NULL, "Extra method %s called\n", method_name);
159 if (expected_method_list->method)
160 {
162 {
163 ok(!strcmp(expected_method_list->method, method_name),
164 "Expected %s to be called instead of %s\n",
165 expected_method_list->method, method_name);
166 if (fmt)
167 {
168 ok(fmt->cfFormat == expected_method_list->fmt.cfFormat, "got cf %04x vs %04x\n",
169 fmt->cfFormat, expected_method_list->fmt.cfFormat );
170 ok(fmt->dwAspect == expected_method_list->fmt.dwAspect, "got aspect %ld vs %ld\n",
171 fmt->dwAspect, expected_method_list->fmt.dwAspect );
172 ok(fmt->lindex == expected_method_list->fmt.lindex, "got lindex %ld vs %ld\n",
173 fmt->lindex, expected_method_list->fmt.lindex );
174 ok(fmt->tymed == expected_method_list->fmt.tymed, "got tymed %ld vs %ld\n",
175 fmt->tymed, expected_method_list->fmt.tymed );
176 }
177 }
179 }
180}
181
182#define CHECK_EXPECTED_METHOD(method_name) check_expected_method_fmt(method_name, NULL)
183#define CHECK_EXPECTED_METHOD_FMT(method_name, fmt) check_expected_method_fmt(method_name, fmt)
184
185#define CHECK_NO_EXTRA_METHODS() \
186 do { \
187 ok(!expected_method_list->method, "Method sequence starting from %s not called\n", expected_method_list->method); \
188 } while (0)
189
190static const BYTE dib_white[] =
191{
192 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
193 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00,
194 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
195 0xc8, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00,
196 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
197 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
198};
199
200static const BYTE dib_black[] =
201{
202 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
203 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00,
204 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
205 0xc8, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00,
206 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
207 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
208};
209
210static void create_dib( STGMEDIUM *med )
211{
212 void *ptr;
213
214 med->tymed = TYMED_HGLOBAL;
215 med->hGlobal = GlobalAlloc(GMEM_MOVEABLE, sizeof(dib_white));
216 ptr = GlobalLock( med->hGlobal );
217 memcpy(ptr, dib_white, sizeof(dib_white));
218 GlobalUnlock( med->hGlobal );
219 med->pUnkForRelease = NULL;
220}
221
222static void create_bitmap( STGMEDIUM *med )
223{
224 med->tymed = TYMED_GDI;
225 med->hBitmap = CreateBitmap( 1, 1, 1, 1, NULL );
226 med->pUnkForRelease = NULL;
227}
228
229static void create_emf(STGMEDIUM *med)
230{
232
233 Rectangle(hdc, 0, 0, 150, 300);
234 med->tymed = TYMED_ENHMF;
235 med->hEnhMetaFile = CloseEnhMetaFile(hdc);
236 med->pUnkForRelease = NULL;
237}
238
239static void create_mfpict(STGMEDIUM *med)
240{
241 METAFILEPICT *mf;
243
244 Rectangle(hdc, 0, 0, 100, 200);
245
246 med->tymed = TYMED_MFPICT;
247 med->hMetaFilePict = GlobalAlloc(GMEM_MOVEABLE, sizeof(METAFILEPICT));
248 mf = GlobalLock(med->hMetaFilePict);
249 mf->mm = MM_ANISOTROPIC;
250 mf->xExt = 100;
251 mf->yExt = 200;
252 mf->hMF = CloseMetaFile(hdc);
253 GlobalUnlock(med->hMetaFilePict);
254 med->pUnkForRelease = NULL;
255}
256
257static void create_text(STGMEDIUM *med)
258{
260 char *p;
261
264 strcpy(p, "test");
266
267 med->tymed = TYMED_HGLOBAL;
268 med->hGlobal = handle;
269 med->pUnkForRelease = NULL;
270}
271
273
275{
276 if (winetest_debug > 1) trace("IOleObject::QueryInterface(%s)\n", debugstr_guid(riid));
277
278 *ppv = NULL;
279
281 *ppv = iface;
284 else if (IsEqualIID(riid, &IID_IOleCache))
285 *ppv = cache;
287 *ppv = runnable;
288 else if (IsEqualIID(riid, &IID_WineTest))
289 return g_QIFailsWith;
290
291 if(*ppv) {
292 IUnknown_AddRef((IUnknown*)*ppv);
293 return S_OK;
294 }
295
296 return E_NOINTERFACE;
297}
298
300{
302}
303
305{
307}
308
310 (
311 IOleObject *iface,
312 IOleClientSite *pClientSite
313 )
314{
315 CHECK_EXPECTED_METHOD("OleObject_SetClientSite");
316 return S_OK;
317}
318
320 (
321 IOleObject *iface,
322 IOleClientSite **ppClientSite
323 )
324{
325 CHECK_EXPECTED_METHOD("OleObject_GetClientSite");
326 return E_NOTIMPL;
327}
328
330 (
331 IOleObject *iface,
332 LPCOLESTR szContainerApp,
333 LPCOLESTR szContainerObj
334 )
335{
336 CHECK_EXPECTED_METHOD("OleObject_SetHostNames");
337 return S_OK;
338}
339
341 (
342 IOleObject *iface,
343 DWORD dwSaveOption
344 )
345{
346 CHECK_EXPECTED_METHOD("OleObject_Close");
347 return S_OK;
348}
349
351 (
352 IOleObject *iface,
353 DWORD dwWhichMoniker,
354 IMoniker *pmk
355 )
356{
357 CHECK_EXPECTED_METHOD("OleObject_SetMoniker");
358 return S_OK;
359}
360
362 (
363 IOleObject *iface,
364 DWORD dwAssign,
365 DWORD dwWhichMoniker,
366 IMoniker **ppmk
367 )
368{
369 CHECK_EXPECTED_METHOD("OleObject_GetMoniker");
370 return S_OK;
371}
372
374 (
375 IOleObject *iface,
376 IDataObject *pDataObject,
377 BOOL fCreation,
379 )
380{
381 CHECK_EXPECTED_METHOD("OleObject_InitFromData");
382 return S_OK;
383}
384
386 (
387 IOleObject *iface,
389 IDataObject **ppDataObject
390 )
391{
392 CHECK_EXPECTED_METHOD("OleObject_GetClipboardData");
393 return E_NOTIMPL;
394}
395
397 (
398 IOleObject *iface,
399 LONG iVerb,
400 LPMSG lpmsg,
401 IOleClientSite *pActiveSite,
402 LONG lindex,
404 LPCRECT lprcPosRect
405 )
406{
407 CHECK_EXPECTED_METHOD("OleObject_DoVerb");
408 return S_OK;
409}
410
412 (
413 IOleObject *iface,
414 IEnumOLEVERB **ppEnumOleVerb
415 )
416{
417 CHECK_EXPECTED_METHOD("OleObject_EnumVerbs");
418 return E_NOTIMPL;
419}
420
422 (
423 IOleObject *iface
424 )
425{
426 CHECK_EXPECTED_METHOD("OleObject_Update");
427 return S_OK;
428}
429
431 (
432 IOleObject *iface
433 )
434{
435 CHECK_EXPECTED_METHOD("OleObject_IsUpToDate");
436 return S_OK;
437}
438
440(
441 IOleObject *iface,
442 CLSID *pClsid
443)
444{
445 CHECK_EXPECTED_METHOD("OleObject_GetUserClassID");
446 return E_NOTIMPL;
447}
448
450(
451 IOleObject *iface,
452 DWORD dwFormOfType,
453 LPOLESTR *pszUserType
454)
455{
456 CHECK_EXPECTED_METHOD("OleObject_GetUserType");
457 return E_NOTIMPL;
458}
459
461(
462 IOleObject *iface,
463 DWORD dwDrawAspect,
464 SIZEL *psizel
465)
466{
467 CHECK_EXPECTED_METHOD("OleObject_SetExtent");
468 return S_OK;
469}
470
472(
473 IOleObject *iface,
474 DWORD dwDrawAspect,
475 SIZEL *psizel
476)
477{
478 CHECK_EXPECTED_METHOD("OleObject_GetExtent");
479 return E_NOTIMPL;
480}
481
483(
484 IOleObject *iface,
485 IAdviseSink *pAdvSink,
486 DWORD *pdwConnection
487)
488{
489 CHECK_EXPECTED_METHOD("OleObject_Advise");
490 return S_OK;
491}
492
494(
495 IOleObject *iface,
496 DWORD dwConnection
497)
498{
499 CHECK_EXPECTED_METHOD("OleObject_Unadvise");
500 return S_OK;
501}
502
504(
505 IOleObject *iface,
506 IEnumSTATDATA **ppenumAdvise
507)
508{
509 CHECK_EXPECTED_METHOD("OleObject_EnumAdvise");
510 return E_NOTIMPL;
511}
512
514(
515 IOleObject *iface,
516 DWORD aspect,
517 DWORD *pdwStatus
518)
519{
520 CHECK_EXPECTED_METHOD("OleObject_GetMiscStatus");
521
522 ok(aspect == DVASPECT_CONTENT, "got aspect %ld\n", aspect);
523
525 {
526 *pdwStatus = OLEMISC_RECOMPOSEONRESIZE;
527 return S_OK;
528 }
529 else
530 {
531 *pdwStatus = 0x1234;
533 }
534}
535
537(
538 IOleObject *iface,
539 LOGPALETTE *pLogpal
540)
541{
542 CHECK_EXPECTED_METHOD("OleObject_SetColorScheme");
543 return E_NOTIMPL;
544}
545
546static const IOleObjectVtbl OleObjectVtbl =
547{
572};
573
575
577{
578 return IOleObject_QueryInterface(&OleObject, riid, ppv);
579}
580
582{
583 return IOleObject_AddRef(&OleObject);
584}
585
587{
588 return IOleObject_Release(&OleObject);
589}
590
592{
593 CHECK_EXPECTED_METHOD("OleObjectPersistStg_GetClassId");
594 return E_NOTIMPL;
595}
596
598(
599 IPersistStorage *iface
600)
601{
602 CHECK_EXPECTED_METHOD("OleObjectPersistStg_IsDirty");
603 return S_OK;
604}
605
607(
608 IPersistStorage *iface,
609 IStorage *pStg
610)
611{
612 CHECK_EXPECTED_METHOD("OleObjectPersistStg_InitNew");
613 return S_OK;
614}
615
617(
618 IPersistStorage *iface,
619 IStorage *pStg
620)
621{
622 CHECK_EXPECTED_METHOD("OleObjectPersistStg_Load");
623 return S_OK;
624}
625
627(
628 IPersistStorage *iface,
629 IStorage *pStgSave,
630 BOOL fSameAsLoad
631)
632{
633 CHECK_EXPECTED_METHOD("OleObjectPersistStg_Save");
634 return S_OK;
635}
636
638(
639 IPersistStorage *iface,
640 IStorage *pStgNew
641)
642{
643 CHECK_EXPECTED_METHOD("OleObjectPersistStg_SaveCompleted");
644 return S_OK;
645}
646
648(
649 IPersistStorage *iface
650)
651{
652 CHECK_EXPECTED_METHOD("OleObjectPersistStg_HandsOffStorage");
653 return S_OK;
654}
655
656static const IPersistStorageVtbl OleObjectPersistStgVtbl =
657{
668};
669
671
673{
674 return IOleObject_QueryInterface(&OleObject, riid, ppv);
675}
676
678{
679 return IOleObject_AddRef(&OleObject);
680}
681
683{
684 return IOleObject_Release(&OleObject);
685}
686
688(
689 IOleCache *iface,
690 FORMATETC *pformatetc,
691 DWORD advf,
692 DWORD *pdwConnection
693)
694{
695 CHECK_EXPECTED_METHOD("OleObjectCache_Cache");
696 if (g_expected_fetc) {
697 ok(pformatetc != NULL, "pformatetc should not be NULL\n");
698 if (pformatetc) {
699 ok(pformatetc->cfFormat == g_expected_fetc->cfFormat,
700 "cfFormat: %x\n", pformatetc->cfFormat);
701 ok((pformatetc->ptd != NULL) == (g_expected_fetc->ptd != NULL),
702 "ptd: %p\n", pformatetc->ptd);
703 ok(pformatetc->dwAspect == g_expected_fetc->dwAspect,
704 "dwAspect: %lx\n", pformatetc->dwAspect);
705 ok(pformatetc->lindex == g_expected_fetc->lindex,
706 "lindex: %lx\n", pformatetc->lindex);
707 ok(pformatetc->tymed == g_expected_fetc->tymed,
708 "tymed: %lx\n", pformatetc->tymed);
709 }
710 } else
711 ok(pformatetc == NULL, "pformatetc should be NULL\n");
712 return S_OK;
713}
714
716(
717 IOleCache *iface,
718 DWORD dwConnection
719)
720{
721 CHECK_EXPECTED_METHOD("OleObjectCache_Uncache");
722 return S_OK;
723}
724
726(
727 IOleCache *iface,
728 IEnumSTATDATA **ppenumSTATDATA
729)
730{
731 CHECK_EXPECTED_METHOD("OleObjectCache_EnumCache");
732 return S_OK;
733}
734
735
737(
738 IOleCache *iface,
739 IDataObject *pDataObject
740)
741{
742 CHECK_EXPECTED_METHOD("OleObjectCache_InitCache");
743 return S_OK;
744}
745
746
748(
749 IOleCache *iface,
750 FORMATETC *pformatetc,
751 STGMEDIUM *pmedium,
752 BOOL fRelease
753)
754{
755 CHECK_EXPECTED_METHOD("OleObjectCache_SetData");
756 return S_OK;
757}
758
759
760static const IOleCacheVtbl OleObjectCacheVtbl =
761{
770};
771
773
775{
777 {
778 *ppv = iface;
779 IClassFactory_AddRef(iface);
780 return S_OK;
781 }
782 *ppv = NULL;
783 return E_NOINTERFACE;
784}
785
787{
788 return 2;
789}
790
792{
793 return 1;
794}
795
797{
798 return IOleObject_QueryInterface(&OleObject, riid, ppv);
799}
800
802{
803 return S_OK;
804}
805
806static const IClassFactoryVtbl OleObjectCFVtbl =
807{
813};
814
816
818{
819 return IOleObject_QueryInterface(&OleObject, riid, ppv);
820}
821
823{
824 return IOleObject_AddRef(&OleObject);
825}
826
828{
829 return IOleObject_Release(&OleObject);
830}
831
833 IRunnableObject *iface,
834 LPCLSID lpClsid)
835{
836 CHECK_EXPECTED_METHOD("OleObjectRunnable_GetRunningClass");
837 return E_NOTIMPL;
838}
839
841 IRunnableObject *iface,
842 LPBINDCTX pbc)
843{
844 CHECK_EXPECTED_METHOD("OleObjectRunnable_Run");
845 return S_OK;
846}
847
849{
850 CHECK_EXPECTED_METHOD("OleObjectRunnable_IsRunning");
851 return g_isRunning;
852}
853
855 IRunnableObject *iface,
856 BOOL fLock,
857 BOOL fLastUnlockCloses)
858{
859 CHECK_EXPECTED_METHOD("OleObjectRunnable_LockRunning");
860 return S_OK;
861}
862
864 IRunnableObject *iface,
865 BOOL fContained)
866{
867 CHECK_EXPECTED_METHOD("OleObjectRunnable_SetContainedObject");
868 return S_OK;
869}
870
871static const IRunnableObjectVtbl OleObjectRunnableVtbl =
872{
881};
882
884
885static const CLSID CLSID_Equation3 = {0x0002CE02, 0x0000, 0x0000, {0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46} };
886
888{
890 {
891 *obj = iface;
892 return S_OK;
893 }
894
895 *obj = NULL;
896 return E_NOINTERFACE;
897}
898
900{
901 return 2;
902}
903
905{
906 return 1;
907}
908
910 void *paspect, DVTARGETDEVICE *ptd, HDC hdcTargetDev, HDC hdcDraw,
911 LPCRECTL bounds, LPCRECTL wbounds, BOOL (STDMETHODCALLTYPE *pfnContinue)(ULONG_PTR dwContinue),
912 ULONG_PTR dwContinue)
913{
914 ok(index == -1, "index=%ld\n", index);
915 return S_OK;
916}
917
919 void *aspect, DVTARGETDEVICE *ptd, HDC hicTargetDev, LOGPALETTE **colorset)
920{
921 ok(0, "unexpected call GetColorSet\n");
922 return E_NOTIMPL;
923}
924
926 void *aspect, DWORD *freeze)
927{
928 ok(0, "unexpected call Freeze\n");
929 return E_NOTIMPL;
930}
931
933{
934 ok(0, "unexpected call Unfreeze\n");
935 return E_NOTIMPL;
936}
937
939{
940 ok(0, "unexpected call SetAdvise\n");
941 return E_NOTIMPL;
942}
943
946{
947 ok(0, "unexpected call GetAdvise\n");
948 return E_NOTIMPL;
949}
950
951static const struct IViewObjectVtbl viewobjectvtbl = {
961};
962
964
965static void test_OleCreate(IStorage *pStorage)
966{
967 HRESULT hr;
969 FORMATETC formatetc;
970 static const struct expected_method methods_olerender_none[] =
971 {
972 { "OleObjectPersistStg_InitNew", 0 },
973 { NULL, 0 }
974 };
975 static const struct expected_method methods_olerender_draw[] =
976 {
977 { "OleObjectPersistStg_InitNew", 0 },
978 { "OleObjectRunnable_Run", 0 },
979 { "OleObjectCache_Cache", 0 },
980 { NULL, 0 }
981 };
982 static const struct expected_method methods_olerender_draw_with_site[] =
983 {
984 { "OleObject_GetMiscStatus", 0 },
985 { "OleObjectPersistStg_InitNew", 0 },
986 { "OleObject_SetClientSite", 0 },
987 { "OleObjectRunnable_Run", 0 },
988 { "OleObjectCache_Cache", 0 },
989 { NULL, 0 }
990 };
991 static const struct expected_method methods_olerender_format[] =
992 {
993 { "OleObject_GetMiscStatus", 0 },
994 { "OleObjectPersistStg_InitNew", 0 },
995 { "OleObject_SetClientSite", 0 },
996 { "OleObjectRunnable_Run", 0 },
997 { "OleObjectCache_Cache", 0 },
998 { NULL, 0 }
999 };
1000 static const struct expected_method methods_olerender_asis[] =
1001 {
1002 { "OleObjectPersistStg_InitNew", 0 },
1003 { NULL, 0 }
1004 };
1005 static const struct expected_method methods_olerender_draw_no_runnable[] =
1006 {
1007 { "OleObjectPersistStg_InitNew", 0 },
1008 { "OleObjectCache_Cache", 0 },
1009 { NULL, 0 },
1010 };
1011 static const struct expected_method methods_olerender_draw_no_cache[] =
1012 {
1013 { "OleObjectPersistStg_InitNew", 0 },
1014 { "OleObjectRunnable_Run", 0 },
1015 { NULL, 0 }
1016 };
1017
1018 g_expected_fetc = &formatetc;
1019 formatetc.cfFormat = 0;
1020 formatetc.ptd = NULL;
1021 formatetc.dwAspect = DVASPECT_CONTENT;
1022 formatetc.lindex = -1;
1023 formatetc.tymed = TYMED_NULL;
1026 expected_method_list = methods_olerender_none;
1027 hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_NONE, NULL, NULL, pStorage, (void **)&pObject);
1028 ok_ole_success(hr, "OleCreate");
1029 IOleObject_Release(pObject);
1031 ok(!ole_object_refcount, "Got outstanding refcount %ld.\n", ole_object_refcount);
1032
1033 expected_method_list = methods_olerender_draw;
1034 hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_DRAW, NULL, NULL, pStorage, (void **)&pObject);
1035 ok_ole_success(hr, "OleCreate");
1036 IOleObject_Release(pObject);
1038 ok(!ole_object_refcount, "Got outstanding refcount %ld.\n", ole_object_refcount);
1039
1040 expected_method_list = methods_olerender_draw_with_site;
1041 hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_DRAW, NULL, (IOleClientSite*)0xdeadbeef, pStorage, (void **)&pObject);
1042 ok_ole_success(hr, "OleCreate");
1043 IOleObject_Release(pObject);
1045 ok(!ole_object_refcount, "Got outstanding refcount %ld.\n", ole_object_refcount);
1046
1047 /* GetMiscStatus fails */
1048 g_GetMiscStatusFailsWith = 0x8fafefaf;
1049 expected_method_list = methods_olerender_draw_with_site;
1050 hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_DRAW, NULL, (IOleClientSite*)0xdeadbeef, pStorage, (void **)&pObject);
1051 ok_ole_success(hr, "OleCreate");
1052 IOleObject_Release(pObject);
1054 ok(!ole_object_refcount, "Got outstanding refcount %ld.\n", ole_object_refcount);
1056
1057 formatetc.cfFormat = CF_TEXT;
1058 formatetc.ptd = NULL;
1059 formatetc.dwAspect = DVASPECT_CONTENT;
1060 formatetc.lindex = -1;
1061 formatetc.tymed = TYMED_HGLOBAL;
1062 expected_method_list = methods_olerender_format;
1063 hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_FORMAT, &formatetc, (IOleClientSite *)0xdeadbeef, pStorage, (void **)&pObject);
1064 ok(hr == S_OK ||
1065 broken(hr == E_INVALIDARG), /* win2k */
1066 "OleCreate failed with error 0x%08lx\n", hr);
1067 if (pObject)
1068 {
1069 IOleObject_Release(pObject);
1071 }
1072 ok(!ole_object_refcount, "Got outstanding refcount %ld.\n", ole_object_refcount);
1073
1074 expected_method_list = methods_olerender_asis;
1075 hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_ASIS, NULL, NULL, pStorage, (void **)&pObject);
1076 ok_ole_success(hr, "OleCreate");
1077 IOleObject_Release(pObject);
1079 ok(!ole_object_refcount, "Got outstanding refcount %ld.\n", ole_object_refcount);
1080
1081 formatetc.cfFormat = 0;
1082 formatetc.tymed = TYMED_NULL;
1083 runnable = NULL;
1084 expected_method_list = methods_olerender_draw_no_runnable;
1085 hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_DRAW, NULL, NULL, pStorage, (void **)&pObject);
1086 ok_ole_success(hr, "OleCreate");
1087 IOleObject_Release(pObject);
1089
1091 cache = NULL;
1092 expected_method_list = methods_olerender_draw_no_cache;
1093 hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_DRAW, NULL, NULL, pStorage, (void **)&pObject);
1094 ok_ole_success(hr, "OleCreate");
1095 IOleObject_Release(pObject);
1097 ok(!ole_object_refcount, "Got outstanding refcount %ld.\n", ole_object_refcount);
1099}
1100
1101static void test_OleLoad(IStorage *pStorage)
1102{
1103 HRESULT hr;
1105 DWORD fmt;
1106
1107 static const struct expected_method methods_oleload[] =
1108 {
1109 { "OleObject_GetMiscStatus", 0 },
1110 { "OleObjectPersistStg_Load", 0 },
1111 { "OleObject_SetClientSite", 0 },
1112 { "OleObject_GetMiscStatus", 0 },
1113 { NULL, 0 }
1114 };
1115
1116 /* Test once with IOleObject_GetMiscStatus failing */
1117 expected_method_list = methods_oleload;
1119 hr = OleLoad(pStorage, &IID_IOleObject, (IOleClientSite *)0xdeadbeef, (void **)&pObject);
1120 ok(hr == S_OK ||
1121 broken(hr == E_INVALIDARG), /* win98 and win2k */
1122 "OleLoad failed with error 0x%08lx\n", hr);
1123 if(pObject)
1124 {
1125 DWORD dwStatus = 0xdeadbeef;
1126 hr = IOleObject_GetMiscStatus(pObject, DVASPECT_CONTENT, &dwStatus);
1127 ok(hr == E_FAIL, "Got 0x%08lx\n", hr);
1128 ok(dwStatus == 0x1234, "Got 0x%08lx\n", dwStatus);
1129
1130 IOleObject_Release(pObject);
1132 }
1133 ok(!ole_object_refcount, "Got outstanding refcount %ld.\n", ole_object_refcount);
1135
1136 /* Test again, let IOleObject_GetMiscStatus succeed. */
1137 expected_method_list = methods_oleload;
1138 hr = OleLoad(pStorage, &IID_IOleObject, (IOleClientSite *)0xdeadbeef, (void **)&pObject);
1139 ok(hr == S_OK ||
1140 broken(hr == E_INVALIDARG), /* win98 and win2k */
1141 "OleLoad failed with error 0x%08lx\n", hr);
1142 if (pObject)
1143 {
1144 DWORD dwStatus = 0xdeadbeef;
1145 hr = IOleObject_GetMiscStatus(pObject, DVASPECT_CONTENT, &dwStatus);
1146 ok(hr == S_OK, "Got 0x%08lx\n", hr);
1147 ok(dwStatus == 1, "Got 0x%08lx\n", dwStatus);
1148
1149 IOleObject_Release(pObject);
1151 }
1152 ok(!ole_object_refcount, "Got outstanding refcount %ld.\n", ole_object_refcount);
1153
1154 for (fmt = CF_TEXT; fmt < CF_MAX; fmt++)
1155 {
1156 static const WCHAR olrepres[] = { 2,'O','l','e','P','r','e','s','0','0','0',0 };
1157 IStorage *stg;
1158 IStream *stream;
1159 IUnknown *obj;
1160 DWORD data, i, data_size;
1162 HDC hdc;
1163 HGDIOBJ hobj;
1164 RECT rc;
1165 char buf[256];
1166
1167 for (i = 0; i < 7; i++)
1168 {
1170 ok(hr == S_OK, "StgCreateDocfile error %#lx\n", hr);
1171
1172 hr = IStorage_SetClass(stg, &CLSID_WineTest);
1173 ok(hr == S_OK, "SetClass error %#lx\n", hr);
1174
1175 hr = IStorage_CreateStream(stg, olrepres, STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE, 0, 0, &stream);
1176 ok(hr == S_OK, "CreateStream error %#lx\n", hr);
1177
1178 data = ~0;
1179 hr = IStream_Write(stream, &data, sizeof(data), NULL);
1180 ok(hr == S_OK, "Write error %#lx\n", hr);
1181
1182 data = fmt;
1183 hr = IStream_Write(stream, &data, sizeof(data), NULL);
1184 ok(hr == S_OK, "Write error %#lx\n", hr);
1185
1186 switch (fmt)
1187 {
1188 case CF_BITMAP:
1189 /* FIXME: figure out stream format */
1190 hobj = CreateBitmap(1, 1, 1, 1, NULL);
1191 data_size = GetBitmapBits(hobj, sizeof(buf), buf);
1192 DeleteObject(hobj);
1193 break;
1194
1195 case CF_METAFILEPICT:
1196 case CF_ENHMETAFILE:
1198 hobj = CloseMetaFile(hdc);
1199 data_size = GetMetaFileBitsEx(hobj, sizeof(buf), buf);
1200 DeleteMetaFile(hobj);
1201 break;
1202
1203 default:
1204 data_size = sizeof(buf);
1205 memset(buf, 'A', sizeof(buf));
1206 break;
1207 }
1208
1209 header.tdSize = sizeof(header.tdSize);
1210 header.dvAspect = DVASPECT_CONTENT;
1211 header.lindex = -1;
1212 header.advf = 1 << i;
1213 header.unknown7 = 0;
1214 header.dwObjectExtentX = 1;
1215 header.dwObjectExtentY = 1;
1216 header.dwSize = data_size;
1217 hr = IStream_Write(stream, &header, sizeof(header), NULL);
1218 ok(hr == S_OK, "Write error %#lx\n", hr);
1219
1220 hr = IStream_Write(stream, buf, data_size, NULL);
1221 ok(hr == S_OK, "Write error %#lx\n", hr);
1222
1223 IStream_Release(stream);
1224
1225 hr = OleLoad(stg, &IID_IUnknown, NULL, (void **)&obj);
1226 /* FIXME: figure out stream format */
1227 if (fmt == CF_BITMAP && hr != S_OK)
1228 {
1229 IStorage_Release(stg);
1230 continue;
1231 }
1232 ok(hr == S_OK, "OleLoad error %#lx: cfFormat = %lu, advf = %#lx\n", hr, fmt, header.advf);
1233
1235 SetRect(&rc, 0, 0, 100, 100);
1236 hr = OleDraw(obj, DVASPECT_CONTENT, hdc, &rc);
1237 DeleteDC(hdc);
1238 if (fmt == CF_METAFILEPICT)
1239 ok(hr == S_OK, "OleDraw error %#lx: cfFormat = %lu, advf = %#lx\n", hr, fmt, header.advf);
1240 else if (fmt == CF_ENHMETAFILE)
1241 todo_wine
1242 ok(hr == S_OK, "OleDraw error %#lx: cfFormat = %lu, advf = %#lx\n", hr, fmt, header.advf);
1243 else
1244 ok(hr == OLE_E_BLANK || hr == OLE_E_NOTRUNNING || hr == E_FAIL, "OleDraw should fail: %#lx, cfFormat = %lu, advf = %#lx\n", hr, fmt, header.advf);
1245
1246 IUnknown_Release(obj);
1247 IStorage_Release(stg);
1248 }
1249 }
1250}
1251
1253{
1254 CHECK_EXPECTED_METHOD("draw_continue");
1255 return TRUE;
1256}
1257
1259{
1260 CHECK_EXPECTED_METHOD("draw_continue_false");
1261 return FALSE;
1262}
1263
1265{
1267 {
1268 *ppv = iface;
1269 IAdviseSink_AddRef(iface);
1270 return S_OK;
1271 }
1272 *ppv = NULL;
1273 return E_NOINTERFACE;
1274}
1275
1277{
1278 return 2;
1279}
1280
1282{
1283 return 1;
1284}
1285
1286
1288 IAdviseSink *iface,
1289 FORMATETC *pFormatetc,
1290 STGMEDIUM *pStgmed)
1291{
1292 CHECK_EXPECTED_METHOD("AdviseSink_OnDataChange");
1293}
1294
1296 IAdviseSink *iface,
1297 DWORD dwAspect,
1298 LONG lindex)
1299{
1300 CHECK_EXPECTED_METHOD("AdviseSink_OnViewChange");
1301}
1302
1304 IAdviseSink *iface,
1305 IMoniker *pmk)
1306{
1307 CHECK_EXPECTED_METHOD("AdviseSink_OnRename");
1308}
1309
1311{
1312 CHECK_EXPECTED_METHOD("AdviseSink_OnSave");
1313}
1314
1316{
1317 CHECK_EXPECTED_METHOD("AdviseSink_OnClose");
1318}
1319
1320static const IAdviseSinkVtbl AdviseSinkVtbl =
1321{
1330};
1331
1333
1335 IDataObject* iface,
1336 REFIID riid,
1337 void** ppvObject)
1338{
1340 {
1341 *ppvObject = iface;
1342 return S_OK;
1343 }
1344 *ppvObject = NULL;
1345 return S_OK;
1346}
1347
1349 IDataObject* iface)
1350{
1351 return 2;
1352}
1353
1355 IDataObject* iface)
1356{
1357 return 1;
1358}
1359
1360static inline BOOL fmtetc_equal( const FORMATETC *a, const FORMATETC *b )
1361{
1362 /* FIXME ptd */
1363 return a->cfFormat == b->cfFormat && a->dwAspect == b->dwAspect &&
1364 a->lindex == b->lindex && a->tymed == b->tymed;
1365
1366}
1367
1368static HRESULT WINAPI DataObject_GetData(IDataObject *iface, FORMATETC *format, STGMEDIUM *medium)
1369{
1370 if (winetest_debug > 1) trace("IDataObject::GetData(cf %u)\n", format->cfFormat);
1371
1373 {
1374 switch (format->cfFormat)
1375 {
1376 case CF_DIB:
1377 medium->tymed = TYMED_HGLOBAL;
1378 medium->pUnkForRelease = NULL;
1379 medium->hGlobal = GlobalAlloc(GMEM_MOVEABLE, sizeof(dib_white));
1380 memcpy(GlobalLock(medium->hGlobal), data_object_dib, sizeof(dib_white));
1381 GlobalUnlock(medium->hGlobal);
1382 return S_OK;
1383 case CF_BITMAP:
1384 create_bitmap(medium);
1385 return S_OK;
1386 case CF_ENHMETAFILE:
1387 create_emf(medium);
1388 return S_OK;
1389 case CF_METAFILEPICT:
1390 create_mfpict(medium);
1391 return S_OK;
1392 case CF_TEXT:
1393 create_text(medium);
1394 return S_OK;
1395 }
1396 }
1397
1398 return S_FALSE;
1399}
1400
1402 IDataObject* iface,
1403 LPFORMATETC pformatetc,
1404 STGMEDIUM* pmedium)
1405{
1406 CHECK_EXPECTED_METHOD("DataObject_GetDataHere");
1407 return E_NOTIMPL;
1408}
1409
1411{
1412 if (winetest_debug > 1) trace("IDataObject::QueryGetData(cf %u)\n", format->cfFormat);
1413
1415}
1416
1418 IDataObject* iface,
1419 LPFORMATETC pformatectIn,
1420 LPFORMATETC pformatetcOut)
1421{
1422 CHECK_EXPECTED_METHOD("DataObject_GetCanonicalFormatEtc");
1423 return E_NOTIMPL;
1424}
1425
1427 IDataObject* iface,
1428 LPFORMATETC pformatetc,
1429 STGMEDIUM* pmedium,
1430 BOOL fRelease)
1431{
1432 CHECK_EXPECTED_METHOD("DataObject_SetData");
1433 return E_NOTIMPL;
1434}
1435
1437 IDataObject* iface,
1438 DWORD dwDirection,
1439 IEnumFORMATETC** ppenumFormatEtc)
1440{
1441 CHECK_EXPECTED_METHOD("DataObject_EnumFormatEtc");
1442 return E_NOTIMPL;
1443}
1444
1446 IDataObject* iface,
1447 FORMATETC* pformatetc,
1448 DWORD advf,
1449 IAdviseSink* pAdvSink,
1450 DWORD* pdwConnection)
1451{
1452 STGMEDIUM stgmedium;
1453
1454 CHECK_EXPECTED_METHOD("DataObject_DAdvise");
1455 *pdwConnection = 1;
1456
1457 if(advf & ADVF_PRIMEFIRST)
1458 {
1459 ok(pformatetc->cfFormat == cf_test_2, "got %04x\n", pformatetc->cfFormat);
1460 stgmedium.tymed = TYMED_HGLOBAL;
1461 stgmedium.hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, 4);
1462 stgmedium.pUnkForRelease = NULL;
1463 IAdviseSink_OnDataChange(pAdvSink, pformatetc, &stgmedium);
1464 }
1465
1466 return S_OK;
1467}
1468
1470 IDataObject* iface,
1471 DWORD dwConnection)
1472{
1473 CHECK_EXPECTED_METHOD("DataObject_DUnadvise");
1474 return S_OK;
1475}
1476
1478 IDataObject* iface,
1479 IEnumSTATDATA** ppenumAdvise)
1480{
1481 CHECK_EXPECTED_METHOD("DataObject_EnumDAdvise");
1483}
1484
1485static IDataObjectVtbl DataObjectVtbl =
1486{
1499};
1500
1502
1504{
1505 *ppv = NULL;
1506 if (IsEqualIID(riid, &IID_IUnknown)) *ppv = iface;
1507 if (*ppv)
1508 {
1509 IUnknown_AddRef((IUnknown *)*ppv);
1510 return S_OK;
1511 }
1512 return E_NOINTERFACE;
1513}
1514
1516{
1517 return 2;
1518}
1519
1521{
1522 return 1;
1523}
1524
1525static const IUnknownVtbl UnknownVtbl =
1526{
1530};
1531
1533
1534static void check_enum_cache(IOleCache2 *cache, const STATDATA *expect, int num)
1535{
1536 IEnumSTATDATA *enum_stat;
1537 STATDATA stat;
1538 HRESULT hr;
1539
1540 hr = IOleCache2_EnumCache( cache, &enum_stat );
1541 ok( hr == S_OK, "got %08lx\n", hr );
1542
1543 while (IEnumSTATDATA_Next(enum_stat, 1, &stat, NULL) == S_OK)
1544 {
1545 ok( stat.formatetc.cfFormat == expect->formatetc.cfFormat, "got %d expect %d\n",
1546 stat.formatetc.cfFormat, expect->formatetc.cfFormat );
1547 ok( !stat.formatetc.ptd == !expect->formatetc.ptd, "got %p expect %p\n",
1548 stat.formatetc.ptd, expect->formatetc.ptd );
1549 ok( stat.formatetc.dwAspect == expect->formatetc.dwAspect, "got %ld expect %ld\n",
1550 stat.formatetc.dwAspect, expect->formatetc.dwAspect );
1551 ok( stat.formatetc.lindex == expect->formatetc.lindex, "got %ld expect %ld\n",
1552 stat.formatetc.lindex, expect->formatetc.lindex );
1553 ok( stat.formatetc.tymed == expect->formatetc.tymed, "got %ld expect %ld\n",
1554 stat.formatetc.tymed, expect->formatetc.tymed );
1555 ok( stat.advf == expect->advf, "got %ld expect %ld\n", stat.advf, expect->advf );
1556 ok( stat.pAdvSink == 0, "got %p\n", stat.pAdvSink );
1557 ok( stat.dwConnection == expect->dwConnection, "got %ld expect %ld\n", stat.dwConnection, expect->dwConnection );
1558 num--;
1559 expect++;
1560 }
1561
1562 ok( num == 0, "incorrect number. num %d\n", num );
1563
1564 IEnumSTATDATA_Release( enum_stat );
1565}
1566
1567static void test_data_cache(void)
1568{
1569 HRESULT hr;
1570 IOleCache2 *pOleCache;
1571 IOleCache *olecache;
1572 IStorage *pStorage;
1573 IUnknown *unk, *unk2;
1574 IPersistStorage *pPS;
1575 IViewObject *pViewObject;
1576 IOleCacheControl *pOleCacheControl;
1577 IDataObject *pCacheDataObject;
1578 FORMATETC fmtetc;
1579 STGMEDIUM stgmedium;
1580 DWORD dwConnection;
1581 DWORD dwFreeze;
1582 RECTL rcBounds;
1583 HDC hdcMem;
1584 CLSID clsid;
1585 char szSystemDir[MAX_PATH];
1586 WCHAR wszPath[MAX_PATH];
1587 static const WCHAR wszShell32[] = {'\\','s','h','e','l','l','3','2','.','d','l','l',0};
1588
1589 static const struct expected_method methods_cacheinitnew[] =
1590 {
1591 { "AdviseSink_OnViewChange", 0 },
1592 { "AdviseSink_OnViewChange", 0 },
1593 { "draw_continue", 1 },
1594 { "draw_continue_false", 1 },
1595 { "DataObject_DAdvise", 0 },
1596 { "DataObject_DAdvise", 0 },
1597 { "DataObject_DUnadvise", 0 },
1598 { "DataObject_DUnadvise", 0 },
1599 { NULL, 0 }
1600 };
1601 static const struct expected_method methods_cacheload[] =
1602 {
1603 { "AdviseSink_OnViewChange", 0 },
1604 { "draw_continue", 1 },
1605 { "draw_continue", 1 },
1606 { "draw_continue", 1 },
1607 { NULL, 0 }
1608 };
1609 static const struct expected_method methods_cachethenrun[] =
1610 {
1611 { "DataObject_DAdvise", 0 },
1612 { "DataObject_DAdvise", 0 },
1613 { "DataObject_DAdvise", 0 },
1614 { "DataObject_DAdvise", 0 },
1615 { "DataObject_DUnadvise", 0 },
1616 { "DataObject_DUnadvise", 0 },
1617 { "DataObject_DUnadvise", 0 },
1618 { "DataObject_DUnadvise", 0 },
1619 { NULL, 0 }
1620 };
1621
1622 GetSystemDirectoryA(szSystemDir, ARRAY_SIZE(szSystemDir));
1623
1624 expected_method_list = methods_cacheinitnew;
1625
1626 fmtetc.cfFormat = CF_METAFILEPICT;
1627 fmtetc.dwAspect = DVASPECT_ICON;
1628 fmtetc.lindex = -1;
1629 fmtetc.ptd = NULL;
1630 fmtetc.tymed = TYMED_MFPICT;
1631
1633 ok_ole_success(hr, "StgCreateDocfile");
1634
1635 /* aggregation */
1636
1637 /* requested is not IUnknown */
1638 hr = CreateDataCache(&unknown, &CLSID_NULL, &IID_IOleCache2, (void**)&pOleCache);
1639 ok(hr == E_INVALIDARG, "got 0x%08lx\n", hr);
1640
1641 hr = CreateDataCache(&unknown, &CLSID_NULL, &IID_IUnknown, (void**)&unk);
1642 ok(hr == S_OK, "got 0x%08lx\n", hr);
1643
1644 hr = IUnknown_QueryInterface(unk, &IID_IOleCache, (void**)&olecache);
1645 ok(hr == S_OK, "got 0x%08lx\n", hr);
1646 hr = IUnknown_QueryInterface(unk, &IID_IOleCache2, (void**)&pOleCache);
1647 ok(hr == S_OK, "got 0x%08lx\n", hr);
1648 ok(unk != (IUnknown*)olecache, "got %p, expected %p\n", olecache, unk);
1649 ok(unk != (IUnknown*)pOleCache, "got %p, expected %p\n", pOleCache, unk);
1650 IOleCache2_Release(pOleCache);
1651 IOleCache_Release(olecache);
1652 IUnknown_Release(unk);
1653
1654 hr = CreateDataCache(NULL, &CLSID_NULL, &IID_IUnknown, (void**)&unk);
1655 ok(hr == S_OK, "got 0x%08lx\n", hr);
1656 hr = IUnknown_QueryInterface(unk, &IID_IOleCache, (void**)&olecache);
1657 ok(hr == S_OK, "got 0x%08lx\n", hr);
1658 hr = IUnknown_QueryInterface(unk, &IID_IOleCache2, (void**)&pOleCache);
1659 ok(hr == S_OK, "got 0x%08lx\n", hr);
1660 hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void**)&unk2);
1661 ok(hr == S_OK, "got 0x%08lx\n", hr);
1662 ok(unk == (IUnknown*)olecache, "got %p, expected %p\n", olecache, unk);
1663 ok(unk == (IUnknown*)pOleCache, "got %p, expected %p\n", pOleCache, unk);
1664 ok(unk == unk2, "got %p, expected %p\n", unk2, unk);
1665 IUnknown_Release(unk2);
1666 IOleCache2_Release(pOleCache);
1667 IOleCache_Release(olecache);
1668 IUnknown_Release(unk);
1669
1670 /* Test with new data */
1671
1672 hr = CreateDataCache(NULL, &CLSID_NULL, &IID_IOleCache2, (LPVOID *)&pOleCache);
1673 ok_ole_success(hr, "CreateDataCache");
1674
1675 hr = IOleCache2_QueryInterface(pOleCache, &IID_IPersistStorage, (LPVOID *)&pPS);
1676 ok_ole_success(hr, "IOleCache_QueryInterface(IID_IPersistStorage)");
1677 hr = IOleCache2_QueryInterface(pOleCache, &IID_IViewObject, (LPVOID *)&pViewObject);
1678 ok_ole_success(hr, "IOleCache_QueryInterface(IID_IViewObject)");
1679 hr = IOleCache2_QueryInterface(pOleCache, &IID_IOleCacheControl, (LPVOID *)&pOleCacheControl);
1680 ok_ole_success(hr, "IOleCache_QueryInterface(IID_IOleCacheControl)");
1681
1682 hr = IViewObject_SetAdvise(pViewObject, DVASPECT_ICON, ADVF_PRIMEFIRST, &AdviseSink);
1683 ok_ole_success(hr, "IViewObject_SetAdvise");
1684
1685 hr = IPersistStorage_InitNew(pPS, pStorage);
1686 ok_ole_success(hr, "IPersistStorage_InitNew");
1687
1688 hr = IPersistStorage_IsDirty(pPS);
1689 ok_ole_success(hr, "IPersistStorage_IsDirty");
1690
1691 hr = IPersistStorage_GetClassID(pPS, &clsid);
1692 ok_ole_success(hr, "IPersistStorage_GetClassID");
1693 ok(IsEqualCLSID(&clsid, &IID_NULL), "clsid should be blank\n");
1694
1695 hr = IOleCache2_Uncache(pOleCache, 0xdeadbeef);
1696 ok(hr == OLE_E_NOCONNECTION, "IOleCache_Uncache with invalid value should return OLE_E_NOCONNECTION instead of 0x%lx\n", hr);
1697
1698 /* Both tests crash on NT4 and below. StgCreatePropSetStg is only available on w2k and above. */
1699 if (GetProcAddress(GetModuleHandleA("ole32.dll"), "StgCreatePropSetStg"))
1700 {
1701 hr = IOleCache2_Cache(pOleCache, NULL, 0, &dwConnection);
1702 ok(hr == E_INVALIDARG, "IOleCache_Cache with NULL fmtetc should have returned E_INVALIDARG instead of 0x%08lx\n", hr);
1703
1704 hr = IOleCache2_Cache(pOleCache, NULL, 0, NULL);
1705 ok(hr == E_INVALIDARG, "IOleCache_Cache with NULL pdwConnection should have returned E_INVALIDARG instead of 0x%08lx\n", hr);
1706 }
1707 else
1708 {
1709 skip("tests with NULL parameters will crash on NT4 and below\n");
1710 }
1711
1712 for (fmtetc.cfFormat = CF_TEXT; fmtetc.cfFormat < CF_MAX; fmtetc.cfFormat++)
1713 {
1714 int i;
1715 fmtetc.dwAspect = DVASPECT_THUMBNAIL;
1716 for (i = 0; i < 7; i++)
1717 {
1718 fmtetc.tymed = 1 << i;
1719 hr = IOleCache2_Cache(pOleCache, &fmtetc, 0, &dwConnection);
1720 if ((fmtetc.cfFormat == CF_METAFILEPICT && fmtetc.tymed == TYMED_MFPICT) ||
1721 (fmtetc.cfFormat == CF_BITMAP && fmtetc.tymed == TYMED_GDI) ||
1722 (fmtetc.cfFormat == CF_DIB && fmtetc.tymed == TYMED_HGLOBAL) ||
1723 (fmtetc.cfFormat == CF_ENHMETAFILE && fmtetc.tymed == TYMED_ENHMF))
1724 ok(hr == S_OK, "IOleCache_Cache cfFormat = %d, tymed = %ld should have returned S_OK instead of 0x%08lx\n",
1725 fmtetc.cfFormat, fmtetc.tymed, hr);
1726 else if (fmtetc.tymed == TYMED_HGLOBAL)
1728 broken(hr == S_OK && fmtetc.cfFormat == CF_BITMAP) /* Win9x & NT4 */,
1729 "IOleCache_Cache cfFormat = %d, tymed = %ld should have returned CACHE_S_FORMATETC_NOTSUPPORTED instead of 0x%08lx\n",
1730 fmtetc.cfFormat, fmtetc.tymed, hr);
1731 else
1732 ok(hr == DV_E_TYMED, "IOleCache_Cache cfFormat = %d, tymed = %ld should have returned DV_E_TYMED instead of 0x%08lx\n",
1733 fmtetc.cfFormat, fmtetc.tymed, hr);
1734 if (SUCCEEDED(hr))
1735 {
1736 hr = IOleCache2_Uncache(pOleCache, dwConnection);
1737 ok_ole_success(hr, "IOleCache_Uncache");
1738 }
1739 }
1740 }
1741
1742 fmtetc.cfFormat = CF_BITMAP;
1743 fmtetc.dwAspect = DVASPECT_THUMBNAIL;
1744 fmtetc.tymed = TYMED_GDI;
1745 hr = IOleCache2_Cache(pOleCache, &fmtetc, 0, &dwConnection);
1746 ok_ole_success(hr, "IOleCache_Cache");
1747
1748 fmtetc.cfFormat = 0;
1749 fmtetc.dwAspect = DVASPECT_ICON;
1750 fmtetc.tymed = TYMED_MFPICT;
1751 hr = IOleCache2_Cache(pOleCache, &fmtetc, 0, &dwConnection);
1752 ok_ole_success(hr, "IOleCache_Cache");
1753
1754 MultiByteToWideChar(CP_ACP, 0, szSystemDir, -1, wszPath, ARRAY_SIZE(wszPath));
1755 memcpy(wszPath+lstrlenW(wszPath), wszShell32, sizeof(wszShell32));
1756
1757 fmtetc.cfFormat = CF_METAFILEPICT;
1758 stgmedium.tymed = TYMED_MFPICT;
1759 stgmedium.hMetaFilePict = OleMetafilePictFromIconAndLabel(
1760 LoadIconA(NULL, (LPSTR)IDI_APPLICATION), wszPath, wszPath, 0);
1761 stgmedium.pUnkForRelease = NULL;
1762
1763 fmtetc.dwAspect = DVASPECT_CONTENT;
1764 hr = IOleCache2_SetData(pOleCache, &fmtetc, &stgmedium, FALSE);
1765 ok(hr == OLE_E_BLANK, "IOleCache_SetData for aspect not in cache should have return OLE_E_BLANK instead of 0x%08lx\n", hr);
1766
1767 fmtetc.dwAspect = DVASPECT_ICON;
1768 hr = IOleCache2_SetData(pOleCache, &fmtetc, &stgmedium, FALSE);
1769 ok_ole_success(hr, "IOleCache_SetData");
1770 ReleaseStgMedium(&stgmedium);
1771
1772 hr = IViewObject_Freeze(pViewObject, DVASPECT_ICON, -1, NULL, &dwFreeze);
1773 todo_wine {
1774 ok_ole_success(hr, "IViewObject_Freeze");
1775 hr = IViewObject_Freeze(pViewObject, DVASPECT_CONTENT, -1, NULL, &dwFreeze);
1776 ok(hr == OLE_E_BLANK, "IViewObject_Freeze with uncached aspect should have returned OLE_E_BLANK instead of 0x%08lx\n", hr);
1777 }
1778
1779 rcBounds.left = 0;
1780 rcBounds.top = 0;
1781 rcBounds.right = 100;
1782 rcBounds.bottom = 100;
1784
1785 hr = IViewObject_Draw(pViewObject, DVASPECT_ICON, -1, NULL, NULL, NULL, hdcMem, &rcBounds, NULL, draw_continue, 0xdeadbeef);
1786 ok_ole_success(hr, "IViewObject_Draw");
1787
1788 hr = IViewObject_Draw(pViewObject, DVASPECT_CONTENT, -1, NULL, NULL, NULL, hdcMem, &rcBounds, NULL, draw_continue, 0xdeadbeef);
1789 ok(hr == OLE_E_BLANK, "IViewObject_Draw with uncached aspect should have returned OLE_E_BLANK instead of 0x%08lx\n", hr);
1790
1791 /* a NULL draw_continue fn ptr */
1792 hr = IViewObject_Draw(pViewObject, DVASPECT_ICON, -1, NULL, NULL, NULL, hdcMem, &rcBounds, NULL, NULL, 0xdeadbeef);
1793 ok_ole_success(hr, "IViewObject_Draw");
1794
1795 /* draw_continue that returns FALSE to abort drawing */
1796 hr = IViewObject_Draw(pViewObject, DVASPECT_ICON, -1, NULL, NULL, NULL, hdcMem, &rcBounds, NULL, draw_continue_false, 0xdeadbeef);
1797 ok(hr == E_ABORT ||
1798 broken(hr == S_OK), /* win9x may skip the callbacks */
1799 "IViewObject_Draw with draw_continue_false returns 0x%08lx\n", hr);
1800
1802
1803 hr = IOleCacheControl_OnRun(pOleCacheControl, &DataObject);
1804 ok_ole_success(hr, "IOleCacheControl_OnRun");
1805
1806 hr = IPersistStorage_Save(pPS, pStorage, TRUE);
1807 ok_ole_success(hr, "IPersistStorage_Save");
1808
1809 hr = IPersistStorage_SaveCompleted(pPS, NULL);
1810 ok_ole_success(hr, "IPersistStorage_SaveCompleted");
1811
1812 hr = IPersistStorage_IsDirty(pPS);
1813 ok(hr == S_FALSE, "IPersistStorage_IsDirty should have returned S_FALSE instead of 0x%lx\n", hr);
1814
1815 IPersistStorage_Release(pPS);
1816 IViewObject_Release(pViewObject);
1817 IOleCache2_Release(pOleCache);
1818 IOleCacheControl_Release(pOleCacheControl);
1819
1821
1822 /* Test with loaded data */
1823 expected_method_list = methods_cacheload;
1824
1825 hr = CreateDataCache(NULL, &CLSID_NULL, &IID_IOleCache2, (LPVOID *)&pOleCache);
1826 ok_ole_success(hr, "CreateDataCache");
1827
1828 hr = IOleCache2_QueryInterface(pOleCache, &IID_IPersistStorage, (LPVOID *)&pPS);
1829 ok_ole_success(hr, "IOleCache_QueryInterface(IID_IPersistStorage)");
1830 hr = IOleCache2_QueryInterface(pOleCache, &IID_IViewObject, (LPVOID *)&pViewObject);
1831 ok_ole_success(hr, "IOleCache_QueryInterface(IID_IViewObject)");
1832
1833 hr = IViewObject_SetAdvise(pViewObject, DVASPECT_ICON, ADVF_PRIMEFIRST, &AdviseSink);
1834 ok_ole_success(hr, "IViewObject_SetAdvise");
1835
1836 hr = IPersistStorage_Load(pPS, pStorage);
1837 ok_ole_success(hr, "IPersistStorage_Load");
1838
1839 hr = IPersistStorage_IsDirty(pPS);
1840 ok(hr == S_FALSE, "IPersistStorage_IsDirty should have returned S_FALSE instead of 0x%lx\n", hr);
1841
1842 fmtetc.cfFormat = 0;
1843 fmtetc.dwAspect = DVASPECT_ICON;
1844 fmtetc.lindex = -1;
1845 fmtetc.ptd = NULL;
1846 fmtetc.tymed = TYMED_MFPICT;
1847 hr = IOleCache2_Cache(pOleCache, &fmtetc, 0, &dwConnection);
1848 ok(hr == CACHE_S_SAMECACHE, "IOleCache_Cache with already loaded data format type should return CACHE_S_SAMECACHE instead of 0x%lx\n", hr);
1849
1850 rcBounds.left = 0;
1851 rcBounds.top = 0;
1852 rcBounds.right = 100;
1853 rcBounds.bottom = 100;
1855
1856 hr = IViewObject_Draw(pViewObject, DVASPECT_ICON, -1, NULL, NULL, NULL, hdcMem, &rcBounds, NULL, draw_continue, 0xdeadbeef);
1857 ok_ole_success(hr, "IViewObject_Draw");
1858
1859 hr = IViewObject_Draw(pViewObject, DVASPECT_CONTENT, -1, NULL, NULL, NULL, hdcMem, &rcBounds, NULL, draw_continue, 0xdeadbeef);
1860 ok(hr == OLE_E_BLANK, "IViewObject_Draw with uncached aspect should have returned OLE_E_BLANK instead of 0x%08lx\n", hr);
1861
1862 /* unload the cached storage object, causing it to be reloaded */
1863 hr = IOleCache2_DiscardCache(pOleCache, DISCARDCACHE_NOSAVE);
1864 ok_ole_success(hr, "IOleCache2_DiscardCache");
1865 hr = IViewObject_Draw(pViewObject, DVASPECT_ICON, -1, NULL, NULL, NULL, hdcMem, &rcBounds, NULL, draw_continue, 0xdeadbeef);
1866 ok_ole_success(hr, "IViewObject_Draw");
1867
1868 /* unload the cached storage object, but don't allow it to be reloaded */
1869 hr = IPersistStorage_HandsOffStorage(pPS);
1870 ok_ole_success(hr, "IPersistStorage_HandsOffStorage");
1871 hr = IViewObject_Draw(pViewObject, DVASPECT_ICON, -1, NULL, NULL, NULL, hdcMem, &rcBounds, NULL, draw_continue, 0xdeadbeef);
1872 ok_ole_success(hr, "IViewObject_Draw");
1873 hr = IOleCache2_DiscardCache(pOleCache, DISCARDCACHE_NOSAVE);
1874 ok_ole_success(hr, "IOleCache2_DiscardCache");
1875 hr = IViewObject_Draw(pViewObject, DVASPECT_ICON, -1, NULL, NULL, NULL, hdcMem, &rcBounds, NULL, draw_continue, 0xdeadbeef);
1876 ok(hr == OLE_E_BLANK, "IViewObject_Draw with uncached aspect should have returned OLE_E_BLANK instead of 0x%08lx\n", hr);
1877
1879
1880 hr = IOleCache2_InitCache(pOleCache, &DataObject);
1881 ok(hr == CACHE_E_NOCACHE_UPDATED, "IOleCache_InitCache should have returned CACHE_E_NOCACHE_UPDATED instead of 0x%08lx\n", hr);
1882
1883 IPersistStorage_Release(pPS);
1884 IViewObject_Release(pViewObject);
1885 IOleCache2_Release(pOleCache);
1886
1888
1889 hr = CreateDataCache(NULL, &CLSID_NULL, &IID_IOleCache2, (LPVOID *)&pOleCache);
1890 ok_ole_success(hr, "CreateDataCache");
1891
1892 expected_method_list = methods_cachethenrun;
1893
1894 hr = IOleCache2_QueryInterface(pOleCache, &IID_IDataObject, (LPVOID *)&pCacheDataObject);
1895 ok_ole_success(hr, "IOleCache_QueryInterface(IID_IDataObject)");
1896 hr = IOleCache2_QueryInterface(pOleCache, &IID_IOleCacheControl, (LPVOID *)&pOleCacheControl);
1897 ok_ole_success(hr, "IOleCache_QueryInterface(IID_IOleCacheControl)");
1898
1899 fmtetc.cfFormat = CF_METAFILEPICT;
1900 fmtetc.dwAspect = DVASPECT_CONTENT;
1901 fmtetc.tymed = TYMED_MFPICT;
1902
1903 hr = IOleCache2_Cache(pOleCache, &fmtetc, 0, &dwConnection);
1904 ok_ole_success(hr, "IOleCache_Cache");
1905
1906 hr = IDataObject_GetData(pCacheDataObject, &fmtetc, &stgmedium);
1907 ok(hr == OLE_E_BLANK, "got %08lx\n", hr);
1908
1909 fmtetc.cfFormat = cf_test_1;
1910 fmtetc.dwAspect = DVASPECT_CONTENT;
1911 fmtetc.tymed = TYMED_HGLOBAL;
1912
1913 hr = IOleCache2_Cache(pOleCache, &fmtetc, 0, &dwConnection);
1914 ok(hr == CACHE_S_FORMATETC_NOTSUPPORTED, "got %08lx\n", hr);
1915
1916 hr = IDataObject_GetData(pCacheDataObject, &fmtetc, &stgmedium);
1917 ok(hr == OLE_E_BLANK, "got %08lx\n", hr);
1918
1919 fmtetc.cfFormat = cf_test_2;
1920 hr = IOleCache2_Cache(pOleCache, &fmtetc, ADVF_PRIMEFIRST, &dwConnection);
1921 ok(hr == CACHE_S_FORMATETC_NOTSUPPORTED, "got %08lx\n", hr);
1922
1923 hr = IDataObject_GetData(pCacheDataObject, &fmtetc, &stgmedium);
1924 ok(hr == OLE_E_BLANK, "got %08lx\n", hr);
1925
1926 hr = IOleCacheControl_OnRun(pOleCacheControl, &DataObject);
1927 ok_ole_success(hr, "IOleCacheControl_OnRun");
1928
1929 fmtetc.cfFormat = cf_test_3;
1930 hr = IOleCache2_Cache(pOleCache, &fmtetc, 0, &dwConnection);
1931 ok(hr == CACHE_S_FORMATETC_NOTSUPPORTED, "got %08lx\n", hr);
1932
1933 fmtetc.cfFormat = cf_test_1;
1934 hr = IDataObject_GetData(pCacheDataObject, &fmtetc, &stgmedium);
1935 ok(hr == OLE_E_BLANK, "got %08lx\n", hr);
1936
1937 fmtetc.cfFormat = cf_test_2;
1938 hr = IDataObject_GetData(pCacheDataObject, &fmtetc, &stgmedium);
1939 ok(hr == S_OK, "got %08lx\n", hr);
1940 ReleaseStgMedium(&stgmedium);
1941
1942 fmtetc.cfFormat = cf_test_3;
1943 hr = IDataObject_GetData(pCacheDataObject, &fmtetc, &stgmedium);
1944 ok(hr == OLE_E_BLANK, "got %08lx\n", hr);
1945
1946 IOleCacheControl_Release(pOleCacheControl);
1947 IDataObject_Release(pCacheDataObject);
1948 IOleCache2_Release(pOleCache);
1949
1951
1952 IStorage_Release(pStorage);
1953}
1954
1955static const WCHAR CONTENTS[] = {'C','O','N','T','E','N','T','S',0};
1956
1957/* 2 x 1 x 32 bpp dib. PelsPerMeter = 200x400 */
1958static BYTE file_dib[] =
1959{
1960 0x42, 0x4d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00,
1961 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,
1962 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00,
1963 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00,
1964 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x00,
1965 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00,
1966 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
1967 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
1968};
1969
1971{
1972 IStorage *stg;
1973 IStream *stm;
1974 HRESULT hr;
1975 ULONG written;
1976
1978 ok( hr == S_OK, "got %08lx\n", hr);
1979 hr = IStorage_SetClass( stg, &CLSID_Picture_Dib );
1980 ok( hr == S_OK, "got %08lx\n", hr);
1981 hr = IStorage_CreateStream( stg, CONTENTS, STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE, 0, 0, &stm );
1982 ok( hr == S_OK, "got %08lx\n", hr);
1983 if (num == 1) /* Set biXPelsPerMeter = 0 */
1984 {
1985 file_dib[0x26] = 0;
1986 file_dib[0x27] = 0;
1987 }
1988 hr = IStream_Write( stm, file_dib, sizeof(file_dib), &written );
1989 ok( hr == S_OK, "got %08lx\n", hr);
1990 IStream_Release( stm );
1991 return stg;
1992}
1993
1995{
1996 HRESULT hr;
1997 IUnknown *unk;
1998 IPersistStorage *persist;
2001 IStorage *stg;
2003 FORMATETC fmt = {CF_DIB, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
2004 STGMEDIUM med;
2005 CLSID cls;
2006 SIZEL sz;
2007 BYTE *ptr;
2008 BITMAPINFOHEADER expect_info;
2009 STATDATA enum_expect[] =
2010 {
2011 {{ CF_DIB, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }, 0, NULL, 1 },
2012 {{ CF_BITMAP, 0, DVASPECT_CONTENT, -1, TYMED_GDI }, 0, NULL, 1 },
2013 };
2014
2016 ok( SUCCEEDED(hr), "got %08lx\n", hr );
2017 hr = IUnknown_QueryInterface( unk, &IID_IPersistStorage, (void **)&persist );
2018 ok( SUCCEEDED(hr), "got %08lx\n", hr );
2019 hr = IUnknown_QueryInterface( unk, &IID_IDataObject, (void **)&data );
2020 ok( SUCCEEDED(hr), "got %08lx\n", hr );
2021 hr = IUnknown_QueryInterface( unk, &IID_IViewObject2, (void **)&view );
2022 ok( SUCCEEDED(hr), "got %08lx\n", hr );
2023 hr = IUnknown_QueryInterface( unk, &IID_IOleCache2, (void **)&cache );
2024 ok( SUCCEEDED(hr), "got %08lx\n", hr );
2025
2026 stg = create_storage( num );
2027
2028 hr = IPersistStorage_Load( persist, stg );
2029 ok( SUCCEEDED(hr), "got %08lx\n", hr );
2030 IStorage_Release( stg );
2031
2032 hr = IPersistStorage_GetClassID( persist, &cls );
2033 ok( SUCCEEDED(hr), "got %08lx\n", hr );
2034 ok( IsEqualCLSID( &cls, &CLSID_Picture_Dib ), "class id mismatch\n" );
2035
2036 hr = IDataObject_GetData( data, &fmt, &med );
2037 ok( SUCCEEDED(hr), "got %08lx\n", hr );
2038 ok( med.tymed == TYMED_HGLOBAL, "got %lx\n", med.tymed );
2039 ok( GlobalSize( med.hGlobal ) >= sizeof(dib_white) - sizeof(BITMAPFILEHEADER),
2040 "got %Iu\n", GlobalSize( med.hGlobal ) );
2041 ptr = GlobalLock( med.hGlobal );
2042
2043 expect_info = *(BITMAPINFOHEADER *)(file_dib + sizeof(BITMAPFILEHEADER));
2044 if (expect_info.biXPelsPerMeter == 0 || expect_info.biYPelsPerMeter == 0)
2045 {
2046 HDC hdc = GetDC( 0 );
2047 expect_info.biXPelsPerMeter = MulDiv( GetDeviceCaps( hdc, LOGPIXELSX ), 10000, 254 );
2048 expect_info.biYPelsPerMeter = MulDiv( GetDeviceCaps( hdc, LOGPIXELSY ), 10000, 254 );
2049 ReleaseDC( 0, hdc );
2050 }
2051 ok( !memcmp( ptr, &expect_info, sizeof(expect_info) ), "mismatch\n" );
2052 ok( !memcmp( ptr + sizeof(expect_info), file_dib + sizeof(BITMAPFILEHEADER) + sizeof(expect_info),
2053 sizeof(file_dib) - sizeof(BITMAPFILEHEADER) - sizeof(expect_info) ), "mismatch\n" );
2054 GlobalUnlock( med.hGlobal );
2055 ReleaseStgMedium( &med );
2056
2057 check_enum_cache( cache, enum_expect, 2 );
2058
2059 hr = IViewObject2_GetExtent( view, DVASPECT_CONTENT, -1, NULL, &sz );
2060 ok( SUCCEEDED(hr), "got %08lx\n", hr );
2061 if (num == 0)
2062 {
2063 ok( sz.cx == 1000, "got %ld\n", sz.cx );
2064 ok( sz.cy == 250, "got %ld\n", sz.cy );
2065 }
2066 else
2067 {
2068 HDC hdc = GetDC( 0 );
2069 LONG x = 2 * 2540 / GetDeviceCaps( hdc, LOGPIXELSX );
2070 LONG y = 1 * 2540 / GetDeviceCaps( hdc, LOGPIXELSY );
2071 ok( sz.cx == x, "got %ld %ld\n", sz.cx, x );
2072 ok( sz.cy == y, "got %ld %ld\n", sz.cy, y );
2073
2074 ReleaseDC( 0, hdc );
2075 }
2076
2077 IOleCache2_Release( cache );
2078 IViewObject2_Release( view );
2079 IDataObject_Release( data );
2080 IPersistStorage_Release( persist );
2081 IUnknown_Release( unk );
2082}
2083
2084static void check_bitmap_size( HBITMAP h, int cx, int cy )
2085{
2086 BITMAP bm;
2087
2088 GetObjectW( h, sizeof(bm), &bm );
2089 ok( bm.bmWidth == cx, "got %d expect %d\n", bm.bmWidth, cx );
2090 ok( bm.bmHeight == cy, "got %d expect %d\n", bm.bmHeight, cy );
2091}
2092
2093static void check_dib_size( HGLOBAL h, int cx, int cy )
2094{
2096
2097 info = GlobalLock( h );
2098 ok( info->bmiHeader.biWidth == cx, "got %ld expect %d\n", info->bmiHeader.biWidth, cx );
2099 ok( info->bmiHeader.biHeight == cy, "got %ld expect %d\n", info->bmiHeader.biHeight, cy );
2100 GlobalUnlock( h );
2101}
2102
2103static void test_data_cache_cache(void)
2104{
2105 HRESULT hr;
2108 FORMATETC fmt;
2109 DWORD conn;
2110 STGMEDIUM med;
2111 STATDATA expect[] =
2112 {
2113 {{ CF_DIB, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }, 0, NULL, 0 },
2114 {{ CF_BITMAP, 0, DVASPECT_CONTENT, -1, TYMED_GDI }, 0, NULL, 0 },
2115 {{ CF_METAFILEPICT, 0, DVASPECT_CONTENT, -1, TYMED_MFPICT }, 0, NULL, 0 },
2116 {{ CF_ENHMETAFILE, 0, DVASPECT_CONTENT, -1, TYMED_ENHMF }, 0, NULL, 0 }
2117 };
2118 STATDATA view_caching[] =
2119 {
2120 {{ 0, 0, DVASPECT_CONTENT, -1, TYMED_ENHMF }, 0, NULL, 0 },
2121 {{ 0, 0, DVASPECT_THUMBNAIL, -1, TYMED_HGLOBAL }, 0, NULL, 0 },
2122 {{ 0, 0, DVASPECT_DOCPRINT, -1, TYMED_HGLOBAL }, 0, NULL, 0 },
2123 {{ CF_METAFILEPICT, 0, DVASPECT_ICON, -1, TYMED_MFPICT }, 0, NULL, 0 }
2124 };
2125
2127 ok( hr == S_OK, "got %08lx\n", hr );
2128
2129 /* create a dib entry which will also create a bitmap entry too */
2130 fmt.cfFormat = CF_DIB;
2131 fmt.ptd = NULL;
2132 fmt.dwAspect = DVASPECT_CONTENT;
2133 fmt.lindex = -1;
2134 fmt.tymed = TYMED_HGLOBAL;
2135
2136 hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
2137 ok( hr == S_OK, "got %08lx\n", hr );
2138 ok( conn == 2, "got %ld\n", conn );
2139 expect[0].dwConnection = conn;
2140 expect[1].dwConnection = conn;
2141
2143
2144 /* now try to add a bitmap */
2145 fmt.cfFormat = CF_BITMAP;
2146 fmt.tymed = TYMED_GDI;
2147
2148 hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
2149 ok( hr == CACHE_S_SAMECACHE, "got %08lx\n", hr );
2150
2151 /* metafile */
2152 fmt.cfFormat = CF_METAFILEPICT;
2153 fmt.tymed = TYMED_MFPICT;
2154
2155 hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
2156 ok( hr == S_OK, "got %08lx\n", hr );
2157 ok( conn == 3, "got %ld\n", conn );
2158 expect[2].dwConnection = conn;
2159
2161
2162 /* enhmetafile */
2163 fmt.cfFormat = CF_ENHMETAFILE;
2164 fmt.tymed = TYMED_ENHMF;
2165
2166 hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
2167 ok( hr == S_OK, "got %08lx\n", hr );
2168 ok( conn == 4, "got %ld\n", conn );
2169 expect[3].dwConnection = conn;
2170
2172
2173 /* uncache everything */
2174 hr = IOleCache2_Uncache( cache, expect[3].dwConnection );
2175 ok( hr == S_OK, "got %08lx\n", hr );
2176 hr = IOleCache2_Uncache( cache, expect[2].dwConnection );
2177 ok( hr == S_OK, "got %08lx\n", hr );
2178 hr = IOleCache2_Uncache( cache, expect[0].dwConnection );
2179 ok( hr == S_OK, "got %08lx\n", hr );
2180 hr = IOleCache2_Uncache( cache, expect[0].dwConnection );
2181 ok( hr == OLE_E_NOCONNECTION, "got %08lx\n", hr );
2182
2184
2185 /* just create a bitmap entry which again adds both dib and bitmap */
2186 fmt.cfFormat = CF_BITMAP;
2187 fmt.tymed = TYMED_GDI;
2188
2189 hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
2190 ok( hr == S_OK, "got %08lx\n", hr );
2191
2192 expect[0].dwConnection = conn;
2193 expect[1].dwConnection = conn;
2194
2196
2197 /* Try setting a 1x1 bitmap */
2198 hr = IOleCache2_QueryInterface( cache, &IID_IDataObject, (void **) &data );
2199 ok( hr == S_OK, "got %08lx\n", hr );
2200
2201 create_bitmap( &med );
2202
2203 hr = IOleCache2_SetData( cache, &fmt, &med, TRUE );
2204 ok( hr == S_OK, "got %08lx\n", hr );
2205
2206 hr = IDataObject_GetData( data, &fmt, &med );
2207 ok( hr == S_OK, "got %08lx\n", hr );
2208 ok( med.tymed == TYMED_GDI, "got %ld\n", med.tymed );
2209 check_bitmap_size( med.hBitmap, 1, 1 );
2210 ReleaseStgMedium( &med );
2211
2212 fmt.cfFormat = CF_DIB;
2213 fmt.tymed = TYMED_HGLOBAL;
2214 hr = IDataObject_GetData( data, &fmt, &med );
2215 ok( hr == S_OK, "got %08lx\n", hr );
2216 ok( med.tymed == TYMED_HGLOBAL, "got %ld\n", med.tymed );
2217 check_dib_size( med.hGlobal, 1, 1 );
2218 ReleaseStgMedium( &med );
2219
2220 /* Now set a 2x1 dib */
2221 fmt.cfFormat = CF_DIB;
2222 fmt.tymed = TYMED_HGLOBAL;
2223 create_dib( &med );
2224
2225 hr = IOleCache2_SetData( cache, &fmt, &med, TRUE );
2226 ok( hr == S_OK, "got %08lx\n", hr );
2227
2228 fmt.cfFormat = CF_BITMAP;
2229 fmt.tymed = TYMED_GDI;
2230 hr = IDataObject_GetData( data, &fmt, &med );
2231 ok( hr == S_OK, "got %08lx\n", hr );
2232 ok( med.tymed == TYMED_GDI, "got %ld\n", med.tymed );
2233 check_bitmap_size( med.hBitmap, 2, 1 );
2234 ReleaseStgMedium( &med );
2235
2236 fmt.cfFormat = CF_DIB;
2237 fmt.tymed = TYMED_HGLOBAL;
2238 hr = IDataObject_GetData( data, &fmt, &med );
2239 ok( hr == S_OK, "got %08lx\n", hr );
2240 ok( med.tymed == TYMED_HGLOBAL, "got %ld\n", med.tymed );
2241 check_dib_size( med.hGlobal, 2, 1 );
2242 ReleaseStgMedium( &med );
2243
2244 /* uncache everything */
2245 hr = IOleCache2_Uncache( cache, conn );
2246 ok( hr == S_OK, "got %08lx\n", hr );
2247
2248 /* view caching */
2249 fmt.cfFormat = 0;
2250 fmt.tymed = TYMED_ENHMF;
2251 hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
2252 ok( hr == S_OK, "got %08lx\n", hr );
2253 view_caching[0].dwConnection = conn;
2254
2255 fmt.tymed = TYMED_HGLOBAL;
2256 hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
2257 ok( hr == CACHE_S_SAMECACHE, "got %08lx\n", hr );
2258
2259 fmt.dwAspect = DVASPECT_THUMBNAIL;
2260 hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
2261 ok( hr == S_OK, "got %08lx\n", hr );
2262 view_caching[1].dwConnection = conn;
2263
2264 fmt.dwAspect = DVASPECT_DOCPRINT;
2265 hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
2266 ok( hr == S_OK, "got %08lx\n", hr );
2267 view_caching[2].dwConnection = conn;
2268
2269 /* DVASPECT_ICON view cache gets mapped to CF_METAFILEPICT */
2270 fmt.dwAspect = DVASPECT_ICON;
2271 hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
2272 ok( hr == S_OK, "got %08lx\n", hr );
2273 view_caching[3].dwConnection = conn;
2274
2275 check_enum_cache( cache, view_caching, 4 );
2276
2277 /* uncache everything */
2278 hr = IOleCache2_Uncache( cache, view_caching[3].dwConnection );
2279 ok( hr == S_OK, "got %08lx\n", hr );
2280 hr = IOleCache2_Uncache( cache, view_caching[2].dwConnection );
2281 ok( hr == S_OK, "got %08lx\n", hr );
2282 hr = IOleCache2_Uncache( cache, view_caching[1].dwConnection );
2283 ok( hr == S_OK, "got %08lx\n", hr );
2284 hr = IOleCache2_Uncache( cache, view_caching[0].dwConnection );
2285 ok( hr == S_OK, "got %08lx\n", hr );
2286
2287 /* Only able to set cfFormat == CF_METAFILEPICT (or == 0, see above) for DVASPECT_ICON */
2288 fmt.dwAspect = DVASPECT_ICON;
2289 fmt.cfFormat = CF_DIB;
2290 fmt.tymed = TYMED_HGLOBAL;
2291 hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
2292 ok( hr == DV_E_FORMATETC, "got %08lx\n", hr );
2293 fmt.cfFormat = CF_BITMAP;
2294 fmt.tymed = TYMED_GDI;
2295 hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
2296 ok( hr == DV_E_FORMATETC, "got %08lx\n", hr );
2297 fmt.cfFormat = CF_ENHMETAFILE;
2298 fmt.tymed = TYMED_ENHMF;
2299 hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
2300 ok( hr == DV_E_FORMATETC, "got %08lx\n", hr );
2301 fmt.cfFormat = CF_METAFILEPICT;
2302 fmt.tymed = TYMED_MFPICT;
2303 hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
2304 ok( hr == S_OK, "got %08lx\n", hr );
2305
2306 /* uncache everything */
2307 hr = IOleCache2_Uncache( cache, conn );
2308 ok( hr == S_OK, "got %08lx\n", hr );
2309
2310 /* tymed == 0 */
2311 fmt.cfFormat = CF_ENHMETAFILE;
2312 fmt.dwAspect = DVASPECT_CONTENT;
2313 fmt.tymed = 0;
2314 hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
2315 ok( hr == DV_E_TYMED, "got %08lx\n", hr );
2316
2317 IDataObject_Release( data );
2318 IOleCache2_Release( cache );
2319
2320 /* tests for a static class cache */
2322
2323 fmt.cfFormat = CF_DIB;
2324 fmt.dwAspect = DVASPECT_CONTENT;
2325 fmt.tymed = TYMED_HGLOBAL;
2326 hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
2327 ok( hr == CACHE_S_SAMECACHE, "got %08lx\n", hr );
2328
2329 /* aspect other than DVASPECT_CONTENT should fail */
2330 fmt.dwAspect = DVASPECT_THUMBNAIL;
2331 hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
2332 ok( FAILED(hr), "got %08lx\n", hr );
2333
2334 fmt.dwAspect = DVASPECT_DOCPRINT;
2335 hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
2336 ok( FAILED(hr), "got %08lx\n", hr );
2337
2338 /* try caching another clip format */
2339 fmt.cfFormat = CF_METAFILEPICT;
2340 fmt.dwAspect = DVASPECT_CONTENT;
2341 fmt.tymed = TYMED_MFPICT;
2342 hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
2343 ok( FAILED(hr), "got %08lx\n", hr );
2344
2345 /* As an exception, it's possible to add an icon aspect */
2346 fmt.cfFormat = CF_METAFILEPICT;
2347 fmt.dwAspect = DVASPECT_ICON;
2348 fmt.tymed = TYMED_MFPICT;
2349 hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
2350 ok( hr == S_OK, "got %08lx\n", hr );
2351
2352 IOleCache2_Release( cache );
2353}
2354
2355/* The CLSID_Picture_ classes automatically create appropriate cache entries */
2356static void test_data_cache_init(void)
2357{
2358 HRESULT hr;
2360 IPersistStorage *persist;
2361 int i;
2362 CLSID clsid;
2363 static const STATDATA enum_expect[] =
2364 {
2365 {{ CF_DIB, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }, 0, NULL, 1 },
2366 {{ CF_BITMAP, 0, DVASPECT_CONTENT, -1, TYMED_GDI }, 0, NULL, 1 },
2367 {{ CF_METAFILEPICT, 0, DVASPECT_CONTENT, -1, TYMED_MFPICT }, 0, NULL, 1 },
2368 {{ CF_ENHMETAFILE, 0, DVASPECT_CONTENT, -1, TYMED_ENHMF }, 0, NULL, 1 }
2369 };
2370 static const struct
2371 {
2372 const CLSID *clsid;
2373 int enum_start, enum_num;
2374 } data[] =
2375 {
2376 { &CLSID_NULL, 0, 0 },
2377 { &CLSID_WineTestOld, 0, 0 },
2378 { &CLSID_Picture_Dib, 0, 2 },
2379 { &CLSID_Picture_Metafile, 2, 1 },
2380 { &CLSID_Picture_EnhMetafile, 3, 1 }
2381 };
2382
2383 for (i = 0; i < ARRAY_SIZE(data); i++)
2384 {
2385 hr = CreateDataCache( NULL, data[i].clsid, &IID_IOleCache2, (void **)&cache );
2386 ok( hr == S_OK, "got %08lx\n", hr );
2387
2388 check_enum_cache( cache, enum_expect + data[i].enum_start , data[i].enum_num );
2389
2390 IOleCache2_QueryInterface( cache, &IID_IPersistStorage, (void **) &persist );
2391 hr = IPersistStorage_GetClassID( persist, &clsid );
2392 ok( hr == S_OK, "got %08lx\n", hr );
2393 ok( IsEqualCLSID( &clsid, data[i].clsid ), "class id mismatch %s %s\n", wine_dbgstr_guid( &clsid ),
2395
2396 IPersistStorage_Release( persist );
2397 IOleCache2_Release( cache );
2398 }
2399}
2400
2402{
2403 HRESULT hr;
2405 IPersistStorage *persist;
2406 IStorage *stg_dib, *stg_mf, *stg_wine;
2407 CLSID clsid;
2408 static const STATDATA initnew_expect[] =
2409 {
2410 {{ CF_DIB, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }, 0, NULL, 1 },
2411 {{ CF_BITMAP, 0, DVASPECT_CONTENT, -1, TYMED_GDI }, 0, NULL, 1 },
2412 };
2413 static const STATDATA initnew2_expect[] =
2414 {
2415 {{ CF_METAFILEPICT, 0, DVASPECT_CONTENT, -1, TYMED_MFPICT }, 0, NULL, 1 },
2416 {{ CF_DIB, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }, 0, NULL, 2 },
2417 {{ CF_BITMAP, 0, DVASPECT_CONTENT, -1, TYMED_GDI }, 0, NULL, 2 },
2418 };
2419 static const STATDATA initnew3_expect[] =
2420 {
2421 {{ CF_DIB, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }, 0, NULL, 1 },
2422 {{ CF_BITMAP, 0, DVASPECT_CONTENT, -1, TYMED_GDI }, 0, NULL, 1 },
2423 {{ CF_DIB, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }, 0, NULL, 2 },
2424 {{ CF_BITMAP, 0, DVASPECT_CONTENT, -1, TYMED_GDI }, 0, NULL, 2 },
2425 {{ CF_METAFILEPICT, 0, DVASPECT_CONTENT, -1, TYMED_MFPICT }, 0, NULL, 3 },
2426 };
2427 static const STATDATA initnew4_expect[] =
2428 {
2429 {{ CF_DIB, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }, 0, NULL, 2 },
2430 {{ CF_BITMAP, 0, DVASPECT_CONTENT, -1, TYMED_GDI }, 0, NULL, 2 },
2431 {{ CF_METAFILEPICT, 0, DVASPECT_CONTENT, -1, TYMED_MFPICT }, 0, NULL, 3 },
2432 {{ CF_DIB, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }, 0, NULL, 4 },
2433 {{ CF_BITMAP, 0, DVASPECT_CONTENT, -1, TYMED_GDI }, 0, NULL, 4 },
2434 };
2435
2437 ok( hr == S_OK, "got %08lx\n", hr);
2438 hr = IStorage_SetClass( stg_dib, &CLSID_Picture_Dib );
2439 ok( hr == S_OK, "got %08lx\n", hr);
2440
2442 ok( hr == S_OK, "got %08lx\n", hr);
2443 hr = IStorage_SetClass( stg_mf, &CLSID_Picture_Metafile );
2444 ok( hr == S_OK, "got %08lx\n", hr);
2445
2447 ok( hr == S_OK, "got %08lx\n", hr);
2448 hr = IStorage_SetClass( stg_wine, &CLSID_WineTestOld );
2449 ok( hr == S_OK, "got %08lx\n", hr);
2450
2452 ok( hr == S_OK, "got %08lx\n", hr );
2453 IOleCache2_QueryInterface( cache, &IID_IPersistStorage, (void **) &persist );
2454
2455 hr = IPersistStorage_InitNew( persist, stg_dib );
2456 ok( hr == S_OK, "got %08lx\n", hr);
2457
2458 hr = IPersistStorage_GetClassID( persist, &clsid );
2459 ok( hr == S_OK, "got %08lx\n", hr );
2460 ok( IsEqualCLSID( &clsid, &CLSID_Picture_Dib ), "got %s\n", wine_dbgstr_guid( &clsid ) );
2461
2462 check_enum_cache( cache, initnew_expect, 2 );
2463
2464 hr = IPersistStorage_InitNew( persist, stg_mf );
2465 ok( hr == CO_E_ALREADYINITIALIZED, "got %08lx\n", hr);
2466
2467 hr = IPersistStorage_HandsOffStorage( persist );
2468 ok( hr == S_OK, "got %08lx\n", hr);
2469
2470 hr = IPersistStorage_GetClassID( persist, &clsid );
2471 ok( hr == S_OK, "got %08lx\n", hr );
2472 ok( IsEqualCLSID( &clsid, &CLSID_Picture_Dib ), "got %s\n", wine_dbgstr_guid( &clsid ) );
2473
2474 hr = IPersistStorage_InitNew( persist, stg_mf );
2475 ok( hr == S_OK, "got %08lx\n", hr);
2476
2477 hr = IPersistStorage_GetClassID( persist, &clsid );
2478 ok( hr == S_OK, "got %08lx\n", hr );
2480
2481 check_enum_cache( cache, initnew2_expect, 3 );
2482
2483 hr = IPersistStorage_HandsOffStorage( persist );
2484 ok( hr == S_OK, "got %08lx\n", hr);
2485
2486 hr = IPersistStorage_InitNew( persist, stg_dib );
2487 ok( hr == S_OK, "got %08lx\n", hr);
2488
2489 hr = IPersistStorage_GetClassID( persist, &clsid );
2490 ok( hr == S_OK, "got %08lx\n", hr );
2491 ok( IsEqualCLSID( &clsid, &CLSID_Picture_Dib ), "got %s\n", wine_dbgstr_guid( &clsid ) );
2492
2493 check_enum_cache( cache, initnew3_expect, 5 );
2494
2495 hr = IPersistStorage_HandsOffStorage( persist );
2496 ok( hr == S_OK, "got %08lx\n", hr);
2497
2498 hr = IPersistStorage_InitNew( persist, stg_wine );
2499 ok( hr == S_OK, "got %08lx\n", hr);
2500
2501 hr = IPersistStorage_GetClassID( persist, &clsid );
2502 ok( hr == S_OK, "got %08lx\n", hr );
2503 ok( IsEqualCLSID( &clsid, &CLSID_WineTestOld ), "got %s\n", wine_dbgstr_guid( &clsid ) );
2504
2505 check_enum_cache( cache, initnew4_expect, 5 );
2506
2507 IStorage_Release( stg_wine );
2508 IStorage_Release( stg_mf );
2509 IStorage_Release( stg_dib );
2510
2511 IPersistStorage_Release( persist );
2512 IOleCache2_Release( cache );
2513}
2514
2516{
2517 const void *mem = GlobalLock(handle);
2520 return ret;
2521}
2522
2524{
2525 FORMATETC dib_fmt = {CF_DIB, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
2526 FORMATETC emf_fmt = {CF_ENHMETAFILE, NULL, DVASPECT_CONTENT, -1, TYMED_ENHMF};
2527 FORMATETC wmf_fmt = {CF_METAFILEPICT, NULL, DVASPECT_CONTENT, -1, TYMED_MFPICT};
2528 FORMATETC view_fmt = {0, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
2530 HRESULT hr;
2532 STGMEDIUM medium;
2533 DWORD conn[4];
2534
2535 static STATDATA view_cache[] =
2536 {
2537 {{ 0, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }, 0, NULL, 0 }
2538 };
2539 static STATDATA view_cache_after_dib[] =
2540 {
2541 {{ CF_DIB, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }, 0, NULL, 0 },
2542 {{ CF_BITMAP, 0, DVASPECT_CONTENT, -1, TYMED_GDI }, 0, NULL, 0 }
2543 };
2544
2546 ok( hr == S_OK, "got %08lx\n", hr );
2547 IOleCache2_QueryInterface(cache, &IID_IDataObject, (void **)&data);
2548
2550 hr = IOleCache2_UpdateCache( cache, &DataObject, UPDFCACHE_ALL, NULL );
2551 ok( hr == S_OK, "got %08lx\n", hr );
2552
2553 hr = IOleCache2_Cache( cache, &dib_fmt, 0, &conn[0] );
2554 ok( hr == S_OK, "got %08lx\n", hr );
2555
2556 hr = IOleCache2_UpdateCache( cache, &DataObject, UPDFCACHE_ALL, NULL );
2557 ok( hr == CACHE_E_NOCACHE_UPDATED, "got %08lx\n", hr );
2558
2559 hr = IDataObject_GetData(data, &dib_fmt, &medium);
2560 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2561
2562 data_object_format = &dib_fmt;
2564 hr = IOleCache2_UpdateCache( cache, &DataObject, UPDFCACHE_ALL, NULL );
2565 ok( hr == S_OK, "got %08lx\n", hr );
2566
2567 hr = IDataObject_GetData(data, &dib_fmt, &medium);
2568 ok(hr == S_OK, "Got hr %#lx.\n", hr);
2569 ok(medium.tymed == TYMED_HGLOBAL, "Got unexpected tymed %lu.\n", medium.tymed);
2570 ok(compare_global(medium.hGlobal, dib_white, sizeof(dib_white)), "Media didn't match.\n");
2571
2572 hr = IOleCache2_Cache(cache, &emf_fmt, 0, &conn[1]);
2573 ok( hr == S_OK, "got %08lx\n", hr );
2574
2576 hr = IOleCache2_UpdateCache( cache, &DataObject, UPDFCACHE_ALL, NULL );
2577 ok( hr == S_OK, "got %08lx\n", hr );
2578
2579 hr = IDataObject_GetData(data, &dib_fmt, &medium);
2580 ok(hr == S_OK, "Got hr %#lx.\n", hr);
2581 ok(medium.tymed == TYMED_HGLOBAL, "Got unexpected tymed %lu.\n", medium.tymed);
2582 ok(compare_global(medium.hGlobal, dib_black, sizeof(dib_black)), "Media didn't match.\n");
2583
2584 hr = IDataObject_GetData(data, &emf_fmt, &medium);
2585 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2586
2587 hr = IDataObject_GetData(data, &wmf_fmt, &medium);
2588 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2589
2590 data_object_format = &emf_fmt;
2591 hr = IOleCache2_UpdateCache( cache, &DataObject, UPDFCACHE_ALL, NULL );
2592 ok( hr == S_OK, "got %08lx\n", hr );
2593
2594 hr = IDataObject_GetData(data, &dib_fmt, &medium);
2595 ok(hr == S_OK, "Got hr %#lx.\n", hr);
2596 ok(medium.tymed == TYMED_HGLOBAL, "Got unexpected tymed %lu.\n", medium.tymed);
2597
2598 hr = IDataObject_GetData(data, &emf_fmt, &medium);
2599 ok(hr == S_OK, "Got hr %#lx.\n", hr);
2600 ok(medium.tymed == TYMED_ENHMF, "Got unexpected tymed %lu.\n", medium.tymed);
2601
2602 hr = IDataObject_GetData(data, &wmf_fmt, &medium);
2603 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2604
2605 data_object_format = &wmf_fmt;
2606 hr = IOleCache2_UpdateCache( cache, &DataObject, UPDFCACHE_ALL, NULL );
2607 ok( hr == S_OK, "got %08lx\n", hr );
2608
2609 hr = IDataObject_GetData(data, &dib_fmt, &medium);
2610 ok(hr == S_OK, "Got hr %#lx.\n", hr);
2611 ok(medium.tymed == TYMED_HGLOBAL, "Got unexpected tymed %lu.\n", medium.tymed);
2612
2613 hr = IDataObject_GetData(data, &emf_fmt, &medium);
2614 ok(hr == S_OK, "Got hr %#lx.\n", hr);
2615 ok(medium.tymed == TYMED_ENHMF, "Got unexpected tymed %lu.\n", medium.tymed);
2616
2617 hr = IDataObject_GetData(data, &wmf_fmt, &medium);
2618 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2619
2620 hr = IOleCache2_Uncache( cache, conn[1] );
2621 ok( hr == S_OK, "got %08lx\n", hr );
2622
2623 hr = IDataObject_GetData(data, &emf_fmt, &medium);
2624 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2625 hr = IDataObject_GetData(data, &wmf_fmt, &medium);
2626 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2627
2628 hr = IDataObject_GetData(data, &dib_fmt, &medium);
2629 ok(hr == S_OK, "Got hr %#lx.\n", hr);
2630
2631 hr = IOleCache2_Cache( cache, &wmf_fmt, 0, &conn[1] );
2632 ok( hr == S_OK, "got %08lx\n", hr );
2633
2634 data_object_format = &emf_fmt;
2635 hr = IOleCache2_UpdateCache( cache, &DataObject, UPDFCACHE_ALL, NULL );
2636 ok( hr == CACHE_E_NOCACHE_UPDATED, "got %08lx\n", hr );
2637
2638 hr = IDataObject_GetData(data, &emf_fmt, &medium);
2639 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2640 hr = IDataObject_GetData(data, &wmf_fmt, &medium);
2641 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2642
2643 data_object_format = &wmf_fmt;
2644 hr = IOleCache2_UpdateCache( cache, &DataObject, UPDFCACHE_ALL, NULL );
2645 ok( hr == S_OK, "got %08lx\n", hr );
2646
2647 hr = IDataObject_GetData(data, &emf_fmt, &medium);
2648 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2649 hr = IDataObject_GetData(data, &wmf_fmt, &medium);
2650 ok(hr == S_OK, "Got hr %#lx.\n", hr);
2651
2652 hr = IOleCache2_Uncache( cache, conn[1] );
2653 ok( hr == S_OK, "got %08lx\n", hr );
2654 hr = IOleCache2_Uncache( cache, conn[0] );
2655 ok( hr == S_OK, "got %08lx\n", hr );
2656
2657 /* Test view caching. */
2658
2659 hr = IOleCache2_Cache( cache, &view_fmt, 0, &conn[0] );
2660 ok( hr == S_OK, "got %08lx\n", hr );
2661 view_cache[0].dwConnection = conn[0];
2662
2664 hr = IOleCache2_UpdateCache( cache, &DataObject, UPDFCACHE_ALL, NULL );
2665 ok( hr == CACHE_E_NOCACHE_UPDATED, "got %08lx\n", hr );
2666
2667 check_enum_cache( cache, view_cache, 1 );
2668
2669 hr = IDataObject_GetData(data, &dib_fmt, &medium);
2670 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2671 hr = IDataObject_GetData(data, &emf_fmt, &medium);
2672 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2673 hr = IDataObject_GetData(data, &view_fmt, &medium);
2674 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2675
2676 data_object_format = &dib_fmt;
2678 hr = IOleCache2_UpdateCache( cache, &DataObject, UPDFCACHE_ALL, NULL );
2679 ok( hr == S_OK, "got %08lx\n", hr );
2680
2681 view_cache_after_dib[0].dwConnection = view_cache_after_dib[1].dwConnection = view_cache[0].dwConnection;
2682 check_enum_cache( cache, view_cache_after_dib, 2 );
2683
2684 hr = IDataObject_GetData(data, &dib_fmt, &medium);
2685 ok(hr == S_OK, "Got hr %#lx.\n", hr);
2686 ok(medium.tymed == TYMED_HGLOBAL, "Got unexpected tymed %lu.\n", medium.tymed);
2687 ok(compare_global(medium.hGlobal, dib_white, sizeof(dib_white)), "Media didn't match.\n");
2688 hr = IDataObject_GetData(data, &emf_fmt, &medium);
2689 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2690 hr = IDataObject_GetData(data, &view_fmt, &medium);
2691 todo_wine ok(hr == DV_E_CLIPFORMAT, "Got hr %#lx.\n", hr);
2692
2693 data_object_format = &emf_fmt;
2694 hr = IOleCache2_UpdateCache( cache, &DataObject, UPDFCACHE_ALL, NULL );
2695 ok( hr == CACHE_E_NOCACHE_UPDATED, "got %08lx\n", hr );
2696
2697 hr = IDataObject_GetData(data, &dib_fmt, &medium);
2698 ok(hr == S_OK, "Got hr %#lx.\n", hr);
2699 hr = IDataObject_GetData(data, &emf_fmt, &medium);
2700 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2701
2702 hr = IOleCache2_Uncache( cache, conn[0] );
2703 ok( hr == S_OK, "got %08lx\n", hr );
2704
2705 /* Try some different flags */
2706
2707 hr = IOleCache2_Cache( cache, &dib_fmt, 0, &conn[0] );
2708 ok( hr == S_OK, "got %08lx\n", hr );
2709
2710 hr = IOleCache2_Cache( cache, &emf_fmt, ADVF_NODATA, &conn[1] );
2711 ok( hr == S_OK, "got %08lx\n", hr );
2712
2713 data_object_format = &dib_fmt;
2715 hr = IOleCache2_UpdateCache(cache, &DataObject, UPDFCACHE_IFBLANK, NULL);
2716 ok(hr == S_OK, "Got hr %#lx.\n", hr);
2717
2718 hr = IDataObject_GetData(data, &dib_fmt, &medium);
2719 ok(hr == S_OK, "Got hr %#lx.\n", hr);
2720 ok(medium.tymed == TYMED_HGLOBAL, "Got unexpected tymed %lu.\n", medium.tymed);
2721 ok(compare_global(medium.hGlobal, dib_white, sizeof(dib_white)), "Media didn't match.\n");
2722 hr = IDataObject_GetData(data, &emf_fmt, &medium);
2723 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2724
2726 hr = IOleCache2_UpdateCache(cache, &DataObject, UPDFCACHE_IFBLANK, NULL);
2727 ok( hr == S_OK, "got %08lx\n", hr );
2728
2729 hr = IDataObject_GetData(data, &dib_fmt, &medium);
2730 ok(hr == S_OK, "Got hr %#lx.\n", hr);
2731 ok(medium.tymed == TYMED_HGLOBAL, "Got unexpected tymed %lu.\n", medium.tymed);
2732 ok(compare_global(medium.hGlobal, dib_white, sizeof(dib_white)), "Media didn't match.\n");
2733 hr = IDataObject_GetData(data, &emf_fmt, &medium);
2734 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2735
2736 data_object_format = &emf_fmt;
2737 hr = IOleCache2_UpdateCache( cache, &DataObject, UPDFCACHE_IFBLANK , NULL );
2738 ok( hr == S_OK, "got %08lx\n", hr );
2739
2740 hr = IDataObject_GetData(data, &dib_fmt, &medium);
2741 ok(hr == S_OK, "Got hr %#lx.\n", hr);
2742 ok(medium.tymed == TYMED_HGLOBAL, "Got unexpected tymed %lu.\n", medium.tymed);
2743 ok(compare_global(medium.hGlobal, dib_white, sizeof(dib_white)), "Media didn't match.\n");
2744 hr = IDataObject_GetData(data, &emf_fmt, &medium);
2745 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2746
2747 hr = IOleCache2_DiscardCache( cache, DISCARDCACHE_NOSAVE );
2748 ok( hr == S_OK, "got %08lx\n", hr );
2749
2750 hr = IDataObject_GetData(data, &dib_fmt, &medium);
2751 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2752 hr = IDataObject_GetData(data, &emf_fmt, &medium);
2753 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2754
2755 data_object_format = &emf_fmt;
2756 hr = IOleCache2_UpdateCache( cache, &DataObject, UPDFCACHE_IFBLANK | UPDFCACHE_NODATACACHE, NULL );
2757 ok( hr == S_OK, "got %08lx\n", hr );
2758
2759 hr = IDataObject_GetData(data, &dib_fmt, &medium);
2760 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2761 hr = IDataObject_GetData(data, &emf_fmt, &medium);
2762 ok(hr == S_OK, "Got hr %#lx.\n", hr);
2763
2764 hr = IOleCache2_DiscardCache( cache, DISCARDCACHE_NOSAVE );
2765 ok( hr == S_OK, "got %08lx\n", hr );
2766
2767 data_object_format = &dib_fmt;
2768 hr = IOleCache2_UpdateCache( cache, &DataObject, UPDFCACHE_ONLYIFBLANK | UPDFCACHE_NORMALCACHE, NULL );
2769 ok( hr == S_OK, "got %08lx\n", hr );
2770
2771 hr = IDataObject_GetData(data, &dib_fmt, &medium);
2772 ok(hr == S_OK, "Got hr %#lx.\n", hr);
2773 hr = IDataObject_GetData(data, &emf_fmt, &medium);
2774 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2775
2776 data_object_format = &emf_fmt;
2777 hr = IOleCache2_UpdateCache( cache, &DataObject, UPDFCACHE_ONLYIFBLANK | UPDFCACHE_NORMALCACHE, NULL );
2778 ok( hr == S_OK, "got %08lx\n", hr );
2779
2780 hr = IDataObject_GetData(data, &dib_fmt, &medium);
2781 ok(hr == S_OK, "Got hr %#lx.\n", hr);
2782 hr = IDataObject_GetData(data, &emf_fmt, &medium);
2783 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2784
2785 hr = IOleCache2_UpdateCache( cache, &DataObject, UPDFCACHE_IFBLANK | UPDFCACHE_NORMALCACHE, NULL );
2786 ok( hr == S_OK, "got %08lx\n", hr );
2787
2788 hr = IDataObject_GetData(data, &dib_fmt, &medium);
2789 ok(hr == S_OK, "Got hr %#lx.\n", hr);
2790 hr = IDataObject_GetData(data, &emf_fmt, &medium);
2791 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2792
2793 hr = IOleCache2_DiscardCache( cache, DISCARDCACHE_NOSAVE );
2794 ok( hr == S_OK, "got %08lx\n", hr );
2795
2796 data_object_format = &dib_fmt;
2797 hr = IOleCache2_InitCache( cache, &DataObject );
2798 ok( hr == S_OK, "got %08lx\n", hr );
2799
2800 hr = IDataObject_GetData(data, &dib_fmt, &medium);
2801 ok(hr == S_OK, "Got hr %#lx.\n", hr);
2802 hr = IDataObject_GetData(data, &emf_fmt, &medium);
2803 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2804
2805 data_object_format = &emf_fmt;
2806 hr = IOleCache2_UpdateCache( cache, &DataObject, UPDFCACHE_ONLYIFBLANK | UPDFCACHE_NORMALCACHE, NULL );
2807 ok( hr == S_OK, "got %08lx\n", hr );
2808
2809 hr = IDataObject_GetData(data, &dib_fmt, &medium);
2810 ok(hr == S_OK, "Got hr %#lx.\n", hr);
2811 hr = IDataObject_GetData(data, &emf_fmt, &medium);
2812 ok(hr == OLE_E_BLANK, "Got hr %#lx.\n", hr);
2813
2814 IDataObject_Release(data);
2815 IOleCache2_Release( cache );
2816}
2817
2818static void test_default_handler(void)
2819{
2820 HRESULT hr;
2822 IRunnableObject *pRunnableObject;
2823 IOleClientSite *pClientSite;
2824 IDataObject *pDataObject;
2825 SIZEL sizel;
2827 CLSID clsid;
2828 LPOLESTR pszUserType;
2830 DWORD dwAdvConn;
2831 IMoniker *pMoniker;
2832 FORMATETC fmtetc;
2833 IOleInPlaceObject *pInPlaceObj;
2834 IEnumOLEVERB *pEnumVerbs;
2835 DWORD dwRegister;
2836 static const WCHAR wszUnknown[] = {'U','n','k','n','o','w','n',0};
2837 static const WCHAR wszHostName[] = {'W','i','n','e',' ','T','e','s','t',' ','P','r','o','g','r','a','m',0};
2838 static const WCHAR wszDelim[] = {'!',0};
2839
2840 static const struct expected_method methods_embeddinghelper[] =
2841 {
2842 { NULL, 0 }
2843 };
2844
2845 hr = CoCreateInstance(&CLSID_WineTest, NULL, CLSCTX_INPROC_HANDLER, &IID_IOleObject, (void **)&pObject);
2846 ok(hr == REGDB_E_CLASSNOTREG, "CoCreateInstance should have failed with REGDB_E_CLASSNOTREG instead of 0x%08lx\n", hr);
2847
2849 ok_ole_success(hr, "OleCreateDefaultHandler");
2850
2851 hr = IOleObject_QueryInterface(pObject, &IID_IOleInPlaceObject, (void **)&pInPlaceObj);
2852 ok(hr == E_NOINTERFACE, "IOleObject_QueryInterface(&IID_IOleInPlaceObject) should return E_NOINTERFACE instead of 0x%08lx\n", hr);
2853
2854 hr = IOleObject_Advise(pObject, &AdviseSink, &dwAdvConn);
2855 ok_ole_success(hr, "IOleObject_Advise");
2856
2857 hr = IOleObject_Close(pObject, OLECLOSE_NOSAVE);
2858 ok_ole_success(hr, "IOleObject_Close");
2859
2860 /* FIXME: test IOleObject_EnumAdvise */
2861
2862 hr = IOleObject_EnumVerbs(pObject, &pEnumVerbs);
2863 ok(hr == REGDB_E_CLASSNOTREG, "IOleObject_EnumVerbs should have returned REGDB_E_CLASSNOTREG instead of 0x%08lx\n", hr);
2864
2865 hr = IOleObject_GetClientSite(pObject, &pClientSite);
2866 ok_ole_success(hr, "IOleObject_GetClientSite");
2867
2868 hr = IOleObject_SetClientSite(pObject, pClientSite);
2869 ok_ole_success(hr, "IOleObject_SetClientSite");
2870
2871 hr = IOleObject_GetClipboardData(pObject, 0, &pDataObject);
2873 "IOleObject_GetClipboardData should have returned OLE_E_NOTRUNNING instead of 0x%08lx\n",
2874 hr);
2875
2876 hr = IOleObject_GetExtent(pObject, DVASPECT_CONTENT, &sizel);
2877 ok(hr == OLE_E_BLANK, "IOleObject_GetExtent should have returned OLE_E_BLANK instead of 0x%08lx\n",
2878 hr);
2879
2880 hr = IOleObject_GetMiscStatus(pObject, DVASPECT_CONTENT, &dwStatus);
2881 ok(hr == REGDB_E_CLASSNOTREG, "IOleObject_GetMiscStatus should have returned REGDB_E_CLASSNOTREG instead of 0x%08lx\n", hr);
2882
2883 hr = IOleObject_GetUserClassID(pObject, &clsid);
2884 ok_ole_success(hr, "IOleObject_GetUserClassID");
2885 ok(IsEqualCLSID(&clsid, &CLSID_WineTest), "clsid != CLSID_WineTest\n");
2886
2887 hr = IOleObject_GetUserType(pObject, USERCLASSTYPE_FULL, &pszUserType);
2888 todo_wine {
2889 ok_ole_success(hr, "IOleObject_GetUserType");
2890 ok(!lstrcmpW(pszUserType, wszUnknown), "Retrieved user type was wrong\n");
2891 }
2892
2893 hr = IOleObject_InitFromData(pObject, NULL, TRUE, 0);
2894 ok(hr == OLE_E_NOTRUNNING, "IOleObject_InitFromData should have returned OLE_E_NOTRUNNING instead of 0x%08lx\n", hr);
2895
2896 hr = IOleObject_IsUpToDate(pObject);
2897 ok(hr == OLE_E_NOTRUNNING, "IOleObject_IsUpToDate should have returned OLE_E_NOTRUNNING instead of 0x%08lx\n", hr);
2898
2899 palette.palNumEntries = 1;
2900 palette.palVersion = 2;
2901 memset(&palette.palPalEntry[0], 0, sizeof(palette.palPalEntry[0]));
2902 hr = IOleObject_SetColorScheme(pObject, &palette);
2903 ok(hr == OLE_E_NOTRUNNING, "IOleObject_SetColorScheme should have returned OLE_E_NOTRUNNING instead of 0x%08lx\n", hr);
2904
2905 sizel.cx = sizel.cy = 0;
2906 hr = IOleObject_SetExtent(pObject, DVASPECT_CONTENT, &sizel);
2907 ok(hr == OLE_E_NOTRUNNING, "IOleObject_SetExtent should have returned OLE_E_NOTRUNNING instead of 0x%08lx\n", hr);
2908
2909 hr = IOleObject_SetHostNames(pObject, wszHostName, NULL);
2910 ok_ole_success(hr, "IOleObject_SetHostNames");
2911
2912 hr = CreateItemMoniker(wszDelim, wszHostName, &pMoniker);
2913 ok_ole_success(hr, "CreateItemMoniker");
2914 hr = IOleObject_SetMoniker(pObject, OLEWHICHMK_CONTAINER, pMoniker);
2915 ok_ole_success(hr, "IOleObject_SetMoniker");
2916 IMoniker_Release(pMoniker);
2917
2918 hr = IOleObject_GetMoniker(pObject, OLEGETMONIKER_ONLYIFTHERE, OLEWHICHMK_CONTAINER, &pMoniker);
2919 ok(hr == E_FAIL, "IOleObject_GetMoniker should have returned E_FAIL instead of 0x%08lx\n", hr);
2920
2921 hr = IOleObject_Update(pObject);
2922 todo_wine
2923 ok(hr == REGDB_E_CLASSNOTREG, "IOleObject_Update should have returned REGDB_E_CLASSNOTREG instead of 0x%08lx\n", hr);
2924
2925 hr = IOleObject_QueryInterface(pObject, &IID_IDataObject, (void **)&pDataObject);
2926 ok_ole_success(hr, "IOleObject_QueryInterface");
2927
2928 fmtetc.cfFormat = CF_TEXT;
2929 fmtetc.ptd = NULL;
2930 fmtetc.dwAspect = DVASPECT_CONTENT;
2931 fmtetc.lindex = -1;
2932 fmtetc.tymed = TYMED_NULL;
2933 hr = IDataObject_DAdvise(pDataObject, &fmtetc, 0, &AdviseSink, &dwAdvConn);
2934 ok_ole_success(hr, "IDataObject_DAdvise");
2935
2936 fmtetc.cfFormat = CF_ENHMETAFILE;
2937 fmtetc.ptd = NULL;
2938 fmtetc.dwAspect = DVASPECT_CONTENT;
2939 fmtetc.lindex = -1;
2940 fmtetc.tymed = TYMED_ENHMF;
2941 hr = IDataObject_DAdvise(pDataObject, &fmtetc, 0, &AdviseSink, &dwAdvConn);
2942 ok_ole_success(hr, "IDataObject_DAdvise");
2943
2944 fmtetc.cfFormat = CF_ENHMETAFILE;
2945 fmtetc.ptd = NULL;
2946 fmtetc.dwAspect = DVASPECT_CONTENT;
2947 fmtetc.lindex = -1;
2948 fmtetc.tymed = TYMED_ENHMF;
2949 hr = IDataObject_QueryGetData(pDataObject, &fmtetc);
2950 ok(hr == OLE_E_NOTRUNNING, "IDataObject_QueryGetData should have returned OLE_E_NOTRUNNING instead of 0x%08lx\n", hr);
2951
2952 fmtetc.cfFormat = CF_TEXT;
2953 fmtetc.ptd = NULL;
2954 fmtetc.dwAspect = DVASPECT_CONTENT;
2955 fmtetc.lindex = -1;
2956 fmtetc.tymed = TYMED_NULL;
2957 hr = IDataObject_QueryGetData(pDataObject, &fmtetc);
2958 ok(hr == OLE_E_NOTRUNNING, "IDataObject_QueryGetData should have returned OLE_E_NOTRUNNING instead of 0x%08lx\n", hr);
2959
2960 hr = IOleObject_QueryInterface(pObject, &IID_IRunnableObject, (void **)&pRunnableObject);
2961 ok_ole_success(hr, "IOleObject_QueryInterface");
2962
2963 hr = IRunnableObject_SetContainedObject(pRunnableObject, TRUE);
2964 ok_ole_success(hr, "IRunnableObject_SetContainedObject");
2965
2966 hr = IRunnableObject_Run(pRunnableObject, NULL);
2967 ok(hr == REGDB_E_CLASSNOTREG, "IOleObject_Run should have returned REGDB_E_CLASSNOTREG instead of 0x%08lx\n", hr);
2968
2969 hr = IOleObject_Close(pObject, OLECLOSE_NOSAVE);
2970 ok_ole_success(hr, "IOleObject_Close");
2971
2972 IRunnableObject_Release(pRunnableObject);
2973 IOleObject_Release(pObject);
2974
2975 /* Test failure propagation from delegate ::QueryInterface */
2977 CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, &dwRegister);
2978 ok_ole_success(hr, "CoRegisterClassObject");
2979 if(SUCCEEDED(hr))
2980 {
2981 expected_method_list = methods_embeddinghelper;
2983 &OleObjectCF, &IID_IOleObject, (void**)&pObject);
2984 ok_ole_success(hr, "OleCreateEmbeddingHelper");
2985 if(SUCCEEDED(hr))
2986 {
2987 IUnknown *punk;
2988
2990 hr = IOleObject_QueryInterface(pObject, &IID_WineTest, (void**)&punk);
2991 ok(hr == E_FAIL, "Got 0x%08lx\n", hr);
2992
2994 hr = IOleObject_QueryInterface(pObject, &IID_WineTest, (void**)&punk);
2995 ok(hr == E_NOINTERFACE, "Got 0x%08lx\n", hr);
2996
2998 hr = IOleObject_QueryInterface(pObject, &IID_WineTest, (void**)&punk);
2999 ok(hr == CO_E_OBJNOTCONNECTED, "Got 0x%08lx\n", hr);
3000
3001 g_QIFailsWith = 0x87654321;
3002 hr = IOleObject_QueryInterface(pObject, &IID_WineTest, (void**)&punk);
3003 ok(hr == 0x87654321, "Got 0x%08lx\n", hr);
3004
3005 IOleObject_Release(pObject);
3006 }
3007
3009 todo_wine ok(!ole_object_refcount, "Got outstanding refcount %ld.\n", ole_object_refcount);
3010
3011 hr = CoRevokeClassObject(dwRegister);
3012 ok_ole_success(hr, "CoRevokeClassObject");
3013 }
3014}
3015
3016static void test_runnable(void)
3017{
3018 static const struct expected_method methods_query_runnable[] =
3019 {
3020 { "OleObjectRunnable_IsRunning", 0 },
3021 { NULL, 0 }
3022 };
3023
3024 static const struct expected_method methods_no_runnable[] =
3025 {
3026 { NULL, 0 }
3027 };
3028
3029 BOOL ret;
3030 IOleObject *object = &OleObject;
3031
3032 /* null argument */
3034 ok(ret == FALSE, "got %d\n", ret);
3035
3036 expected_method_list = methods_query_runnable;
3037 ret = OleIsRunning(object);
3038 ok(ret == TRUE, "Object should be running\n");
3040 todo_wine ok(!ole_object_refcount, "Got outstanding refcount %ld.\n", ole_object_refcount);
3041
3043 expected_method_list = methods_query_runnable;
3044 ret = OleIsRunning(object);
3045 ok(ret == FALSE, "Object should not be running\n");
3047 todo_wine ok(!ole_object_refcount, "Got outstanding refcount %ld.\n", ole_object_refcount);
3048
3049 g_showRunnable = FALSE; /* QueryInterface(IID_IRunnableObject, ...) will fail */
3050 expected_method_list = methods_no_runnable;
3051 ret = OleIsRunning(object);
3052 ok(ret == TRUE, "Object without IRunnableObject should be running\n");
3054 todo_wine ok(!ole_object_refcount, "Got outstanding refcount %ld.\n", ole_object_refcount);
3055
3056 g_isRunning = TRUE;
3058}
3059
3060
3062{
3063 *ppv = NULL;
3064
3065 if (IsEqualIID(riid, &IID_IUnknown) ||
3067 *ppv = iface;
3068 }
3069
3070 if (*ppv)
3071 {
3072 IUnknown_AddRef((IUnknown *)*ppv);
3073 return S_OK;
3074 }
3075
3076 return E_NOINTERFACE;
3077}
3078
3080{
3081 return 2;
3082}
3083
3085{
3086 return 1;
3087}
3088
3090{
3091 ok(0, "unexpected\n");
3092 return E_NOTIMPL;
3093}
3094
3096{
3097 ok(ctx == NULL, "got %p\n", ctx);
3098 return 0xdeadc0de;
3099}
3100
3102{
3103 ok(0, "unexpected\n");
3104 return FALSE;
3105}
3106
3108 BOOL last_unlock_closes)
3109{
3110 ok(0, "unexpected\n");
3111 return E_NOTIMPL;
3112}
3113
3115{
3116 ok(0, "unexpected\n");
3117 return E_NOTIMPL;
3118}
3119
3120static const IRunnableObjectVtbl oleruntestvtbl =
3121{
3126 OleRun_Run,
3130};
3131
3133
3134static void test_OleRun(void)
3135{
3136 HRESULT hr;
3137
3138 /* doesn't support IRunnableObject */
3139 hr = OleRun(&unknown);
3140 ok(hr == S_OK, "OleRun failed 0x%08lx\n", hr);
3141
3143 ok(hr == 0xdeadc0de, "got 0x%08lx\n", hr);
3144}
3145
3146static void test_OleLockRunning(void)
3147{
3148 HRESULT hr;
3149
3151 ok(hr == S_OK, "OleLockRunning failed 0x%08lx\n", hr);
3152}
3153
3154static void test_OleDraw(void)
3155{
3156 HRESULT hr;
3157 RECT rect;
3158
3159 hr = OleDraw((IUnknown*)&viewobject, 0, (HDC)0x1, NULL);
3160 ok(hr == S_OK, "got 0x%08lx\n", hr);
3161
3162 hr = OleDraw(NULL, 0, (HDC)0x1, NULL);
3163 ok(hr == E_INVALIDARG, "got 0x%08lx\n", hr);
3164
3165 hr = OleDraw(NULL, 0, (HDC)0x1, &rect);
3166 ok(hr == E_INVALIDARG, "got 0x%08lx\n", hr);
3167}
3168
3169static const WCHAR olepres0W[] = {2,'O','l','e','P','r','e','s','0','0','0',0};
3170static const WCHAR comp_objW[] = {1,'C','o','m','p','O','b','j',0};
3175
3176static HRESULT WINAPI Storage_QueryInterface(IStorage *iface, REFIID riid, void **ppvObject)
3177{
3178 ok(0, "unexpected call to QueryInterface\n");
3179 return E_NOTIMPL;
3180}
3181
3183{
3184 ok(0, "unexpected call to AddRef\n");
3185 return 2;
3186}
3187
3189{
3190 ok(0, "unexpected call to Release\n");
3191 return 1;
3192}
3193
3194static HRESULT WINAPI Storage_CreateStream(IStorage *iface, LPCOLESTR pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStream **ppstm)
3195{
3196 ULARGE_INTEGER size = {{0}};
3197 LARGE_INTEGER pos = {{0}};
3198 HRESULT hr;
3199
3200 if (!lstrcmpW(pwcsName, comp_objW))
3201 {
3202 CHECK_EXPECT(Storage_CreateStream_CompObj);
3203 *ppstm = comp_obj_stream;
3204
3205 todo_wine ok(grfMode == (STGM_CREATE|STGM_SHARE_EXCLUSIVE|STGM_READWRITE), "grfMode = %lx\n", grfMode);
3206 }
3207 else if (!lstrcmpW(pwcsName, olepres0W))
3208 {
3209 CHECK_EXPECT(Storage_CreateStream_OlePres);
3210 *ppstm = olepres_stream;
3211
3212 todo_wine ok(grfMode == (STGM_SHARE_EXCLUSIVE|STGM_READWRITE), "grfMode = %lx\n", grfMode);
3213 }
3214 else
3215 {
3216 todo_wine
3217 ok(0, "unexpected stream name %s\n", wine_dbgstr_w(pwcsName));
3218#if 0 /* FIXME: return NULL once Wine is fixed */
3219 *ppstm = NULL;
3220 return E_NOTIMPL;
3221#else
3222 *ppstm = contents_stream;
3223#endif
3224 }
3225
3226 ok(!reserved1, "reserved1 = %lx\n", reserved1);
3227 ok(!reserved2, "reserved2 = %lx\n", reserved2);
3228 ok(!!ppstm, "ppstm = NULL\n");
3229
3230 IStream_AddRef(*ppstm);
3231 hr = IStream_Seek(*ppstm, pos, STREAM_SEEK_SET, NULL);
3232 ok(hr == S_OK, "IStream_Seek returned %lx\n", hr);
3233 hr = IStream_SetSize(*ppstm, size);
3234 ok(hr == S_OK, "IStream_SetSize returned %lx\n", hr);
3235 return S_OK;
3236}
3237
3238static HRESULT WINAPI Storage_OpenStream(IStorage *iface, LPCOLESTR pwcsName, void *reserved1, DWORD grfMode, DWORD reserved2, IStream **ppstm)
3239{
3240 static const WCHAR ole1W[] = {1,'O','l','e',0};
3241
3242 LARGE_INTEGER pos = {{0}};
3243 HRESULT hr;
3244
3245 ok(!reserved1, "reserved1 = %p\n", reserved1);
3246 ok(!reserved2, "reserved2 = %lx\n", reserved2);
3247 ok(!!ppstm, "ppstm = NULL\n");
3248
3249 if(!lstrcmpW(pwcsName, comp_objW)) {
3250 CHECK_EXPECT2(Storage_OpenStream_CompObj);
3251 ok(grfMode == STGM_SHARE_EXCLUSIVE, "grfMode = %lx\n", grfMode);
3252
3253 *ppstm = comp_obj_stream;
3254 IStream_AddRef(comp_obj_stream);
3255 hr = IStream_Seek(comp_obj_stream, pos, STREAM_SEEK_SET, NULL);
3256 ok(hr == S_OK, "IStream_Seek returned %lx\n", hr);
3257 return S_OK;
3258 }else if(!lstrcmpW(pwcsName, ole1W)) {
3259 CHECK_EXPECT(Storage_OpenStream_Ole);
3260
3261 if (!ole_stream)
3262 {
3263 ok(grfMode == (STGM_SHARE_EXCLUSIVE|STGM_READ), "grfMode = %lx\n", grfMode);
3264
3265 *ppstm = NULL;
3266 return STG_E_FILENOTFOUND;
3267 }
3268
3269 ok(grfMode == (STGM_SHARE_EXCLUSIVE|STGM_READWRITE), "grfMode = %lx\n", grfMode);
3270
3271 *ppstm = ole_stream;
3272 IStream_AddRef(ole_stream);
3273 hr = IStream_Seek(ole_stream, pos, STREAM_SEEK_SET, NULL);
3274 ok(hr == S_OK, "IStream_Seek returned %lx\n", hr);
3275 return S_OK;
3276
3277 }else if(!lstrcmpW(pwcsName, olepres0W)) {
3278 CHECK_EXPECT(Storage_OpenStream_OlePres);
3279 ok(grfMode == (STGM_SHARE_EXCLUSIVE|STGM_READWRITE), "grfMode = %lx\n", grfMode);
3280
3281 *ppstm = olepres_stream;
3282 IStream_AddRef(olepres_stream);
3283 hr = IStream_Seek(olepres_stream, pos, STREAM_SEEK_SET, NULL);
3284 ok(hr == S_OK, "IStream_Seek returned %lx\n", hr);
3285 return S_OK;
3286 }
3287
3288 ok(0, "unexpected call to OpenStream: %s\n", wine_dbgstr_w(pwcsName));
3289 return E_NOTIMPL;
3290}
3291
3292static HRESULT WINAPI Storage_CreateStorage(IStorage *iface, LPCOLESTR pwcsName, DWORD grfMode, DWORD dwStgFmt, DWORD reserved2, IStorage **ppstg)
3293{
3294 ok(0, "unexpected call to CreateStorage\n");
3295 return E_NOTIMPL;
3296}
3297
3298static HRESULT WINAPI Storage_OpenStorage(IStorage *iface, LPCOLESTR pwcsName, IStorage *pstgPriority, DWORD grfMode, SNB snbExclude, DWORD reserved, IStorage **ppstg)
3299{
3300 ok(0, "unexpected call to OpenStorage\n");
3301 return E_NOTIMPL;
3302}
3303
3304static HRESULT WINAPI Storage_CopyTo(IStorage *iface, DWORD ciidExclude, const IID *rgiidExclude, SNB snbExclude, IStorage *pstgDest)
3305{
3306 ok(0, "unexpected call to CopyTo\n");
3307 return E_NOTIMPL;
3308}
3309
3310static HRESULT WINAPI Storage_MoveElementTo(IStorage *iface, LPCOLESTR pwcsName, IStorage *pstgDest, LPCOLESTR pwcsNewName, DWORD grfFlags)
3311{
3312 ok(0, "unexpected call to MoveElementTo\n");
3313 return E_NOTIMPL;
3314}
3315
3316static HRESULT WINAPI Storage_Commit(IStorage *iface, DWORD grfCommitFlags)
3317{
3318 ok(0, "unexpected call to Commit\n");
3319 return E_NOTIMPL;
3320}
3321
3323{
3324 ok(0, "unexpected call to Revert\n");
3325 return E_NOTIMPL;
3326}
3327
3329{
3330 ok(0, "unexpected call to EnumElements\n");
3331 return E_NOTIMPL;
3332}
3333
3334static HRESULT WINAPI Storage_DestroyElement(IStorage *iface, LPCOLESTR pwcsName)
3335{
3336 char name[32];
3337 int stream_n, cmp;
3338
3340 cmp = CompareStringW(LOCALE_NEUTRAL, 0, pwcsName, 8, olepres0W, 8);
3341 ok(cmp == CSTR_EQUAL,
3342 "unexpected call to DestroyElement(%s)\n", wine_dbgstr_w(pwcsName));
3343
3344 WideCharToMultiByte(CP_ACP, 0, pwcsName, -1, name, sizeof(name), NULL, NULL);
3345 stream_n = atol(name + 8);
3346 if (stream_n <= Storage_DestroyElement_limit)
3347 return S_OK;
3348
3349 return STG_E_FILENOTFOUND;
3350}
3351
3352static HRESULT WINAPI Storage_RenameElement(IStorage *iface, LPCOLESTR pwcsOldName, LPCOLESTR pwcsNewName)
3353{
3354 ok(0, "unexpected call to RenameElement\n");
3355 return E_NOTIMPL;
3356}
3357
3358static HRESULT WINAPI Storage_SetElementTimes(IStorage *iface, LPCOLESTR pwcsName, const FILETIME *pctime, const FILETIME *patime, const FILETIME *pmtime)
3359{
3360 ok(0, "unexpected call to SetElementTimes\n");
3361 return E_NOTIMPL;
3362}
3363
3365{
3367 ok(IsEqualIID(clsid, Storage_SetClass_CLSID), "expected %s, got %s\n",
3369 return S_OK;
3370}
3371
3372static HRESULT WINAPI Storage_SetStateBits(IStorage *iface, DWORD grfStateBits, DWORD grfMask)
3373{
3374 ok(0, "unexpected call to SetStateBits\n");
3375 return E_NOTIMPL;
3376}
3377
3378static HRESULT WINAPI Storage_Stat(IStorage *iface, STATSTG *pstatstg, DWORD grfStatFlag)
3379{
3381 ok(pstatstg != NULL, "pstatstg = NULL\n");
3382 ok(grfStatFlag == STATFLAG_NONAME, "grfStatFlag = %lx\n", grfStatFlag);
3383
3384 memset(pstatstg, 0, sizeof(STATSTG));
3385 pstatstg->type = STGTY_STORAGE;
3386 pstatstg->clsid = CLSID_WineTestOld;
3387 return S_OK;
3388}
3389
3390static IStorageVtbl StorageVtbl =
3391{
3410};
3411
3413
3414static void test_OleDoAutoConvert(void)
3415{
3416 static const WCHAR clsidW[] = {'C','L','S','I','D','\\',0};
3417 static struct {
3418 DWORD reserved1;
3419 DWORD version;
3420 DWORD reserved2[5];
3421 DWORD ansi_user_type_len;
3422 DWORD ansi_clipboard_format_len;
3424 DWORD unicode_marker;
3425 DWORD unicode_user_type_len;
3426 DWORD unicode_clipboard_format_len;
3427 DWORD reserved4;
3428 } comp_obj_data;
3429 static struct {
3430 DWORD version;
3431 DWORD flags;
3432 DWORD link_update_option;
3433 DWORD reserved1;
3434 DWORD reserved_moniker_stream_size;
3435 DWORD relative_source_moniker_stream_size;
3436 DWORD absolute_source_moniker_stream_size;
3437 DWORD clsid_indicator;
3438 CLSID clsid;
3439 DWORD reserved_display_name;
3441 DWORD local_update_time;
3442 DWORD local_check_update_time;
3443 DWORD remote_update_time;
3444 } ole_data;
3445
3446 LARGE_INTEGER pos = {{0}};
3447 WCHAR buf[39+6];
3448 DWORD i, ret;
3449 HKEY root;
3450 CLSID clsid;
3451 HRESULT hr;
3452
3454 ok(hr == S_OK, "CreateStreamOnHGlobal returned %lx\n", hr);
3455 hr = IStream_Write(comp_obj_stream, (char*)&comp_obj_data, sizeof(comp_obj_data), NULL);
3456 ok(hr == S_OK, "IStream_Write returned %lx\n", hr);
3457
3459 ok(hr == S_OK, "CreateStreamOnHGlobal returned %lx\n", hr);
3460 hr = IStream_Write(ole_stream, (char*)&ole_data, sizeof(ole_data), NULL);
3461 ok(hr == S_OK, "IStream_Write returned %lx\n", hr);
3462
3465 ok(hr == E_INVALIDARG, "OleDoAutoConvert returned %lx\n", hr);
3466 ok(IsEqualIID(&clsid, &IID_NULL), "clsid = %s\n", wine_dbgstr_guid(&clsid));
3467
3468 if(0) /* crashes on Win7 */
3470
3474 ok(hr == REGDB_E_CLASSNOTREG, "OleDoAutoConvert returned %lx\n", hr);
3477
3480
3483 if(ret != ERROR_SUCCESS) {
3484 win_skip("not enough permissions to create CLSID key (%lu)\n", ret);
3485 return;
3486 }
3487
3491 ok(hr == REGDB_E_KEYMISSING, "OleDoAutoConvert returned %lx\n", hr);
3494
3496 ok_ole_success(hr, "OleSetAutoConvert");
3497
3499 ok_ole_success(hr, "OleGetAutoConvert");
3500 ok(IsEqualIID(&clsid, &CLSID_WineTest), "incorrect clsid: %s\n", wine_dbgstr_guid(&clsid));
3501
3504 SET_EXPECT(Storage_OpenStream_CompObj);
3506 SET_EXPECT(Storage_CreateStream_CompObj);
3507 SET_EXPECT(Storage_OpenStream_Ole);
3509 ok(hr == S_OK, "OleDoAutoConvert returned %lx\n", hr);
3511 CHECK_CALLED(Storage_OpenStream_CompObj);
3513 CHECK_CALLED(Storage_CreateStream_CompObj);
3514 CHECK_CALLED(Storage_OpenStream_Ole);
3515 ok(IsEqualIID(&clsid, &CLSID_WineTest), "clsid = %s\n", wine_dbgstr_guid(&clsid));
3516
3517 hr = IStream_Seek(comp_obj_stream, pos, STREAM_SEEK_SET, NULL);
3518 ok(hr == S_OK, "IStream_Seek returned %lx\n", hr);
3519 hr = IStream_Read(comp_obj_stream, &comp_obj_data, sizeof(comp_obj_data), NULL);
3520 ok(hr == S_OK, "IStream_Read returned %lx\n", hr);
3521 ok(comp_obj_data.reserved1 == 0xfffe0001, "reserved1 = %lx\n", comp_obj_data.reserved1);
3522 ok(comp_obj_data.version == 0xa03, "version = %lx\n", comp_obj_data.version);
3523 ok(comp_obj_data.reserved2[0] == -1, "reserved2[0] = %lx\n", comp_obj_data.reserved2[0]);
3524 ok(IsEqualIID(comp_obj_data.reserved2+1, &CLSID_WineTestOld), "reserved2 = %s\n", wine_dbgstr_guid((CLSID*)(comp_obj_data.reserved2+1)));
3525 ok(!comp_obj_data.ansi_user_type_len, "ansi_user_type_len = %ld\n", comp_obj_data.ansi_user_type_len);
3526 ok(!comp_obj_data.ansi_clipboard_format_len, "ansi_clipboard_format_len = %ld\n", comp_obj_data.ansi_clipboard_format_len);
3527 ok(!comp_obj_data.reserved3, "reserved3 = %lx\n", comp_obj_data.reserved3);
3528 ok(comp_obj_data.unicode_marker == 0x71b239f4, "unicode_marker = %lx\n", comp_obj_data.unicode_marker);
3529 ok(!comp_obj_data.unicode_user_type_len, "unicode_user_type_len = %ld\n", comp_obj_data.unicode_user_type_len);
3530 ok(!comp_obj_data.unicode_clipboard_format_len, "unicode_clipboard_format_len = %ld\n", comp_obj_data.unicode_clipboard_format_len);
3531 ok(!comp_obj_data.reserved4, "reserved4 %ld\n", comp_obj_data.reserved4);
3532
3533 hr = IStream_Seek(ole_stream, pos, STREAM_SEEK_SET, NULL);
3534 ok(hr == S_OK, "IStream_Seek returned %lx\n", hr);
3535 hr = IStream_Read(ole_stream, &ole_data, sizeof(ole_data), NULL);
3536 ok(hr == S_OK, "IStream_Read returned %lx\n", hr);
3537 ok(ole_data.version == 0, "version = %lx\n", ole_data.version);
3538 ok(ole_data.flags == 4, "flags = %lx\n", ole_data.flags);
3539 for(i=2; i<sizeof(ole_data)/sizeof(DWORD); i++)
3540 ok(((DWORD*)&ole_data)[i] == 0, "ole_data[%ld] = %lx\n", i, ((DWORD*)&ole_data)[i]);
3541
3542 SET_EXPECT(Storage_OpenStream_Ole);
3544 ok(hr == S_OK, "SetConvertStg returned %lx\n", hr);
3545 CHECK_CALLED(Storage_OpenStream_Ole);
3546
3547 SET_EXPECT(Storage_OpenStream_CompObj);
3549 SET_EXPECT(Storage_CreateStream_CompObj);
3551 ok(hr == S_OK, "WriteFmtUserTypeStg returned %lx\n", hr);
3552 todo_wine CHECK_CALLED(Storage_OpenStream_CompObj);
3554 CHECK_CALLED(Storage_CreateStream_CompObj);
3555 hr = IStream_Seek(comp_obj_stream, pos, STREAM_SEEK_SET, NULL);
3556 ok(hr == S_OK, "IStream_Seek returned %lx\n", hr);
3557 hr = IStream_Read(comp_obj_stream, &comp_obj_data, sizeof(comp_obj_data), NULL);
3558 ok(hr == S_OK, "IStream_Read returned %lx\n", hr);
3559 ok(comp_obj_data.reserved1 == 0xfffe0001, "reserved1 = %lx\n", comp_obj_data.reserved1);
3560 ok(comp_obj_data.version == 0xa03, "version = %lx\n", comp_obj_data.version);
3561 ok(comp_obj_data.reserved2[0] == -1, "reserved2[0] = %lx\n", comp_obj_data.reserved2[0]);
3562 ok(IsEqualIID(comp_obj_data.reserved2+1, &CLSID_WineTestOld), "reserved2 = %s\n", wine_dbgstr_guid((CLSID*)(comp_obj_data.reserved2+1)));
3563 ok(!comp_obj_data.ansi_user_type_len, "ansi_user_type_len = %ld\n", comp_obj_data.ansi_user_type_len);
3564 ok(!comp_obj_data.ansi_clipboard_format_len, "ansi_clipboard_format_len = %ld\n", comp_obj_data.ansi_clipboard_format_len);
3565 ok(!comp_obj_data.reserved3, "reserved3 = %lx\n", comp_obj_data.reserved3);
3566 ok(comp_obj_data.unicode_marker == 0x71b239f4, "unicode_marker = %lx\n", comp_obj_data.unicode_marker);
3567 ok(!comp_obj_data.unicode_user_type_len, "unicode_user_type_len = %ld\n", comp_obj_data.unicode_user_type_len);
3568 ok(!comp_obj_data.unicode_clipboard_format_len, "unicode_clipboard_format_len = %ld\n", comp_obj_data.unicode_clipboard_format_len);
3569 ok(!comp_obj_data.reserved4, "reserved4 %ld\n", comp_obj_data.reserved4);
3570
3571 ret = IStream_Release(comp_obj_stream);
3572 ok(!ret, "comp_obj_stream was not freed\n");
3573 ret = IStream_Release(ole_stream);
3574 ok(!ret, "ole_stream was not freed\n");
3575
3576 ret = RegDeleteKeyA(root, "AutoConvertTo");
3577 ok(ret == ERROR_SUCCESS, "RegDeleteKey error %lu\n", ret);
3578 ret = RegDeleteKeyA(root, "");
3579 ok(ret == ERROR_SUCCESS, "RegDeleteKey error %lu\n", ret);
3581}
3582
3583/* 1x1 pixel bmp */
3584static const unsigned char bmpimage[] =
3585{
3586 0x42,0x4d,0x42,0x00,0x00,0x00,0x00,0x00,
3587 0x00,0x00,0x3e,0x00,0x00,0x00,0x28,0x00,
3588 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,
3589 0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,
3590 0x00,0x00,0x04,0x00,0x00,0x00,0x12,0x0b,
3591 0x00,0x00,0x12,0x0b,0x00,0x00,0x02,0x00,
3592 0x00,0x00,0x02,0x00,0x00,0x00,0xff,0xff,
3593 0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
3594 0x00,0x00
3595};
3596
3597static const unsigned char mf_blank_bits[] =
3598{
3599 0x01,0x00,0x09,0x00,0x00,0x03,0x0c,0x00,
3600 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,
3601 0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00
3602};
3603
3604static void test_data_cache_save(void)
3605{
3606 static const WCHAR contentsW[] = { 'C','o','n','t','e','n','t','s',0 };
3607 HRESULT hr;
3608 ILockBytes *ilb;
3609 IStorage *doc;
3610 IStream *stm;
3612 IPersistStorage *stg;
3613 DWORD clipformat[2];
3615
3616 hr = CreateILockBytesOnHGlobal(0, TRUE, &ilb);
3617 ok(hr == S_OK, "unexpected %#lx\n", hr);
3619 ok(hr == S_OK, "unexpected %#lx\n", hr);
3620
3621 ILockBytes_Release(ilb);
3622
3623 hr = IStorage_SetClass(doc, &CLSID_WineTest);
3624 ok(hr == S_OK, "unexpected %#lx\n", hr);
3625
3626 hr = IStorage_CreateStream(doc, contentsW, STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &stm);
3627 ok(hr == S_OK, "unexpected %#lx\n", hr);
3628 hr = IStream_Write(stm, bmpimage, sizeof(bmpimage), NULL);
3629 ok(hr == S_OK, "unexpected %#lx\n", hr);
3630 IStream_Release(stm);
3631
3632 hr = IStorage_CreateStream(doc, olepres0W, STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &stm);
3633 ok(hr == S_OK, "unexpected %#lx\n", hr);
3634
3635 clipformat[0] = -1;
3636 clipformat[1] = CF_METAFILEPICT;
3637 hr = IStream_Write(stm, clipformat, sizeof(clipformat), NULL);
3638 ok(hr == S_OK, "unexpected %#lx\n", hr);
3639
3640 hdr.tdSize = sizeof(hdr.tdSize);
3641 hdr.dvAspect = DVASPECT_CONTENT;
3642 hdr.lindex = -1;
3643 hdr.advf = ADVF_PRIMEFIRST;
3644 hdr.unknown7 = 0;
3645 hdr.dwObjectExtentX = 0;
3646 hdr.dwObjectExtentY = 0;
3647 hdr.dwSize = sizeof(mf_blank_bits);
3648 hr = IStream_Write(stm, &hdr, sizeof(hdr), NULL);
3649 ok(hr == S_OK, "unexpected %#lx\n", hr);
3650 hr = IStream_Write(stm, mf_blank_bits, sizeof(mf_blank_bits), NULL);
3651 ok(hr == S_OK, "unexpected %#lx\n", hr);
3652
3653 IStream_Release(stm);
3654
3656 ok(hr == S_OK, "unexpected %#lx\n", hr);
3657 hr = IOleCache2_QueryInterface(cache, &IID_IPersistStorage, (void **)&stg);
3658 ok(hr == S_OK, "unexpected %#lx\n", hr);
3659 hr = IPersistStorage_Load(stg, doc);
3660 ok(hr == S_OK, "unexpected %#lx\n", hr);
3661
3662 IStorage_Release(doc);
3663
3664 hr = IPersistStorage_IsDirty(stg);
3665 ok(hr == S_FALSE, "unexpected %#lx\n", hr);
3666
3667 ole_stream = NULL;
3669 ok(hr == S_OK, "unexpected %#lx\n", hr);
3670
3671 /* FIXME: remove this stream once Wine is fixed */
3673 ok(hr == S_OK, "unexpected %#lx\n", hr);
3674
3675 SET_EXPECT(Storage_CreateStream_OlePres);
3676 SET_EXPECT(Storage_OpenStream_OlePres);
3677 SET_EXPECT(Storage_OpenStream_Ole);
3681 hr = IPersistStorage_Save(stg, &Storage, FALSE);
3682 ok(hr == S_OK, "unexpected %#lx\n", hr);
3683 CHECK_CALLED(Storage_CreateStream_OlePres);
3684 todo_wine
3685 CHECK_CALLED(Storage_OpenStream_OlePres);
3686 todo_wine
3687 CHECK_CALLED(Storage_OpenStream_Ole);
3688 todo_wine
3690
3691 IStream_Release(olepres_stream);
3692 IStream_Release(contents_stream);
3693
3694 IPersistStorage_Release(stg);
3695 IOleCache2_Release(cache);
3696}
3697
3698#define MAX_STREAM 16
3699
3701{
3702 const char *name;
3703 int cf;
3704 DVASPECT dvAspect;
3705 ADVF advf;
3706 const void *data;
3708};
3709
3711{
3712 const CLSID *clsid;
3715};
3716
3717static const struct storage_def stg_def_0 =
3718{
3719 &CLSID_NULL, 1,
3720 {{ "Contents", -1, 0, 0, bmpimage, sizeof(bmpimage) }}
3721};
3722static const struct storage_def stg_def_0_saved =
3723{
3724 &CLSID_NULL, 0, {{ 0 }}
3725};
3726static const struct storage_def stg_def_1 =
3727{
3728 &CLSID_NULL, 2,
3729 {{ "Contents", -1, 0, 0, NULL, 0 },
3730 { "\2OlePres000", 0, DVASPECT_ICON, ADVF_PRIMEFIRST | ADVF_ONLYONCE, NULL, 0 }}
3731};
3732static const struct storage_def stg_def_1_saved =
3733{
3734 &CLSID_NULL, 1,
3735 {{ "\2OlePres000", 0, DVASPECT_ICON, ADVF_PRIMEFIRST | ADVF_ONLYONCE, NULL, 0 }}
3736};
3737static const struct storage_def stg_def_2 =
3738{
3740 {{ "Contents", -1, 0, 0, bmpimage, sizeof(bmpimage) },
3741 { "\2OlePres000", 0, DVASPECT_ICON, ADVF_PRIMEFIRST | ADVF_ONLYONCE, NULL, 0 }}
3742};
3743static const struct storage_def stg_def_2_saved =
3744{
3745 &CLSID_NULL, 1,
3746 {{ "\2OlePres000", 0, DVASPECT_ICON, ADVF_PRIMEFIRST | ADVF_ONLYONCE, NULL, 0 }}
3747};
3748static const struct storage_def stg_def_3 =
3749{
3750 &CLSID_NULL, 5,
3751 {{ "Contents", -1, 0, 0, bmpimage, sizeof(bmpimage) },
3752 { "\2OlePres000", 0, DVASPECT_ICON, ADVF_PRIMEFIRST | ADVF_ONLYONCE, NULL, 0 },
3753 { "\2OlePres001", CF_METAFILEPICT, DVASPECT_CONTENT, ADVF_PRIMEFIRST, mf_blank_bits, sizeof(mf_blank_bits) },
3754 { "\2OlePres002", CF_DIB, DVASPECT_CONTENT, ADVF_PRIMEFIRST, bmpimage, sizeof(bmpimage) },
3755 { "MyStream", -1, 0, 0, "Hello World!", 13 }}
3756};
3757static const struct storage_def stg_def_3_saved =
3758{
3759 &CLSID_NULL, 3,
3760 {{ "\2OlePres000", 0, DVASPECT_ICON, ADVF_PRIMEFIRST | ADVF_ONLYONCE, NULL, 0 },
3761 { "\2OlePres001", CF_METAFILEPICT, DVASPECT_CONTENT, ADVF_PRIMEFIRST, mf_blank_bits, sizeof(mf_blank_bits) },
3762 { "\2OlePres002", CF_DIB, DVASPECT_CONTENT, ADVF_PRIMEFIRST, bmpimage, sizeof(bmpimage) }}
3763};
3764static const struct storage_def stg_def_4 =
3765{
3767 {{ "Contents", -1, 0, 0, bmpimage, sizeof(bmpimage) },
3768 { "\2OlePres000", 0, DVASPECT_ICON, ADVF_PRIMEFIRST | ADVF_ONLYONCE, NULL, 0 },
3769 { "\2OlePres001", CF_METAFILEPICT, DVASPECT_CONTENT, ADVF_PRIMEFIRST, mf_blank_bits, sizeof(mf_blank_bits) },
3770 { "\2OlePres002", CF_DIB, DVASPECT_CONTENT, ADVF_PRIMEFIRST, bmpimage, sizeof(bmpimage) },
3771 { "MyStream", -1, 0, 0, "Hello World!", 13 }}
3772};
3773static const struct storage_def stg_def_4_saved =
3774{
3775 &CLSID_NULL, 1,
3776 {{ "\2OlePres000", 0, DVASPECT_ICON, ADVF_PRIMEFIRST | ADVF_ONLYONCE, NULL, 0 }}
3777};
3778static const struct storage_def stg_def_5 =
3779{
3781 {{ "Contents", -1, 0, 0, bmpimage, sizeof(bmpimage) },
3782 { "\2OlePres002", CF_DIB, DVASPECT_CONTENT, ADVF_PRIMEFIRST, bmpimage, sizeof(bmpimage) },
3783 { "\2OlePres001", CF_METAFILEPICT, DVASPECT_CONTENT, ADVF_PRIMEFIRST, mf_blank_bits, sizeof(mf_blank_bits) },
3784 { "\2OlePres000", 0, DVASPECT_ICON, ADVF_PRIMEFIRST | ADVF_ONLYONCE, NULL, 0 },
3785 { "MyStream", -1, 0, 0, "Hello World!", 13 }}
3786};
3787static const struct storage_def stg_def_5_saved =
3788{
3789 &CLSID_NULL, 1,
3790 {{ "\2OlePres000", 0, DVASPECT_ICON, ADVF_PRIMEFIRST | ADVF_ONLYONCE, NULL, 0 }}
3791};
3792static const struct storage_def stg_def_6 =
3793{
3795 {{ "Contents", -1, 0, 0, bmpimage, sizeof(bmpimage) },
3796 { "\2OlePres001", CF_METAFILEPICT, DVASPECT_CONTENT, ADVF_PRIMEFIRST, mf_blank_bits, sizeof(mf_blank_bits) },
3797 { "\2OlePres000", 0, DVASPECT_ICON, ADVF_PRIMEFIRST | ADVF_ONLYONCE, NULL, 0 },
3798 { "\2OlePres002", CF_DIB, DVASPECT_CONTENT, ADVF_PRIMEFIRST, bmpimage, sizeof(bmpimage) },
3799 { "MyStream", -1, 0, 0, "Hello World!", 13 }}
3800};
3801static const struct storage_def stg_def_6_saved =
3802{
3803 &CLSID_NULL, 1,
3804 {{ "\2OlePres000", 0, DVASPECT_ICON, ADVF_PRIMEFIRST | ADVF_ONLYONCE, NULL, 0 }}
3805};
3806static const struct storage_def stg_def_7 =
3807{
3809 {{ "Contents", -1, 0, 0, bmpimage, sizeof(bmpimage) }}
3810};
3811static const struct storage_def stg_def_7_saved =
3812{
3813 &CLSID_NULL, 0, {{ 0 }}
3814};
3815static const struct storage_def stg_def_8 =
3816{
3818 {{ "Contents", -1, 0, 0, mf_blank_bits, sizeof(mf_blank_bits) }}
3819};
3820static const struct storage_def stg_def_8_saved =
3821{
3822 &CLSID_NULL, 0, {{ 0 }}
3823};
3824static const struct storage_def stg_def_9 =
3825{
3827 {{ "Contents", -1, 0, 0, bmpimage, sizeof(bmpimage) }}
3828};
3829static const struct storage_def stg_def_9_saved =
3830{
3831 &CLSID_NULL, 0, {{ 0 }}
3832};
3833
3835{
3836 HRESULT hr;
3837 ULONG bytes;
3838 int length, clipformat = -2;
3839
3840 hr = IStream_Read(stream, &length, sizeof(length), &bytes);
3841 if (hr != S_OK || bytes != sizeof(length))
3842 return -2;
3843 if (length == 0)
3844 return 0;
3845 if (length == -1)
3846 {
3847 hr = IStream_Read(stream, &clipformat, sizeof(clipformat), &bytes);
3848 if (hr != S_OK || bytes != sizeof(clipformat))
3849 return -2;
3850 }
3851 else
3852 ok(0, "unhandled clipformat length %d\n", length);
3853
3854 return clipformat;
3855}
3856
3857static void check_storage_contents(IStorage *stg, const struct storage_def *stg_def,
3858 int *enumerated_streams, int *matched_streams)
3859{
3860 HRESULT hr;
3861 IEnumSTATSTG *enumstg;
3862 IStream *stream;
3863 STATSTG stat;
3864 int i, seen_stream[MAX_STREAM] = { 0 };
3865
3866 if (winetest_debug > 1)
3867 trace("check_storage_contents:\n=============================================\n");
3868
3869 *enumerated_streams = 0;
3870 *matched_streams = 0;
3871
3872 hr = IStorage_Stat(stg, &stat, STATFLAG_NONAME);
3873 ok(hr == S_OK, "unexpected %#lx\n", hr);
3874 ok(IsEqualCLSID(stg_def->clsid, &stat.clsid), "expected %s, got %s\n",
3875 wine_dbgstr_guid(stg_def->clsid), wine_dbgstr_guid(&stat.clsid));
3876
3877 hr = IStorage_EnumElements(stg, 0, NULL, 0, &enumstg);
3878 ok(hr == S_OK, "unexpected %#lx\n", hr);
3879
3880 for (;;)
3881 {
3882 ULONG bytes;
3883 int clipformat = -1;
3885 char name[32];
3886 BYTE data[1024];
3887
3888 memset(&header, 0, sizeof(header));
3889
3890 hr = IEnumSTATSTG_Next(enumstg, 1, &stat, NULL);
3891 if(hr == S_FALSE) break;
3892 ok(hr == S_OK, "unexpected %#lx\n", hr);
3893
3894 if (winetest_debug > 1)
3895 trace("name %s, type %lu, size %ld, clsid %s\n",
3896 wine_dbgstr_w(stat.pwcsName), stat.type, stat.cbSize.u.LowPart, wine_dbgstr_guid(&stat.clsid));
3897
3898 ok(stat.type == STGTY_STREAM, "unexpected %#lx\n", stat.type);
3899
3900 WideCharToMultiByte(CP_ACP, 0, stat.pwcsName, -1, name, sizeof(name), NULL, NULL);
3901
3902 hr = IStorage_OpenStream(stg, stat.pwcsName, NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &stream);
3903 ok(hr == S_OK, "unexpected %#lx\n", hr);
3904
3905 if (!memcmp(name, "\2OlePres", 8))
3906 {
3907 ULONG header_size = sizeof(header);
3908
3909 clipformat = read_clipformat(stream);
3910
3911 if (clipformat == 0) /* view cache */
3912 header_size = FIELD_OFFSET(PresentationDataHeader, unknown7);
3913
3914 hr = IStream_Read(stream, &header, header_size, &bytes);
3915 ok(hr == S_OK, "unexpected %#lx\n", hr);
3916 ok(bytes == header_size, "read %lu bytes, expected %lu\n", bytes, header_size);
3917
3918 if (winetest_debug > 1)
3919 trace("header: tdSize %#lx, dvAspect %#x, lindex %#lx, advf %#lx, unknown7 %#lx, dwObjectExtentX %#lx, dwObjectExtentY %#lx, dwSize %#lx\n",
3920 header.tdSize, header.dvAspect, header.lindex, header.advf, header.unknown7,
3921 header.dwObjectExtentX, header.dwObjectExtentY, header.dwSize);
3922 }
3923
3924 memset(data, 0, sizeof(data));
3925 hr = IStream_Read(stream, data, sizeof(data), &bytes);
3926 ok(hr == S_OK, "unexpected %#lx\n", hr);
3927 if (winetest_debug > 1)
3928 trace("stream data (%lu bytes): %02x %02x %02x %02x\n", bytes, data[0], data[1], data[2], data[3]);
3929
3930 for (i = 0; i < stg_def->stream_count; i++)
3931 {
3932 if (seen_stream[i]) continue;
3933
3934 if (winetest_debug > 1)
3935 trace("%s/%s, %d/%d, %d/%d, %d/%ld\n",
3936 stg_def->stream[i].name, name,
3937 stg_def->stream[i].cf, clipformat,
3938 stg_def->stream[i].dvAspect, header.dvAspect,
3939 stg_def->stream[i].advf, header.advf);
3940
3941 if (!strcmp(stg_def->stream[i].name, name) &&
3942 stg_def->stream[i].cf == clipformat &&
3943 stg_def->stream[i].dvAspect == header.dvAspect &&
3944 stg_def->stream[i].advf == header.advf &&
3945 stg_def->stream[i].data_size <= bytes &&
3946 (!stg_def->stream[i].data_size ||
3947 (!memcmp(stg_def->stream[i].data, data, min(stg_def->stream[i].data_size, bytes)))))
3948 {
3949 if (winetest_debug > 1)
3950 trace("stream %d matches def stream %d\n", *enumerated_streams, i);
3951 seen_stream[i] = 1;
3952 *matched_streams += 1;
3953 }
3954 }
3955
3956 CoTaskMemFree(stat.pwcsName);
3957 IStream_Release(stream);
3958
3959 *enumerated_streams += 1;
3960 }
3961
3962 IEnumSTATSTG_Release(enumstg);
3963}
3964
3965static HRESULT stgmedium_cmp(const STGMEDIUM *med1, STGMEDIUM *med2)
3966{
3967 BYTE *data1, *data2;
3968 ULONG datasize1, datasize2;
3969
3970 if (med1->tymed != med2->tymed)
3971 return E_FAIL;
3972
3973 if (med1->tymed == TYMED_MFPICT)
3974 {
3975 METAFILEPICT *mfpict1 = GlobalLock(med1->hMetaFilePict);
3976 METAFILEPICT *mfpict2 = GlobalLock(med2->hMetaFilePict);
3977
3978 datasize1 = GetMetaFileBitsEx(mfpict1->hMF, 0, NULL);
3979 datasize2 = GetMetaFileBitsEx(mfpict2->hMF, 0, NULL);
3980 if (datasize1 == datasize2)
3981 {
3982 data1 = malloc(datasize1);
3983 data2 = malloc(datasize2);
3984 GetMetaFileBitsEx(mfpict1->hMF, datasize1, data1);
3985 GetMetaFileBitsEx(mfpict2->hMF, datasize2, data2);
3986 }
3987 else return E_FAIL;
3988 }
3989 else if (med1->tymed == TYMED_ENHMF)
3990 {
3991 datasize1 = GetEnhMetaFileBits(med1->hEnhMetaFile, 0, NULL);
3992 datasize2 = GetEnhMetaFileBits(med2->hEnhMetaFile, 0, NULL);
3993 if (datasize1 == datasize2)
3994 {
3995 data1 = malloc(datasize1);
3996 data2 = malloc(datasize2);
3997 GetEnhMetaFileBits(med1->hEnhMetaFile, datasize1, data1);
3998 GetEnhMetaFileBits(med2->hEnhMetaFile, datasize2, data2);
3999 }
4000 else return E_FAIL;
4001 }
4002 else if (med1->tymed == TYMED_HGLOBAL)
4003 {
4004 datasize1 = GlobalSize(med1->hGlobal);
4005 datasize2 = GlobalSize(med2->hGlobal);
4006
4007 if (datasize1 == datasize2)
4008 {
4009 data1 = GlobalLock(med1->hGlobal);
4010 data2 = GlobalLock(med2->hGlobal);
4011 }
4012 else
4013 return E_FAIL;
4014 }
4015 else
4016 return E_NOTIMPL;
4017
4018 if (memcmp(data1, data2, datasize1) != 0)
4019 return E_FAIL;
4020
4021 if (med1->tymed == TYMED_HGLOBAL)
4022 {
4023 GlobalUnlock(med1->hGlobal);
4024 GlobalUnlock(med2->hGlobal);
4025 }
4026 else if (med1->tymed == TYMED_MFPICT)
4027 {
4028 free(data1);
4029 free(data2);
4030 GlobalUnlock(med1->hMetaFilePict);
4031 GlobalUnlock(med2->hMetaFilePict);
4032 }
4033 else
4034 {
4035 free(data1);
4036 free(data2);
4037 }
4038
4039 return S_OK;
4040}
4041
4042static IStorage *create_storage_from_def(const struct storage_def *stg_def)
4043{
4044 HRESULT hr;
4045 IStorage *stg;
4046 IStream *stm;
4047 int i;
4048
4050 ok(hr == S_OK, "unexpected %#lx\n", hr);
4051
4052 hr = IStorage_SetClass(stg, stg_def->clsid);
4053 ok(hr == S_OK, "unexpected %#lx\n", hr);
4054
4055 for (i = 0; i < stg_def->stream_count; i++)
4056 {
4057 WCHAR name[32];
4058
4059 MultiByteToWideChar(CP_ACP, 0, stg_def->stream[i].name, -1, name, 32);
4060 hr = IStorage_CreateStream(stg, name, STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &stm);
4061 ok(hr == S_OK, "unexpected %#lx\n", hr);
4062
4063 if (stg_def->stream[i].cf != -1)
4064 {
4065 int clipformat[2];
4067
4068 if (stg_def->stream[i].cf)
4069 {
4070 clipformat[0] = -1;
4071 clipformat[1] = stg_def->stream[i].cf;
4072 hr = IStream_Write(stm, clipformat, sizeof(clipformat), NULL);
4073 }
4074 else
4075 {
4076 clipformat[0] = 0;
4077 hr = IStream_Write(stm, &clipformat[0], sizeof(clipformat[0]), NULL);
4078 }
4079 ok(hr == S_OK, "unexpected %#lx\n", hr);
4080
4081 hdr.tdSize = sizeof(hdr.tdSize);
4082 hdr.dvAspect = stg_def->stream[i].dvAspect;
4083 hdr.lindex = -1;
4084 hdr.advf = stg_def->stream[i].advf;
4085 hdr.unknown7 = 0;
4086 hdr.dwObjectExtentX = 0;
4087 hdr.dwObjectExtentY = 0;
4088 hdr.dwSize = stg_def->stream[i].data_size;
4089 hr = IStream_Write(stm, &hdr, sizeof(hdr), NULL);
4090 ok(hr == S_OK, "unexpected %#lx\n", hr);
4091 }
4092
4093 if (stg_def->stream[i].data_size)
4094 {
4095 hr = IStream_Write(stm, stg_def->stream[i].data, stg_def->stream[i].data_size, NULL);
4096 ok(hr == S_OK, "unexpected %#lx\n", hr);
4097 }
4098
4099 IStream_Release(stm);
4100 }
4101
4102 return stg;
4103}
4104
4105static const BYTE dib_inf[] =
4106{
4107 0x42, 0x4d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00,
4108 0x00, 0x00, 0x36, 0x00, 0x00, 0x00
4109};
4110
4111static const BYTE mf_rec[] =
4112{
4113 0xd7, 0xcd, 0xc6, 0x9a, 0x00, 0x00, 0x00, 0x00,
4114 0x00, 0x00, 0x16, 0x00, 0x2d, 0x00, 0x40, 0x02,
4115 0x00, 0x00, 0x00, 0x00, 0x6a, 0x55
4116};
4117
4118static void get_stgdef(struct storage_def *stg_def, CLIPFORMAT cf, STGMEDIUM *stg_med, int stm_idx)
4119{
4120 BYTE *data;
4121 int data_size;
4122 METAFILEPICT *mfpict;
4123 HDC hdc;
4124
4125 switch (cf)
4126 {
4127 case CF_DIB:
4128 data_size = sizeof(dib_white);
4129 if (!strcmp(stg_def->stream[stm_idx].name, "CONTENTS"))
4130 {
4131 data_size += sizeof(dib_inf);
4132 data = malloc(data_size);
4133 memcpy(data, dib_inf, sizeof(dib_inf));
4134 memcpy(data + sizeof(dib_inf), dib_white, sizeof(dib_white));
4135 }
4136 else
4137 {
4138 data = malloc(data_size);
4139 memcpy(data, dib_white, sizeof(dib_white));
4140 }
4141 stg_def->stream[stm_idx].data = data;
4142 stg_def->stream[stm_idx].data_size = data_size;
4143 break;
4144 case CF_METAFILEPICT:
4145 mfpict = GlobalLock(stg_med->hMetaFilePict);
4146 data_size = GetMetaFileBitsEx(mfpict->hMF, 0, NULL);
4147 if (!strcmp(stg_def->stream[stm_idx].name, "CONTENTS"))
4148 {
4149 data = malloc(data_size + sizeof(mf_rec));
4150 memcpy(data, mf_rec, sizeof(mf_rec));
4151 GetMetaFileBitsEx(mfpict->hMF, data_size, data + sizeof(mf_rec));
4152 data_size += sizeof(mf_rec);
4153 }
4154 else
4155 {
4156 data = malloc(data_size);
4157 GetMetaFileBitsEx(mfpict->hMF, data_size, data);
4158 }
4159 GlobalUnlock(stg_med->hMetaFilePict);
4160 stg_def->stream[stm_idx].data_size = data_size;
4161 stg_def->stream[stm_idx].data = data;
4162 break;
4163 case CF_ENHMETAFILE:
4164 if (!strcmp(stg_def->stream[stm_idx].name, "CONTENTS"))
4165 {
4166 data_size = GetEnhMetaFileBits(stg_med->hEnhMetaFile, 0, NULL);
4167 data = malloc(sizeof(DWORD) + sizeof(ENHMETAHEADER) + data_size);
4168 *((DWORD *)data) = sizeof(ENHMETAHEADER);
4169 GetEnhMetaFileBits(stg_med->hEnhMetaFile, data_size, data + sizeof(DWORD) + sizeof(ENHMETAHEADER));
4170 memcpy(data + sizeof(DWORD), data + sizeof(DWORD) + sizeof(ENHMETAHEADER), sizeof(ENHMETAHEADER));
4171 data_size += sizeof(DWORD) + sizeof(ENHMETAHEADER);
4172 }
4173 else
4174 {
4175 hdc = GetDC(NULL);
4176 data_size = GetWinMetaFileBits(stg_med->hEnhMetaFile, 0, NULL, MM_ANISOTROPIC, hdc);
4177 data = malloc(data_size);
4178 GetWinMetaFileBits(stg_med->hEnhMetaFile, data_size, data, MM_ANISOTROPIC, hdc);
4179 ReleaseDC(NULL, hdc);
4180 }
4181 stg_def->stream[stm_idx].data_size = data_size;
4182 stg_def->stream[stm_idx].data = data;
4183 break;
4184 }
4185}
4186
4187static void get_stgmedium(CLIPFORMAT cfFormat, STGMEDIUM *stgmedium)
4188{
4189 switch (cfFormat)
4190 {
4191 case CF_DIB:
4192 create_dib(stgmedium);
4193 break;
4194 case CF_METAFILEPICT:
4195 create_mfpict(stgmedium);
4196 break;
4197 case CF_ENHMETAFILE:
4198 create_emf(stgmedium);
4199 break;
4200 default:
4201 ok(0, "cf %x not implemented\n", cfFormat);
4202 }
4203}
4204
4205#define MAX_FMTS 5
4207{
4208 HRESULT hr;
4209 STGMEDIUM stgmed;
4210 ILockBytes *ilb;
4211 IStorage *doc;
4213 IPersistStorage *persist;
4214 IDataObject *odata;
4215 int enumerated_streams, matched_streams, i;
4216 DWORD dummy;
4217 STGMEDIUM stgmeds[MAX_FMTS];
4218 struct tests_data_cache
4219 {
4220 FORMATETC fmts[MAX_FMTS];
4221 int num_fmts, num_set;
4222 const CLSID *clsid;
4223 struct storage_def stg_def;
4224 };
4225
4226 static struct tests_data_cache *pdata, data[] =
4227 {
4228 {
4229 {
4230 { CF_DIB, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL },
4231 { CF_METAFILEPICT, 0, DVASPECT_CONTENT, -1, TYMED_MFPICT },
4232 { CF_ENHMETAFILE, 0, DVASPECT_CONTENT, -1, TYMED_ENHMF },
4233 { 0, 0, DVASPECT_DOCPRINT, -1, TYMED_HGLOBAL },
4234 },
4235 4, 3, &CLSID_WineTest,
4236 {
4237 &CLSID_WineTestOld, 4, { { "\2OlePres000", CF_DIB, DVASPECT_CONTENT, 0, NULL, 0 },
4238 { "\2OlePres001", CF_METAFILEPICT, DVASPECT_CONTENT, 0, NULL, 0 },
4239 { "\2OlePres002", CF_ENHMETAFILE, DVASPECT_CONTENT, 0, NULL, 0 },
4240 { "\2OlePres003", 0, DVASPECT_DOCPRINT, 0, NULL, 0 } }
4241 }
4242 },
4243 /* without setting data */
4244 {
4245 {
4246 { CF_DIB, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL },
4247 { CF_METAFILEPICT, 0, DVASPECT_CONTENT, -1, TYMED_MFPICT },
4248 { CF_ENHMETAFILE, 0, DVASPECT_CONTENT, -1, TYMED_ENHMF },
4249 },
4250 3, 0, &CLSID_WineTest,
4251 {
4252 &CLSID_WineTestOld, 3, { { "\2OlePres000", CF_DIB, DVASPECT_CONTENT, 0, NULL, 0 },
4253 { "\2OlePres001", CF_METAFILEPICT, DVASPECT_CONTENT, 0, NULL, 0 },
4254 { "\2OlePres002", CF_ENHMETAFILE, DVASPECT_CONTENT, 0, NULL, 0 } }
4255 }
4256 },
4257 /* static picture clsids */
4258 {
4259 {
4260 { CF_DIB, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL },
4261 },
4262 1, 1, &CLSID_Picture_Dib,
4263 {
4264 &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } }
4265 }
4266 },
4267 {
4268 {
4269 { CF_METAFILEPICT, 0, DVASPECT_CONTENT, -1, TYMED_MFPICT },
4270 },
4272 {
4273 &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } }
4274 }
4275 },
4276 {
4277 {
4278 { CF_ENHMETAFILE, 0, DVASPECT_CONTENT, -1, TYMED_ENHMF },
4279 },
4281 {
4282 &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } }
4283 }
4284 },
4285 /* static picture clsids without setting any data */
4286 {
4287 {
4288 { CF_DIB, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL },
4289 },
4290 1, 0, &CLSID_Picture_Dib,
4291 {
4292 &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } }
4293 }
4294 },
4295 {
4296 {
4297 { CF_METAFILEPICT, 0, DVASPECT_CONTENT, -1, TYMED_MFPICT },
4298 },
4300 {
4301 &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } }
4302 }
4303 },
4304 {
4305 {
4306 { CF_ENHMETAFILE, 0, DVASPECT_CONTENT, -1, TYMED_ENHMF },
4307 },
4309 {
4310 &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } }
4311 }
4312 },
4313 {
4314 {
4315 { 0 }
4316 }
4317 }
4318 };
4319
4320 /* test _Save after caching directly through _Cache + _SetData */
4321 for (pdata = data; pdata->clsid != NULL; pdata++)
4322 {
4323 hr = CreateDataCache(NULL, pdata->clsid, &IID_IOleCache2, (void **)&cache);
4324 ok(hr == S_OK, "unexpected %#lx\n", hr);
4325
4326 for (i = 0; i < pdata->num_fmts; i++)
4327 {
4328 hr = IOleCache2_Cache(cache, &pdata->fmts[i], 0, &dummy);
4329 ok(SUCCEEDED(hr), "unexpected %#lx\n", hr);
4330 if (i < pdata->num_set)
4331 {
4332 get_stgmedium(pdata->fmts[i].cfFormat, &stgmeds[i]);
4333 get_stgdef(&pdata->stg_def, pdata->fmts[i].cfFormat, &stgmeds[i], i);
4334 hr = IOleCache2_SetData(cache, &pdata->fmts[i], &stgmeds[i], FALSE);
4335 ok(hr == S_OK, "unexpected %#lx\n", hr);
4336 }
4337 }
4338
4339 /* create Storage in memory where we'll save cache */
4340 hr = CreateILockBytesOnHGlobal(0, TRUE, &ilb);
4341 ok(hr == S_OK, "unexpected %#lx\n", hr);
4343 ok(hr == S_OK, "unexpected %#lx\n", hr);
4344 ILockBytes_Release(ilb);
4345 hr = IStorage_SetClass(doc, &CLSID_WineTestOld);
4346 ok(hr == S_OK, "unexpected %#lx\n", hr);
4347
4348 hr = IOleCache2_QueryInterface(cache, &IID_IPersistStorage, (void **)&persist);
4349 ok(hr == S_OK, "unexpected %#lx\n", hr);
4350
4351 /* cache entries are dirty. test saving them to stg */
4352 hr = IPersistStorage_Save(persist, doc, FALSE);
4353 ok(hr == S_OK, "unexpected %#lx\n", hr);
4354
4355 hr = IPersistStorage_IsDirty(persist);
4356 ok(hr == S_OK, "unexpected %#lx\n", hr);
4357
4358 check_storage_contents(doc, &pdata->stg_def, &enumerated_streams, &matched_streams);
4359 ok(enumerated_streams == matched_streams, "enumerated %d != matched %d\n",
4360 enumerated_streams, matched_streams);
4361 ok(enumerated_streams == pdata->stg_def.stream_count, "created %d != def streams %d\n",
4362 enumerated_streams, pdata->stg_def.stream_count);
4363
4364 IPersistStorage_Release(persist);
4365 IOleCache2_Release(cache);
4366
4367 /* now test _Load/_GetData using the storage we used for _Save */
4368 hr = CreateDataCache(NULL, pdata->clsid, &IID_IOleCache2, (void **)&cache);
4369 ok(hr == S_OK, "unexpected %#lx\n", hr);
4370 hr = IOleCache2_QueryInterface(cache, &IID_IPersistStorage, (void **)&persist);
4371 ok(hr == S_OK, "unexpected %#lx\n", hr);
4372
4373 hr = IStorage_SetClass(doc, pdata->clsid);
4374 ok(hr == S_OK, "unexpected %#lx\n", hr);
4375 hr = IPersistStorage_Load(persist, doc);
4376 ok(hr == S_OK, "unexpected %#lx\n", hr);
4377
4378 hr = IOleCache2_QueryInterface(cache, &IID_IDataObject, (void **)&odata);
4379 ok(hr == S_OK, "unexpected %#lx\n", hr);
4380 for (i = 0; i < pdata->num_set; i++)
4381 {
4382 hr = IDataObject_GetData(odata, &pdata->fmts[i], &stgmed);
4383 ok(hr == S_OK, "unexpected %#lx\n", hr);
4384
4385 hr = stgmedium_cmp(&stgmeds[i], &stgmed);
4386 ok(hr == S_OK, "unexpected %#lx\n", hr);
4387 ReleaseStgMedium(&stgmed);
4388 ReleaseStgMedium(&stgmeds[i]);
4389 }
4390
4391 IDataObject_Release(odata);
4392 IPersistStorage_Release(persist);
4393 IStorage_Release(doc);
4394 IOleCache2_Release(cache);
4395 for (i = 0; i < pdata->num_set; i++)
4396 free((void *)pdata->stg_def.stream[i].data);
4397
4398 }
4399}
4400
4402{
4403 HRESULT hr;
4404 IStorage *doc1, *doc2;
4406 IPersistStorage *stg;
4407 int i, enumerated_streams, matched_streams;
4408 static const struct
4409 {
4410 const struct storage_def *in;
4411 const struct storage_def *out;
4412 } test_data[] =
4413 {
4424 };
4425
4426 for (i = 0; i < ARRAY_SIZE(test_data); i++)
4427 {
4428 if (winetest_debug > 1)
4429 trace("start testing storage def %d\n", i);
4430
4432 if (!doc1) continue;
4433
4434 enumerated_streams = matched_streams = -1;
4435 check_storage_contents(doc1, test_data[i].in, &enumerated_streams, &matched_streams);
4436 ok(enumerated_streams == matched_streams, "%d in: enumerated %d != matched %d\n", i,
4437 enumerated_streams, matched_streams);
4438 ok(enumerated_streams == test_data[i].in->stream_count, "%d: created %d != def streams %d\n", i,
4439 enumerated_streams, test_data[i].in->stream_count);
4440
4442 ok(hr == S_OK, "unexpected %#lx\n", hr);
4443 hr = IOleCache2_QueryInterface(cache, &IID_IPersistStorage, (void **)&stg);
4444 ok(hr == S_OK, "unexpected %#lx\n", hr);
4445 hr = IPersistStorage_Load(stg, doc1);
4446 ok(hr == S_OK, "unexpected %#lx\n", hr);
4447
4448 IStorage_Release(doc1);
4449
4451 ok(hr == S_OK, "unexpected %#lx\n", hr);
4452
4453 hr = IPersistStorage_IsDirty(stg);
4454 ok(hr == S_FALSE, "%d: unexpected %#lx\n", i, hr);
4455
4456 hr = IPersistStorage_Save(stg, doc2, FALSE);
4457 ok(hr == S_OK, "unexpected %#lx\n", hr);
4458
4459 IPersistStorage_Release(stg);
4460
4461 enumerated_streams = matched_streams = -1;
4462 check_storage_contents(doc2, test_data[i].out, &enumerated_streams, &matched_streams);
4464 ok(enumerated_streams == matched_streams, "%d out: enumerated %d != matched %d\n", i,
4465 enumerated_streams, matched_streams);
4467 || test_data[i].in == &stg_def_6))
4468 ok(enumerated_streams == test_data[i].out->stream_count, "%d: saved streams %d != def streams %d\n", i,
4469 enumerated_streams, test_data[i].out->stream_count);
4470
4471 IStorage_Release(doc2);
4472
4473 if (winetest_debug > 1)
4474 trace("done testing storage def %d\n", i);
4475 }
4476}
4477
4479{
4480 FORMATETC dib_fmt = {CF_DIB, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
4481 FORMATETC emf_fmt = {CF_ENHMETAFILE, NULL, DVASPECT_CONTENT, -1, TYMED_ENHMF};
4482 FORMATETC text_fmt = {CF_TEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
4483 HRESULT hr;
4484 IOleObject *ole_obj = NULL;
4486 ILockBytes *ilb;
4487 IPersist *persist;
4488 CLSID clsid;
4489 STATSTG statstg;
4490 int enumerated_streams, matched_streams;
4491 STGMEDIUM stgmed;
4492 static const struct expected_method methods_create_from_dib[] =
4493 {
4494 { "DataObject_EnumFormatEtc", TEST_TODO },
4495 { "DataObject_GetDataHere", 0 },
4496 { NULL }
4497 };
4498 static struct storage_def stg_def_dib =
4499 {
4501 {{ "\1Ole", -1, 0, 0, NULL, 0 },
4502 { "\1CompObj", -1, 0, 0, NULL, 0 },
4503 { "CONTENTS", -1, 0, 0, NULL, 0 }}
4504 };
4505 static struct storage_def stg_def_emf =
4506 {
4508 {{ "\1Ole", -1, 0, 0, NULL, 0 },
4509 { "\1CompObj", -1, 0, 0, NULL, 0 },
4510 { "CONTENTS", -1, 0, 0, NULL, 0 }}
4511 };
4512
4513
4515 ok(hr == S_OK, "CreateILockBytesOnHGlobal failed: 0x%08lx.\n", hr);
4517 0, &storage);
4518 ok(hr == S_OK, "StgCreateDocfileOnILockBytes failed: 0x%08lx.\n", hr);
4519 ILockBytes_Release(ilb);
4520
4521 hr = OleCreateStaticFromData(&DataObject, &IID_IOleObject, OLERENDER_FORMAT,
4522 &dib_fmt, NULL, NULL, (void **)&ole_obj);
4523 ok(hr == E_INVALIDARG, "OleCreateStaticFromData should fail: 0x%08lx.\n", hr);
4524
4525 hr = OleCreateStaticFromData(&DataObject, &IID_IOleObject, OLERENDER_FORMAT,
4526 &dib_fmt, NULL, storage, NULL);
4527 ok(hr == E_INVALIDARG, "OleCreateStaticFromData should fail: 0x%08lx.\n", hr);
4528
4529 /* CF_DIB */
4530 data_object_format = &dib_fmt;
4532 hr = OleCreateStaticFromData(&DataObject, &IID_IOleObject, OLERENDER_FORMAT,
4533 &dib_fmt, NULL, storage, (void **)&ole_obj);
4534 ok(hr == S_OK, "OleCreateStaticFromData failed: 0x%08lx.\n", hr);
4535 hr = IOleObject_QueryInterface(ole_obj, &IID_IPersist, (void **)&persist);
4536 ok(hr == S_OK, "IOleObject_QueryInterface failed: 0x%08lx.\n", hr);
4537 hr = IPersist_GetClassID(persist, &clsid);
4538 ok(hr == S_OK, "IPersist_GetClassID failed: 0x%08lx.\n", hr);
4539 ok(IsEqualCLSID(&clsid, &CLSID_Picture_Dib), "Got wrong clsid: %s, expected: %s.\n",
4541 hr = IStorage_Stat(storage, &statstg, STATFLAG_NONAME);
4542 ok_ole_success(hr, "IStorage_Stat");
4543 ok(IsEqualCLSID(&CLSID_Picture_Dib, &statstg.clsid), "Wrong CLSID in storage.\n");
4544 enumerated_streams = matched_streams = -1;
4545 get_stgmedium(CF_DIB, &stgmed);
4546 get_stgdef(&stg_def_dib, CF_DIB, &stgmed, 2);
4547 check_storage_contents(storage, &stg_def_dib, &enumerated_streams, &matched_streams);
4548 ok(enumerated_streams == matched_streams, "enumerated %d != matched %d\n",
4549 enumerated_streams, matched_streams);
4550 ok(enumerated_streams == stg_def_dib.stream_count, "created %d != def streams %d\n",
4551 enumerated_streams, stg_def_dib.stream_count);
4552 ReleaseStgMedium(&stgmed);
4553 IPersist_Release(persist);
4554 IStorage_Release(storage);
4555 IOleObject_Release(ole_obj);
4556 free((void *)stg_def_dib.stream[2].data);
4557
4558 /* CF_ENHMETAFILE */
4560 ok(hr == S_OK, "CreateILockBytesOnHGlobal failed: 0x%08lx.\n", hr);
4562 0, &storage);
4563 ok(hr == S_OK, "StgCreateDocfileOnILockBytes failed: 0x%08lx.\n", hr);
4564 ILockBytes_Release(ilb);
4565 data_object_format = &emf_fmt;
4566 hr = OleCreateStaticFromData(&DataObject, &IID_IOleObject, OLERENDER_FORMAT,
4567 &emf_fmt, NULL, storage, (void **)&ole_obj);
4568 ok(hr == S_OK, "OleCreateStaticFromData failed: 0x%08lx.\n", hr);
4569 hr = IOleObject_QueryInterface(ole_obj, &IID_IPersist, (void **)&persist);
4570 ok(hr == S_OK, "IOleObject_QueryInterface failed: 0x%08lx.\n", hr);
4571 hr = IPersist_GetClassID(persist, &clsid);
4572 ok(hr == S_OK, "IPersist_GetClassID failed: 0x%08lx.\n", hr);
4573 ok(IsEqualCLSID(&clsid, &CLSID_Picture_EnhMetafile), "Got wrong clsid: %s, expected: %s.\n",
4575 hr = IStorage_Stat(storage, &statstg, STATFLAG_NONAME);
4576 ok_ole_success(hr, "IStorage_Stat");
4577 ok(IsEqualCLSID(&CLSID_Picture_EnhMetafile, &statstg.clsid), "Wrong CLSID in storage.\n");
4578 enumerated_streams = matched_streams = -1;
4579 get_stgmedium(CF_ENHMETAFILE, &stgmed);
4580 get_stgdef(&stg_def_emf, CF_ENHMETAFILE, &stgmed, 2);
4581 check_storage_contents(storage, &stg_def_emf, &enumerated_streams, &matched_streams);
4582 ok(enumerated_streams == matched_streams, "enumerated %d != matched %d\n",
4583 enumerated_streams, matched_streams);
4584 ok(enumerated_streams == stg_def_emf.stream_count, "created %d != def streams %d\n",
4585 enumerated_streams, stg_def_emf.stream_count);
4586 ReleaseStgMedium(&stgmed);
4587 IPersist_Release(persist);
4588 IStorage_Release(storage);
4589 IOleObject_Release(ole_obj);
4590 free((void *)stg_def_emf.stream[2].data);
4591
4592 /* CF_TEXT */
4594 ok(hr == S_OK, "CreateILockBytesOnHGlobal failed: 0x%08lx.\n", hr);
4596 0, &storage);
4597 ok(hr == S_OK, "StgCreateDocfileOnILockBytes failed: 0x%08lx.\n", hr);
4598 ILockBytes_Release(ilb);
4599 data_object_format = &text_fmt;
4600 hr = OleCreateStaticFromData(&DataObject, &IID_IOleObject, OLERENDER_FORMAT,
4601 &text_fmt, NULL, storage, (void **)&ole_obj);
4602 ok(hr == DV_E_CLIPFORMAT, "OleCreateStaticFromData should fail: 0x%08lx.\n", hr);
4603 IStorage_Release(storage);
4604
4606 ok(hr == S_OK, "CreateILockBytesOnHGlobal failed: 0x%08lx.\n", hr);
4608 0, &storage);
4609 ok(hr == S_OK, "StgCreateDocfileOnILockBytes failed: 0x%08lx.\n", hr);
4610 ILockBytes_Release(ilb);
4611 data_object_format = &dib_fmt;
4612 expected_method_list = methods_create_from_dib;
4613 hr = OleCreateFromData(&DataObject, &IID_IOleObject, OLERENDER_FORMAT, &dib_fmt, NULL,
4614 storage, (void **)&ole_obj);
4615 todo_wine ok(hr == DV_E_FORMATETC, "OleCreateFromData should failed: 0x%08lx.\n", hr);
4616 IStorage_Release(storage);
4617}
4618
4619static void test_ReleaseStgMedium( void )
4620{
4622}
4623
4625{
4626 DWORD dwRegister;
4627 IStorage *pStorage;
4628 STATSTG statstg;
4629 HRESULT hr;
4630
4631 cf_test_1 = RegisterClipboardFormatA("cf_winetest_1");
4632 cf_test_2 = RegisterClipboardFormatA("cf_winetest_2");
4633 cf_test_3 = RegisterClipboardFormatA("cf_winetest_3");
4634
4636
4637 hr = CoRegisterClassObject(&CLSID_Equation3, (IUnknown *)&OleObjectCF, CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, &dwRegister);
4638 ok_ole_success(hr, "CoRegisterClassObject");
4639
4641 ok_ole_success(hr, "StgCreateDocfile");
4642
4643 test_OleCreate(pStorage);
4644
4645 hr = IStorage_Stat(pStorage, &statstg, STATFLAG_NONAME);
4646 ok_ole_success(hr, "IStorage_Stat");
4647 ok(IsEqualCLSID(&CLSID_Equation3, &statstg.clsid), "Wrong CLSID in storage\n");
4648
4649 test_OleLoad(pStorage);
4650
4651 IStorage_Release(pStorage);
4652
4653 hr = CoRevokeClassObject(dwRegister);
4654 ok_ole_success(hr, "CoRevokeClassObject");
4655
4657
4666 test_runnable();
4667 test_OleRun();
4669 test_OleDraw();
4676
4678}
#define expect(EXPECTED, GOT)
Definition: SystemMenu.c:483
#define stat
Definition: acwin.h:99
static unsigned char bytes[4]
Definition: adnsresfilter.c:74
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define broken(x)
Definition: atltest.h:178
#define START_TEST(x)
Definition: atltest.h:75
#define CF_METAFILEPICT
Definition: constants.h:398
#define CF_BITMAP
Definition: constants.h:397
#define CF_ENHMETAFILE
Definition: constants.h:409
#define CF_TEXT
Definition: constants.h:396
#define CF_MAX
Definition: constants.h:412
#define CF_DIB
Definition: constants.h:403
#define ARRAY_SIZE(A)
Definition: main.h:20
const GUID IID_IUnknown
const GUID IID_IClassFactory
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
#define RegCloseKey(hKey)
Definition: registry.h:49
struct _root root
const CLSID CLSID_Picture_EnhMetafile
const CLSID CLSID_Picture_Dib
const CLSID CLSID_ManualResetEvent
const CLSID CLSID_Picture_Metafile
static HWND hwndParent
Definition: cryptui.c:300
_In_ size_t const _In_ int _In_ bool const _In_ unsigned const _In_ __acrt_rounding_mode const _Inout_ __crt_cached_ptd_host & ptd
Definition: cvt.cpp:355
HRESULT WINAPI CreateDataCache(LPUNKNOWN pUnkOuter, REFCLSID rclsid, REFIID riid, LPVOID *ppvObj)
Definition: datacache.c:3029
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define ERROR_SUCCESS
Definition: deptool.c:10
static const WCHAR clsidW[]
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegDeleteKeyA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey)
Definition: reg.c:1224
HRESULT WINAPI DECLSPEC_HOTPATCH CoRevokeClassObject(DWORD cookie)
Definition: combase.c:3107
INT WINAPI StringFromGUID2(REFGUID guid, LPOLESTR str, INT cmax)
Definition: combase.c:1525
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: combase.c:2842
HRESULT WINAPI CoRegisterClassObject(REFCLSID rclsid, IUnknown *object, DWORD clscontext, DWORD flags, DWORD *cookie)
Definition: combase.c:2970
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
HRESULT WINAPI CreateStreamOnHGlobal(HGLOBAL hGlobal, BOOL delete_on_release, IStream **stream)
#define CP_ACP
Definition: compat.h:109
#define GetProcAddress(x, y)
Definition: compat.h:753
#define MAX_PATH
Definition: compat.h:34
#define lstrcpyW
Definition: compat.h:749
#define WideCharToMultiByte
Definition: compat.h:111
#define MultiByteToWideChar
Definition: compat.h:110
#define lstrlenW
Definition: compat.h:750
static const WCHAR version[]
Definition: asmname.c:66
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
UINT WINAPI GetSystemDirectoryA(OUT LPSTR lpBuffer, IN UINT uSize)
Definition: path.c:2202
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4152
INT WINAPI CompareStringW(LCID lcid, DWORD flags, LPCWSTR str1, INT len1, LPCWSTR str2, INT len2)
Definition: locale.c:3946
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2802
_ACRTIMP __msvcrt_long __cdecl atol(const char *)
Definition: string.c:1782
_ACRTIMP int __cdecl strcmp(const char *, const char *)
Definition: string.c:3319
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:531
HRESULT WINAPI OleCreateEmbeddingHelper(REFCLSID clsid, LPUNKNOWN pUnkOuter, DWORD flags, IClassFactory *pCF, REFIID riid, LPVOID *ppvObj)
HRESULT WINAPI OleCreateDefaultHandler(REFCLSID clsid, LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObj)
HRESULT WINAPI OleSetAutoConvert(REFCLSID clsidOld, REFCLSID clsidNew)
Definition: ole2.c:2717
void WINAPI ReleaseStgMedium(STGMEDIUM *pmedium)
Definition: ole2.c:2014
HRESULT WINAPI DECLSPEC_HOTPATCH OleRun(LPUNKNOWN pUnknown)
Definition: ole2.c:1186
HRESULT WINAPI OleLockRunning(LPUNKNOWN pUnknown, BOOL fLock, BOOL fLastUnlockCloses)
Definition: ole2.c:1358
HRESULT WINAPI OleDraw(IUnknown *pUnk, DWORD dwAspect, HDC hdcDraw, LPCRECT rect)
Definition: ole2.c:2552
BOOL WINAPI OleIsRunning(LPOLEOBJECT object)
Definition: ole2.c:2803
HRESULT WINAPI OleCreateStaticFromData(IDataObject *data, REFIID iid, DWORD renderopt, FORMATETC *fmt, IOleClientSite *client_site, IStorage *stg, void **obj)
Definition: ole2.c:3038
HRESULT WINAPI OleDoAutoConvert(LPSTORAGE pStg, LPCLSID pClsidNew)
Definition: ole2.c:2743
HRESULT WINAPI OleCreateFromData(IDataObject *data, REFIID iid, DWORD renderopt, FORMATETC *fmt, IOleClientSite *client_site, IStorage *stg, void **obj)
Definition: ole2.c:3015
HRESULT WINAPI OleLoad(LPSTORAGE pStg, REFIID riid, LPOLECLIENTSITE pClientSite, LPVOID *ppvObj)
Definition: ole2.c:1205
HRESULT WINAPI OleCreate(REFCLSID rclsid, REFIID riid, DWORD renderopt, LPFORMATETC pFormatEtc, LPOLECLIENTSITE pClientSite, LPSTORAGE pStg, LPVOID *ppvObj)
Definition: ole2.c:2596
HRESULT WINAPI OleGetAutoConvert(REFCLSID clsidOld, LPCLSID pClsidNew)
Definition: ole2.c:2691
HRESULT WINAPI StgCreateDocfileOnILockBytes(ILockBytes *plkbyt, DWORD grfMode, DWORD reserved, IStorage **ppstgOpen)
Definition: storage32.c:8891
HRESULT WINAPI StgCreateDocfile(LPCOLESTR pwcsName, DWORD grfMode, DWORD reserved, IStorage **ppstgOpen)
Definition: storage32.c:8597
HRESULT WINAPI WriteFmtUserTypeStg(LPSTORAGE pstg, CLIPFORMAT cf, LPOLESTR lpszUserType)
Definition: storage32.c:9226
HRESULT WINAPI SetConvertStg(IStorage *storage, BOOL convert)
Definition: storage32.c:10377
return ret
Definition: mutex.c:146
r reserved
Definition: btrfs.c:3006
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
uint8_t reserved2[12]
Definition: fsck.fat.h:23
uint8_t reserved3
Definition: fsck.fat.h:26
FxObject * pObject
pKey DeleteObject()
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLsizeiptr size
Definition: glext.h:5919
GLuint index
Definition: glext.h:6031
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLuint in
Definition: glext.h:9616
GLbitfield flags
Definition: glext.h:7161
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
GLsizei GLenum GLboolean sink
Definition: glext.h:5672
GLfloat GLfloat p
Definition: glext.h:8902
GLuint GLuint num
Definition: glext.h:9618
GLfloat param
Definition: glext.h:5796
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:368
SIZE_T NTAPI GlobalSize(HGLOBAL hMem)
Definition: heapmem.c:1090
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
static ERESOURCE GlobalLock
Definition: sys_arch.c:8
char hdr[14]
Definition: iptest.cpp:33
HRESULT WINAPI CreateItemMoniker(const WCHAR *delimiter, const WCHAR *name, IMoniker **ret)
Definition: itemmoniker.c:932
#define debugstr_guid
Definition: kernel32.h:35
#define wine_dbgstr_w
Definition: kernel32.h:34
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
HRESULT WINAPI CreateILockBytesOnHGlobal(HGLOBAL global, BOOL delete_on_release, ILockBytes **ret)
Definition: memlockbytes.c:96
int winetest_debug
#define win_skip
Definition: minitest.h:67
#define todo_wine_if(is_todo)
Definition: minitest.h:81
#define todo_wine
Definition: minitest.h:80
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static PVOID ptr
Definition: dispmode.c:27
HDC hdc
Definition: main.c:9
static HBITMAP
Definition: button.c:44
static HDC
Definition: imagelist.c:88
static struct fmt fmts[]
#define cmp(status, error)
Definition: error.c:114
static HGLOBAL create_text(void)
Definition: clipboard.c:1523
static HGLOBAL create_storage(void)
Definition: clipboard.c:1316
static HENHMETAFILE create_emf(void)
Definition: clipboard.c:1532
static IPersistStorage OleObjectPersistStg
Definition: ole2.c:74
static HRESULT WINAPI Storage_Commit(IStorage *iface, DWORD grfCommitFlags)
Definition: ole2.c:3316
static HRESULT WINAPI OleObjectPersistStg_SaveCompleted(IPersistStorage *iface, IStorage *pStgNew)
Definition: ole2.c:638
#define SET_EXPECT(func)
Definition: ole2.c:41
static IStorage * create_storage_from_def(const struct storage_def *stg_def)
Definition: ole2.c:4042
static BOOL WINAPI OleObjectRunnable_IsRunning(IRunnableObject *iface)
Definition: ole2.c:848
static void test_data_cache_updatecache(void)
Definition: ole2.c:2523
static const struct storage_def stg_def_9
Definition: ole2.c:3824
static HRESULT WINAPI OleObjectPersistStg_InitNew(IPersistStorage *iface, IStorage *pStg)
Definition: ole2.c:607
static const IRunnableObjectVtbl oleruntestvtbl
Definition: ole2.c:3120
static IRunnableObject testrunnable
Definition: ole2.c:3132
static IStorageVtbl StorageVtbl
Definition: ole2.c:3390
static const IPersistStorageVtbl OleObjectPersistStgVtbl
Definition: ole2.c:656
static const struct storage_def stg_def_1
Definition: ole2.c:3726
#define MAX_FMTS
Definition: ole2.c:4205
static HRESULT WINAPI viewobject_SetAdvise(IViewObject *iface, DWORD aspects, DWORD advf, IAdviseSink *sink)
Definition: ole2.c:938
static void WINAPI AdviseSink_OnSave(IAdviseSink *iface)
Definition: ole2.c:1310
static UINT cf_test_1
Definition: ole2.c:119
static HRESULT WINAPI OleObject_IsUpToDate(IOleObject *iface)
Definition: ole2.c:431
static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *pAdvSink, DWORD *pdwConnection)
Definition: ole2.c:483
static BOOL STDMETHODCALLTYPE draw_continue_false(ULONG_PTR param)
Definition: ole2.c:1258
static HRESULT WINAPI DataObject_DAdvise(IDataObject *iface, FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection)
Definition: ole2.c:1445
static HRESULT WINAPI Storage_DestroyElement(IStorage *iface, LPCOLESTR pwcsName)
Definition: ole2.c:3334
static ULONG WINAPI AdviseSink_Release(IAdviseSink *iface)
Definition: ole2.c:1281
static HRESULT WINAPI viewobject_GetColorSet(IViewObject *iface, DWORD draw_aspect, LONG index, void *aspect, DVTARGETDEVICE *ptd, HDC hicTargetDev, LOGPALETTE **colorset)
Definition: ole2.c:918
static ULONG WINAPI AdviseSink_AddRef(IAdviseSink *iface)
Definition: ole2.c:1276
static void test_data_cache_save(void)
Definition: ole2.c:3604
static HRESULT WINAPI AdviseSink_QueryInterface(IAdviseSink *iface, REFIID riid, void **ppv)
Definition: ole2.c:1264
static const struct storage_def stg_def_7
Definition: ole2.c:3806
static const IClassFactoryVtbl OleObjectCFVtbl
Definition: ole2.c:806
static ULONG WINAPI OleObjectCF_Release(IClassFactory *iface)
Definition: ole2.c:791
static void WINAPI AdviseSink_OnViewChange(IAdviseSink *iface, DWORD dwAspect, LONG lindex)
Definition: ole2.c:1295
static ULONG WINAPI OleRun_Release(IRunnableObject *iface)
Definition: ole2.c:3084
static HRESULT WINAPI OleObjectPersistStg_Load(IPersistStorage *iface, IStorage *pStg)
Definition: ole2.c:617
static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **ppv)
Definition: ole2.c:274
static HRESULT WINAPI OleObjectPersistStg_GetClassId(IPersistStorage *iface, CLSID *clsid)
Definition: ole2.c:591
static HRESULT WINAPI OleObjectRunnable_LockRunning(IRunnableObject *iface, BOOL fLock, BOOL fLastUnlockCloses)
Definition: ole2.c:854
static const struct storage_def stg_def_6
Definition: ole2.c:3792
static const struct storage_def stg_def_0_saved
Definition: ole2.c:3722
static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **ppenumAdvise)
Definition: ole2.c:504
static IUnknown unknown
Definition: ole2.c:1532
static ULONG WINAPI OleObject_AddRef(IOleObject *iface)
Definition: ole2.c:299
static const BYTE dib_white[]
Definition: ole2.c:190
static ULONG WINAPI OleObjectRunnable_AddRef(IRunnableObject *iface)
Definition: ole2.c:822
static IRunnableObject OleObjectRunnable
Definition: ole2.c:883
#define ok_ole_success(hr, func)
Definition: ole2.c:36
static const struct expected_method * expected_method_list
Definition: ole2.c:111
static const CLSID CLSID_WineTest
Definition: ole2.c:86
static IOleObject OleObject
Definition: ole2.c:574
static const BYTE dib_inf[]
Definition: ole2.c:4105
static HRESULT WINAPI OleRun_SetContainedObject(IRunnableObject *iface, BOOL contained)
Definition: ole2.c:3114
static ULONG WINAPI Unknown_AddRef(IUnknown *iface)
Definition: ole2.c:1515
static void test_runnable(void)
Definition: ole2.c:3016
static void test_data_cache_cache(void)
Definition: ole2.c:2103
static HRESULT WINAPI OleObjectPersistStg_IsDirty(IPersistStorage *iface)
Definition: ole2.c:598
static ULONG WINAPI DataObject_AddRef(IDataObject *iface)
Definition: ole2.c:1348
static const struct storage_def stg_def_9_saved
Definition: ole2.c:3829
static IAdviseSink AdviseSink
Definition: ole2.c:1332
static BOOL WINAPI OleRun_IsRunning(IRunnableObject *iface)
Definition: ole2.c:3101
static HRESULT WINAPI Storage_OpenStream(IStorage *iface, LPCOLESTR pwcsName, void *reserved1, DWORD grfMode, DWORD reserved2, IStream **ppstm)
Definition: ole2.c:3238
static ULONG WINAPI DataObject_Release(IDataObject *iface)
Definition: ole2.c:1354
static HRESULT WINAPI DataObject_GetData(IDataObject *iface, FORMATETC *format, STGMEDIUM *medium)
Definition: ole2.c:1368
static ULONG WINAPI OleObjectRunnable_Release(IRunnableObject *iface)
Definition: ole2.c:827
#define MAX_STREAM
Definition: ole2.c:3698
static const IUnknownVtbl UnknownVtbl
Definition: ole2.c:1525
#define CHECK_EXPECT(func)
Definition: ole2.c:50
static HRESULT WINAPI Storage_RenameElement(IStorage *iface, LPCOLESTR pwcsOldName, LPCOLESTR pwcsNewName)
Definition: ole2.c:3352
static UINT cf_test_2
Definition: ole2.c:119
static HRESULT WINAPI OleObject_GetMoniker(IOleObject *iface, DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk)
Definition: ole2.c:362
static void get_stgmedium(CLIPFORMAT cfFormat, STGMEDIUM *stgmedium)
Definition: ole2.c:4187
static HRESULT WINAPI Storage_EnumElements(IStorage *iface, DWORD reserved1, void *reserved2, DWORD reserved3, IEnumSTATSTG **ppenum)
Definition: ole2.c:3328
static HRESULT WINAPI Storage_CreateStorage(IStorage *iface, LPCOLESTR pwcsName, DWORD grfMode, DWORD dwStgFmt, DWORD reserved2, IStorage **ppstg)
Definition: ole2.c:3292
static IStream * ole_stream
Definition: ole2.c:3172
static HRESULT WINAPI OleObjectCache_Uncache(IOleCache *iface, DWORD dwConnection)
Definition: ole2.c:716
#define DEFINE_EXPECT(func)
Definition: ole2.c:38
static HRESULT WINAPI OleObject_GetClipboardData(IOleObject *iface, DWORD dwReserved, IDataObject **ppDataObject)
Definition: ole2.c:386
static HRESULT g_QIFailsWith
Definition: ole2.c:117
static HRESULT WINAPI Storage_SetClass(IStorage *iface, REFCLSID clsid)
Definition: ole2.c:3364
static HRESULT WINAPI Storage_Stat(IStorage *iface, STATSTG *pstatstg, DWORD grfStatFlag)
Definition: ole2.c:3378
#define CHECK_NO_EXTRA_METHODS()
Definition: ole2.c:185
static void test_default_handler(void)
Definition: ole2.c:2818
static HRESULT WINAPI OleObjectRunnable_SetContainedObject(IRunnableObject *iface, BOOL fContained)
Definition: ole2.c:863
static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
Definition: ole2.c:472
static void create_dib(STGMEDIUM *med)
Definition: ole2.c:210
static HRESULT WINAPI OleObjectCache_SetData(IOleCache *iface, FORMATETC *pformatetc, STGMEDIUM *pmedium, BOOL fRelease)
Definition: ole2.c:748
static ULONG WINAPI OleObjectPersistStg_Release(IPersistStorage *iface)
Definition: ole2.c:586
static void test_OleLockRunning(void)
Definition: ole2.c:3146
static void test_data_cache_save_data(void)
Definition: ole2.c:4206
static const CLSID CLSID_WineTestOld
Definition: ole2.c:78
static const struct storage_def stg_def_4
Definition: ole2.c:3764
static const CLSID CLSID_Equation3
Definition: ole2.c:885
#define CHECK_EXPECTED_METHOD(method_name)
Definition: ole2.c:182
static const unsigned char bmpimage[]
Definition: ole2.c:3584
static const IRunnableObjectVtbl OleObjectRunnableVtbl
Definition: ole2.c:871
static const struct storage_def stg_def_5_saved
Definition: ole2.c:3787
static const struct storage_def stg_def_1_saved
Definition: ole2.c:3732
static void create_mfpict(STGMEDIUM *med)
Definition: ole2.c:239
static ULONG WINAPI OleRun_AddRef(IRunnableObject *iface)
Definition: ole2.c:3079
static HRESULT WINAPI OleObject_GetUserType(IOleObject *iface, DWORD dwFormOfType, LPOLESTR *pszUserType)
Definition: ole2.c:450
static ULONG WINAPI OleObjectCache_Release(IOleCache *iface)
Definition: ole2.c:682
static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD aspect, DWORD *pdwStatus)
Definition: ole2.c:514
static BOOL g_isRunning
Definition: ole2.c:115
static ULONG WINAPI OleObjectCache_AddRef(IOleCache *iface)
Definition: ole2.c:677
static HRESULT WINAPI OleObjectCache_InitCache(IOleCache *iface, IDataObject *pDataObject)
Definition: ole2.c:737
static const struct storage_def stg_def_2
Definition: ole2.c:3737
static HRESULT WINAPI OleObjectCF_CreateInstance(IClassFactory *iface, IUnknown *punkOuter, REFIID riid, void **ppv)
Definition: ole2.c:796
static HRESULT WINAPI viewobject_Freeze(IViewObject *iface, DWORD draw_aspect, LONG index, void *aspect, DWORD *freeze)
Definition: ole2.c:925
static const BYTE dib_black[]
Definition: ole2.c:200
static HRESULT WINAPI OleObjectRunnable_QueryInterface(IRunnableObject *iface, REFIID riid, void **ppv)
Definition: ole2.c:817
static void check_expected_method_fmt(const char *method_name, const FORMATETC *fmt)
Definition: ole2.c:154
static const BYTE * data_object_dib
Definition: ole2.c:122
static HRESULT WINAPI OleRun_GetRunningClass(IRunnableObject *iface, CLSID *clsid)
Definition: ole2.c:3089
static const struct storage_def stg_def_8
Definition: ole2.c:3815
static ULONG WINAPI OleObject_Release(IOleObject *iface)
Definition: ole2.c:304
static HRESULT WINAPI OleObject_SetHostNames(IOleObject *iface, LPCOLESTR szContainerApp, LPCOLESTR szContainerObj)
Definition: ole2.c:330
static FORMATETC * g_expected_fetc
Definition: ole2.c:112
static HRESULT WINAPI OleObjectCF_LockServer(IClassFactory *iface, BOOL lock)
Definition: ole2.c:801
static ULONG WINAPI Storage_Release(IStorage *iface)
Definition: ole2.c:3188
static void check_storage_contents(IStorage *stg, const struct storage_def *stg_def, int *enumerated_streams, int *matched_streams)
Definition: ole2.c:3857
static IStorage Storage
Definition: ole2.c:3412
static HRESULT WINAPI OleObject_GetUserClassID(IOleObject *iface, CLSID *pClsid)
Definition: ole2.c:440
static int Storage_DestroyElement_limit
Definition: ole2.c:72
static HRESULT WINAPI Storage_SetElementTimes(IStorage *iface, LPCOLESTR pwcsName, const FILETIME *pctime, const FILETIME *patime, const FILETIME *pmtime)
Definition: ole2.c:3358
static const WCHAR comp_objW[]
Definition: ole2.c:3170
static void WINAPI AdviseSink_OnRename(IAdviseSink *iface, IMoniker *pmk)
Definition: ole2.c:1303
static IOleCache * cache
Definition: ole2.c:75
static const struct storage_def stg_def_7_saved
Definition: ole2.c:3811
#define CHECK_EXPECT2(func)
Definition: ole2.c:44
static HRESULT WINAPI DataObject_QueryGetData(IDataObject *iface, FORMATETC *format)
Definition: ole2.c:1410
static BOOL STDMETHODCALLTYPE draw_continue(ULONG_PTR param)
Definition: ole2.c:1252
static HRESULT WINAPI DataObject_GetCanonicalFormatEtc(IDataObject *iface, LPFORMATETC pformatectIn, LPFORMATETC pformatetcOut)
Definition: ole2.c:1417
static IClassFactory OleObjectCF
Definition: ole2.c:815
static HRESULT WINAPI Storage_CreateStream(IStorage *iface, LPCOLESTR pwcsName, DWORD grfMode, DWORD reserved1, DWORD reserved2, IStream **ppstm)
Definition: ole2.c:3194
static HRESULT WINAPI OleObjectCache_Cache(IOleCache *iface, FORMATETC *pformatetc, DWORD advf, DWORD *pdwConnection)
Definition: ole2.c:688
static HRESULT WINAPI OleObjectRunnable_Run(IRunnableObject *iface, LPBINDCTX pbc)
Definition: ole2.c:840
static HRESULT stgmedium_cmp(const STGMEDIUM *med1, STGMEDIUM *med2)
Definition: ole2.c:3965
static ULONG WINAPI viewobject_AddRef(IViewObject *iface)
Definition: ole2.c:899
static FORMATETC * data_object_format
Definition: ole2.c:121
static HRESULT WINAPI OleObject_DoVerb(IOleObject *iface, LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect)
Definition: ole2.c:397
static const struct storage_def stg_def_2_saved
Definition: ole2.c:3743
static HRESULT WINAPI DataObject_DUnadvise(IDataObject *iface, DWORD dwConnection)
Definition: ole2.c:1469
static HRESULT WINAPI Storage_SetStateBits(IStorage *iface, DWORD grfStateBits, DWORD grfMask)
Definition: ole2.c:3372
static const struct storage_def stg_def_0
Definition: ole2.c:3717
static HRESULT WINAPI Storage_MoveElementTo(IStorage *iface, LPCOLESTR pwcsName, IStorage *pstgDest, LPCOLESTR pwcsNewName, DWORD grfFlags)
Definition: ole2.c:3310
static BOOL fmtetc_equal(const FORMATETC *a, const FORMATETC *b)
Definition: ole2.c:1360
static const WCHAR olepres0W[]
Definition: ole2.c:3169
static IStream * olepres_stream
Definition: ole2.c:3173
static HRESULT WINAPI viewobject_Unfreeze(IViewObject *iface, DWORD freeze)
Definition: ole2.c:932
static const struct storage_def stg_def_3
Definition: ole2.c:3748
static HRESULT g_GetMiscStatusFailsWith
Definition: ole2.c:116
static const struct storage_def stg_def_5
Definition: ole2.c:3778
static UINT cf_test_3
Definition: ole2.c:119
static HRESULT WINAPI OleObjectCache_QueryInterface(IOleCache *iface, REFIID riid, void **ppv)
Definition: ole2.c:672
static IDataObject DataObject
Definition: ole2.c:1501
static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite *pClientSite)
Definition: ole2.c:310
static const struct storage_def stg_def_6_saved
Definition: ole2.c:3801
static HRESULT WINAPI OleObjectPersistStg_HandsOffStorage(IPersistStorage *iface)
Definition: ole2.c:648
static HRESULT WINAPI OleRun_Run(IRunnableObject *iface, LPBINDCTX ctx)
Definition: ole2.c:3095
static HRESULT WINAPI DataObject_GetDataHere(IDataObject *iface, LPFORMATETC pformatetc, STGMEDIUM *pmedium)
Definition: ole2.c:1401
static HRESULT WINAPI Storage_CopyTo(IStorage *iface, DWORD ciidExclude, const IID *rgiidExclude, SNB snbExclude, IStorage *pstgDest)
Definition: ole2.c:3304
static HRESULT WINAPI Storage_OpenStorage(IStorage *iface, LPCOLESTR pwcsName, IStorage *pstgPriority, DWORD grfMode, SNB snbExclude, DWORD reserved, IStorage **ppstg)
Definition: ole2.c:3298
static void check_dib_size(HGLOBAL h, int cx, int cy)
Definition: ole2.c:2093
static void test_OleCreateStaticFromData(void)
Definition: ole2.c:4478
static const IOleObjectVtbl OleObjectVtbl
Definition: ole2.c:546
#define CHECK_CALLED(func)
Definition: ole2.c:56
static HRESULT WINAPI OleObject_SetMoniker(IOleObject *iface, DWORD dwWhichMoniker, IMoniker *pmk)
Definition: ole2.c:351
static IStream * comp_obj_stream
Definition: ole2.c:3171
static ULONG WINAPI OleObjectCF_AddRef(IClassFactory *iface)
Definition: ole2.c:786
static HRESULT WINAPI Unknown_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
Definition: ole2.c:1503
static IStream * contents_stream
Definition: ole2.c:3174
static HRESULT WINAPI OleObjectCache_EnumCache(IOleCache *iface, IEnumSTATDATA **ppenumSTATDATA)
Definition: ole2.c:726
static BYTE file_dib[]
Definition: ole2.c:1958
static const struct storage_def stg_def_3_saved
Definition: ole2.c:3757
static HRESULT WINAPI viewobject_Draw(IViewObject *iface, DWORD aspect, LONG index, void *paspect, DVTARGETDEVICE *ptd, HDC hdcTargetDev, HDC hdcDraw, LPCRECTL bounds, LPCRECTL wbounds, BOOL(STDMETHODCALLTYPE *pfnContinue)(ULONG_PTR dwContinue), ULONG_PTR dwContinue)
Definition: ole2.c:909
static BOOL g_showRunnable
Definition: ole2.c:114
static const unsigned char mf_blank_bits[]
Definition: ole2.c:3597
static HRESULT WINAPI OleObjectCF_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
Definition: ole2.c:774
static void check_bitmap_size(HBITMAP h, int cx, int cy)
Definition: ole2.c:2084
static HRESULT WINAPI OleRun_QueryInterface(IRunnableObject *iface, REFIID riid, void **ppv)
Definition: ole2.c:3061
static HRESULT WINAPI DataObject_EnumDAdvise(IDataObject *iface, IEnumSTATDATA **ppenumAdvise)
Definition: ole2.c:1477
static IOleCache OleObjectCache
Definition: ole2.c:772
static HRESULT WINAPI OleRun_LockRunning(IRunnableObject *iface, BOOL lock, BOOL last_unlock_closes)
Definition: ole2.c:3107
static HRESULT WINAPI OleObjectPersistStg_Save(IPersistStorage *iface, IStorage *pStgSave, BOOL fSameAsLoad)
Definition: ole2.c:627
static HRESULT WINAPI Storage_Revert(IStorage *iface)
Definition: ole2.c:3322
static void test_data_cache_initnew(void)
Definition: ole2.c:2401
static void test_OleLoad(IStorage *pStorage)
Definition: ole2.c:1101
static HRESULT WINAPI DataObject_QueryInterface(IDataObject *iface, REFIID riid, void **ppvObject)
Definition: ole2.c:1334
static const BYTE mf_rec[]
Definition: ole2.c:4111
static HRESULT WINAPI OleObject_EnumVerbs(IOleObject *iface, IEnumOLEVERB **ppEnumOleVerb)
Definition: ole2.c:412
static HRESULT WINAPI OleObject_Update(IOleObject *iface)
Definition: ole2.c:422
static IViewObject viewobject
Definition: ole2.c:963
static void WINAPI AdviseSink_OnClose(IAdviseSink *iface)
Definition: ole2.c:1315
static void test_OleDraw(void)
Definition: ole2.c:3154
static void test_data_cache(void)
Definition: ole2.c:1567
static HRESULT WINAPI OleObject_SetExtent(IOleObject *iface, DWORD dwDrawAspect, SIZEL *psizel)
Definition: ole2.c:461
static IDataObjectVtbl DataObjectVtbl
Definition: ole2.c:1485
static void test_OleDoAutoConvert(void)
Definition: ole2.c:3414
static const struct IViewObjectVtbl viewobjectvtbl
Definition: ole2.c:951
static void test_data_cache_dib_contents_stream(int num)
Definition: ole2.c:1994
static HRESULT WINAPI DataObject_EnumFormatEtc(IDataObject *iface, DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc)
Definition: ole2.c:1436
static ULONG WINAPI Storage_AddRef(IStorage *iface)
Definition: ole2.c:3182
static const struct storage_def stg_def_8_saved
Definition: ole2.c:3820
static void test_data_cache_contents(void)
Definition: ole2.c:4401
static HRESULT WINAPI OleObjectRunnable_GetRunningClass(IRunnableObject *iface, LPCLSID lpClsid)
Definition: ole2.c:832
static LONG ole_object_refcount
Definition: ole2.c:272
static int read_clipformat(IStream *stream)
Definition: ole2.c:3834
static void check_enum_cache(IOleCache2 *cache, const STATDATA *expect, int num)
Definition: ole2.c:1534
static HRESULT WINAPI viewobject_GetAdvise(IViewObject *iface, DWORD *aspects, DWORD *advf, IAdviseSink **sink)
Definition: ole2.c:944
static const IAdviseSinkVtbl AdviseSinkVtbl
Definition: ole2.c:1320
static HRESULT WINAPI OleObject_SetColorScheme(IOleObject *iface, LOGPALETTE *pLogpal)
Definition: ole2.c:537
static const IID IID_WineTest
Definition: ole2.c:94
static void test_ReleaseStgMedium(void)
Definition: ole2.c:4619
static HRESULT WINAPI OleObjectPersistStg_QueryInterface(IPersistStorage *iface, REFIID riid, void **ppv)
Definition: ole2.c:576
static ULONG WINAPI Unknown_Release(IUnknown *iface)
Definition: ole2.c:1520
static IRunnableObject * runnable
Definition: ole2.c:76
static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD dwConnection)
Definition: ole2.c:494
static void test_data_cache_init(void)
Definition: ole2.c:2356
#define TEST_TODO
Definition: ole2.c:102
static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption)
Definition: ole2.c:341
static HRESULT WINAPI OleObject_GetClientSite(IOleObject *iface, IOleClientSite **ppClientSite)
Definition: ole2.c:320
static ULONG WINAPI OleObjectPersistStg_AddRef(IPersistStorage *iface)
Definition: ole2.c:581
static BOOL compare_global(HGLOBAL handle, const void *data, SIZE_T size)
Definition: ole2.c:2515
static const WCHAR CONTENTS[]
Definition: ole2.c:1955
static HRESULT WINAPI OleObject_InitFromData(IOleObject *iface, IDataObject *pDataObject, BOOL fCreation, DWORD dwReserved)
Definition: ole2.c:374
static HRESULT WINAPI Storage_QueryInterface(IStorage *iface, REFIID riid, void **ppvObject)
Definition: ole2.c:3176
static HRESULT WINAPI viewobject_QueryInterface(IViewObject *iface, REFIID riid, void **obj)
Definition: ole2.c:887
static void test_OleCreate(IStorage *pStorage)
Definition: ole2.c:965
static void get_stgdef(struct storage_def *stg_def, CLIPFORMAT cf, STGMEDIUM *stg_med, int stm_idx)
Definition: ole2.c:4118
static void test_OleRun(void)
Definition: ole2.c:3134
static const CLSID * Storage_SetClass_CLSID
Definition: ole2.c:71
static ULONG WINAPI viewobject_Release(IViewObject *iface)
Definition: ole2.c:904
static const IOleCacheVtbl OleObjectCacheVtbl
Definition: ole2.c:760
static HRESULT WINAPI DataObject_SetData(IDataObject *iface, LPFORMATETC pformatetc, STGMEDIUM *pmedium, BOOL fRelease)
Definition: ole2.c:1426
static const struct storage_def stg_def_4_saved
Definition: ole2.c:3773
static void WINAPI AdviseSink_OnDataChange(IAdviseSink *iface, FORMATETC *pFormatetc, STGMEDIUM *pStgmed)
Definition: ole2.c:1287
static BSTR *static LPOLESTR
Definition: varformat.c:44
static PROTOCOLDATA * pdata
Definition: protocol.c:158
static HBITMAP create_bitmap(void)
Definition: clipboard.c:530
static HPALETTE palette
Definition: clipboard.c:1341
#define min(a, b)
Definition: monoChain.cc:55
const CLSID * clsid
Definition: msctf.cpp:50
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95
INT WINAPI MulDiv(INT nNumber, INT nNumerator, INT nDenominator)
Definition: muldiv.c:25
unsigned int UINT
Definition: ndis.h:50
#define KEY_READ
Definition: nt_native.h:1026
#define KEY_CREATE_SUB_KEY
Definition: nt_native.h:1021
#define KEY_WRITE
Definition: nt_native.h:1034
#define DWORD
Definition: nt_native.h:44
#define LOCALE_NEUTRAL
#define STGM_CREATE
Definition: objbase.h:943
@ REGCLS_MULTIPLEUSE
Definition: objbase.h:396
#define STGM_READWRITE
Definition: objbase.h:936
#define STGM_SHARE_EXCLUSIVE
Definition: objbase.h:940
#define STGM_DELETEONRELEASE
Definition: objbase.h:942
#define STGM_READ
Definition: objbase.h:934
interface IBindCtx * LPBINDCTX
Definition: objfwd.h:18
#define EMBDHLP_INPROC_SERVER
Definition: ole2.h:48
HGLOBAL WINAPI OleMetafilePictFromIconAndLabel(HICON hIcon, LPOLESTR lpszLabel, LPOLESTR lpszSourceFile, UINT iIconIndex)
Definition: ole32_main.c:40
const GUID IID_IViewObject
const GUID IID_IOleCache
const GUID IID_IAdviseSink
const GUID IID_IViewObject2
const GUID IID_IRunnableObject
const GUID IID_IOleCache2
const GUID IID_IOleCacheControl
const GUID IID_IDataObject
const GUID IID_IOleInPlaceObject
const GUID IID_IPersistStorage
const GUID IID_IOleObject
long LONG
Definition: pedump.c:60
const GUID IID_IPersist
Definition: proxy.cpp:14
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
_Out_opt_ int * cx
Definition: commctrl.h:585
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define CLSID_NULL
Definition: guiddef.h:99
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
#define IID_NULL
Definition: guiddef.h:98
#define REFCLSID
Definition: guiddef.h:117
#define IsEqualCLSID(rclsid1, rclsid2)
Definition: guiddef.h:96
DWORD dwStatus
Definition: mediaobj.idl:95
_In_opt_ IUnknown * punk
Definition: shlwapi.h:158
strcpy
Definition: string.h:131
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:206
#define memset(x, y, z)
Definition: compat.h:39
@ OLEMISC_RECOMPOSEONRESIZE
Definition: actctx.c:82
HRESULT hr
Definition: shlfolder.c:183
& rect
Definition: startmenu.cpp:1413
LONG biYPelsPerMeter
Definition: amvideo.idl:38
LONG biXPelsPerMeter
Definition: amvideo.idl:37
long bottom
Definition: polytest.cpp:53
long right
Definition: polytest.cpp:53
long top
Definition: polytest.cpp:53
long left
Definition: polytest.cpp:53
LONG cx
Definition: kdterminal.h:27
LONG cy
Definition: kdterminal.h:28
Definition: cache.c:49
Definition: tftpd.h:126
Definition: tftpd.h:138
unsigned int flags
Definition: ole2.c:107
const char * method
Definition: ole2.c:106
FORMATETC fmt
Definition: ole2.c:108
Definition: dsound.c:943
Definition: format.c:58
Definition: mem.c:349
Definition: name.c:39
Definition: stat.h:66
int stream_count
Definition: ole2.c:3713
const CLSID * clsid
Definition: ole2.c:3712
struct stream_def stream[MAX_STREAM]
Definition: ole2.c:3714
DVASPECT dvAspect
Definition: ole2.c:3704
const void * data
Definition: ole2.c:3706
int cf
Definition: ole2.c:3703
ADVF advf
Definition: ole2.c:3705
const char * name
Definition: ole2.c:3702
size_t data_size
Definition: ole2.c:3707
Definition: parse.h:23
LONG bmHeight
Definition: wingdi.h:1869
LONG bmWidth
Definition: wingdi.h:1868
HMETAFILE hMF
Definition: wingdi.h:3054
rwlock_t lock
Definition: tcpcore.h:0
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t ULONG_PTR
Definition: typedefs.h:65
uint32_t ULONG
Definition: typedefs.h:59
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
HDC hdcMem
Definition: welcome.c:104
#define GMEM_ZEROINIT
Definition: winbase.h:330
#define GMEM_MOVEABLE
Definition: winbase.h:318
#define GMEM_DDESHARE
Definition: winbase.h:322
#define WINAPI
Definition: msvc.h:6
#define REGDB_E_CLASSNOTREG
Definition: winerror.h:3801
#define S_FALSE
Definition: winerror.h:3451
#define CACHE_S_SAMECACHE
Definition: winerror.h:3832
#define OLE_E_NOCONNECTION
Definition: winerror.h:3729
#define CACHE_S_FORMATETC_NOTSUPPORTED
Definition: winerror.h:3829
#define OLE_E_NOTRUNNING
Definition: winerror.h:3730
#define CACHE_E_NOCACHE_UPDATED
Definition: winerror.h:3831
#define E_NOINTERFACE
Definition: winerror.h:3479
#define CO_E_OBJNOTCONNECTED
Definition: winerror.h:3929
#define STG_E_FILENOTFOUND
Definition: winerror.h:3660
#define DV_E_TYMED
Definition: winerror.h:3749
#define DV_E_CLIPFORMAT
Definition: winerror.h:3750
#define DV_E_FORMATETC
Definition: winerror.h:3744
#define OLE_E_ADVISENOTSUPPORTED
Definition: winerror.h:3728
#define CO_E_ALREADYINITIALIZED
Definition: winerror.h:3917
#define REGDB_E_KEYMISSING
Definition: winerror.h:3799
#define E_ABORT
Definition: winerror.h:3481
#define OLE_E_BLANK
Definition: winerror.h:3732
BOOL WINAPI DeleteMetaFile(_In_ HMETAFILE)
UINT WINAPI GetEnhMetaFileBits(_In_ HENHMETAFILE hEMF, _In_ UINT nSize, _Out_writes_bytes_opt_(nSize) LPBYTE lpData)
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
HBITMAP WINAPI CreateBitmap(_In_ INT cx, _In_ INT cy, _In_ UINT cPlanes, _In_ UINT cBitsPerPel, _In_opt_ const VOID *pvBits)
int WINAPI GetDeviceCaps(_In_opt_ HDC, _In_ int)
HDC WINAPI CreateMetaFileA(_In_opt_ LPCSTR)
#define LOGPIXELSY
Definition: wingdi.h:719
HDC WINAPI CreateEnhMetaFileW(_In_opt_ HDC, _In_opt_ LPCWSTR, _In_opt_ LPCRECT, _In_opt_ LPCWSTR)
UINT WINAPI GetWinMetaFileBits(_In_ HENHMETAFILE hemf, _In_ UINT cbData16, _Out_writes_bytes_opt_(cbData16) LPBYTE pData16, _In_ INT iMapMode, _In_ HDC hdcRef)
#define MM_ANISOTROPIC
Definition: wingdi.h:867
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
HMETAFILE WINAPI CloseMetaFile(_In_ HDC hdc)
UINT WINAPI GetMetaFileBitsEx(_In_ HMETAFILE hMF, _In_ UINT cbBuffer, _Out_writes_bytes_opt_(cbBuffer) LPVOID lpData)
HDC WINAPI CreateMetaFileW(_In_opt_ LPCWSTR)
LONG WINAPI GetBitmapBits(_In_ HBITMAP hbit, _In_ LONG cb, _Out_writes_bytes_(cb) LPVOID lpvBits)
HENHMETAFILE WINAPI CloseEnhMetaFile(_In_ HDC hdc)
#define LOGPIXELSX
Definition: wingdi.h:718
struct tagENHMETAHEADER ENHMETAHEADER
BOOL WINAPI Rectangle(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int)
BOOL WINAPI DeleteDC(_In_ HDC)
#define CSTR_EQUAL
Definition: winnls.h:500
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
#define IDI_APPLICATION
Definition: winuser.h:712
HICON WINAPI LoadIconA(_In_opt_ HINSTANCE hInstance, _In_ LPCSTR lpIconName)
Definition: cursoricon.c:2429
HDC WINAPI GetDC(_In_opt_ HWND)
UINT WINAPI RegisterClipboardFormatA(_In_ LPCSTR)
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
__wchar_t WCHAR
Definition: xmlstorage.h:180
char * LPSTR
Definition: xmlstorage.h:182
unsigned char BYTE
Definition: xxhash.c:193