From ddc5ae090abba018bb5674f98af8ff0e692a42a3 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 17 Sep 2017 22:56:20 +0000 Subject: [PATCH] [OLE32_WINETEST] Sync with Wine Staging 2.16. CORE-13762 svn path=/trunk/; revision=75891 --- rostests/winetests/ole32/compobj.c | 75 +++++++++++- rostests/winetests/ole32/ole2.c | 186 +++++++++++++++++++++++++++-- 2 files changed, 249 insertions(+), 12 deletions(-) diff --git a/rostests/winetests/ole32/compobj.c b/rostests/winetests/ole32/compobj.c index 846abea48af..6dd9e334ccd 100644 --- a/rostests/winetests/ole32/compobj.c +++ b/rostests/winetests/ole32/compobj.c @@ -1166,12 +1166,35 @@ static const CLSID CLSID_WineTestPSFactoryBuffer = {0xa1, 0xa2, 0x5d, 0x5a, 0x36, 0x54, 0xd3, 0xbd} }; /* 52011640-8164-4fd0-a1a2-5d5a3654d3bd */ +static DWORD CALLBACK register_ps_clsid_thread(void *context) +{ + HRESULT hr; + CLSID clsid = {0}; + + pCoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + + hr = CoGetPSClsid(&IID_IWineTest, &clsid); + ok_ole_success(hr, "CoGetPSClsid"); + ok(IsEqualGUID(&clsid, &CLSID_WineTestPSFactoryBuffer), "expected %s, got %s\n", + wine_dbgstr_guid(&CLSID_WineTestPSFactoryBuffer), wine_dbgstr_guid(&clsid)); + + /* test registering a PSClsid in an apartment which is then destroyed */ + hr = CoRegisterPSClsid(&IID_TestPS, &clsid); + ok_ole_success(hr, "CoRegisterPSClsid"); + + CoUninitialize(); + + return hr; +} + static void test_CoRegisterPSClsid(void) { HRESULT hr; DWORD dwRegistrationKey; IStream *stream; CLSID clsid; + HANDLE thread; + DWORD tid; hr = CoRegisterPSClsid(&IID_IWineTest, &CLSID_WineTestPSFactoryBuffer); ok(hr == CO_E_NOTINITIALIZED, "CoRegisterPSClsid should have returned CO_E_NOTINITIALIZED instead of 0x%08x\n", hr); @@ -1185,6 +1208,21 @@ static void test_CoRegisterPSClsid(void) hr = CoRegisterPSClsid(&IID_IWineTest, &CLSID_WineTestPSFactoryBuffer); ok_ole_success(hr, "CoRegisterPSClsid"); + hr = CoGetPSClsid(&IID_IWineTest, &clsid); + ok_ole_success(hr, "CoGetPSClsid"); + ok(IsEqualGUID(&clsid, &CLSID_WineTestPSFactoryBuffer), "expected %s, got %s\n", + wine_dbgstr_guid(&CLSID_WineTestPSFactoryBuffer), wine_dbgstr_guid(&clsid)); + + thread = CreateThread(NULL, 0, register_ps_clsid_thread, NULL, 0, &tid); + ok(thread != NULL, "CreateThread failed with error %d\n", GetLastError()); + ok(!WaitForSingleObject(thread, 10000), "wait timed out\n"); + CloseHandle(thread); + + hr = CoGetPSClsid(&IID_TestPS, &clsid); + ok_ole_success(hr, "CoGetPSClsid"); + ok(IsEqualGUID(&clsid, &CLSID_WineTestPSFactoryBuffer), "expected %s, got %s\n", + wine_dbgstr_guid(&CLSID_WineTestPSFactoryBuffer), wine_dbgstr_guid(&clsid)); + hr = CreateStreamOnHGlobal(NULL, TRUE, &stream); ok_ole_success(hr, "CreateStreamOnHGlobal"); @@ -1204,11 +1242,11 @@ static void test_CoRegisterPSClsid(void) SET_EXPECT(CreateStub); hr = CoMarshalInterface(stream, &IID_IEnumOLEVERB, (IUnknown*)&EnumOLEVERB, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL); - ok(hr == S_OK, "CoMarshalInterface should have returned E_NOTIMPL instead of 0x%08x\n", hr); + ok(hr == S_OK, "CoMarshalInterface should have returned S_OK instead of 0x%08x\n", hr); CHECK_CALLED(CreateStub); hr = CoMarshalInterface(stream, &IID_IEnumOLEVERB, &Test_Unknown, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL); - ok(hr == S_OK, "CoMarshalInterface should have returned E_NOTIMPL instead of 0x%08x\n", hr); + ok(hr == S_OK, "CoMarshalInterface should have returned S_OK instead of 0x%08x\n", hr); IStream_Release(stream); IPSFactoryBuffer_Release(ps_factory_buffer); @@ -1224,6 +1262,31 @@ static void test_CoRegisterPSClsid(void) hr = CoGetPSClsid(&IID_IWineTest, &clsid); ok(hr == REGDB_E_IIDNOTREG, "CoGetPSClsid should have returned REGDB_E_IIDNOTREG instead of 0x%08x\n", hr); + hr = CoGetPSClsid(&IID_TestPS, &clsid); + ok(hr == REGDB_E_IIDNOTREG, "CoGetPSClsid should have returned REGDB_E_IIDNOTREG instead of 0x%08x\n", hr); + + CoUninitialize(); + + pCoInitializeEx(NULL, COINIT_MULTITHREADED); + + hr = CoRegisterPSClsid(&IID_IWineTest, &CLSID_WineTestPSFactoryBuffer); + ok_ole_success(hr, "CoRegisterPSClsid"); + + hr = CoGetPSClsid(&IID_IWineTest, &clsid); + ok_ole_success(hr, "CoGetPSClsid"); + ok(IsEqualGUID(&clsid, &CLSID_WineTestPSFactoryBuffer), "expected %s, got %s\n", + wine_dbgstr_guid(&CLSID_WineTestPSFactoryBuffer), wine_dbgstr_guid(&clsid)); + + thread = CreateThread(NULL, 0, register_ps_clsid_thread, NULL, 0, &tid); + ok(thread != NULL, "CreateThread failed with error %d\n", GetLastError()); + ok(!WaitForSingleObject(thread, 10000), "wait timed out\n"); + CloseHandle(thread); + + hr = CoGetPSClsid(&IID_TestPS, &clsid); + ok_ole_success(hr, "CoGetPSClsid"); + ok(IsEqualGUID(&clsid, &CLSID_WineTestPSFactoryBuffer), "expected %s, got %s\n", + wine_dbgstr_guid(&CLSID_WineTestPSFactoryBuffer), wine_dbgstr_guid(&clsid)); + CoUninitialize(); } @@ -2184,10 +2247,18 @@ static void test_TreatAsClass(void) win_skip("CoGetTreatAsClass not present\n"); return; } + hr = pCoGetTreatAsClass(&deadbeef,&out); ok (hr == S_FALSE, "expected S_FALSE got %x\n",hr); ok (IsEqualGUID(&out,&deadbeef), "expected to get same clsid back\n"); + hr = pCoGetTreatAsClass(NULL, &out); + ok(hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr); + ok(IsEqualGUID(&out, &deadbeef), "expected no change to the clsid\n"); + + hr = pCoGetTreatAsClass(&deadbeef, NULL); + ok(hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr); + lr = RegOpenKeyExA(HKEY_CLASSES_ROOT, "CLSID", 0, KEY_READ, &clsidkey); ok(!lr, "Couldn't open CLSID key, error %d\n", lr); diff --git a/rostests/winetests/ole32/ole2.c b/rostests/winetests/ole32/ole2.c index 4173e2687b0..82ec820b628 100644 --- a/rostests/winetests/ole32/ole2.c +++ b/rostests/winetests/ole32/ole2.c @@ -39,10 +39,13 @@ #include +#ifndef __REACTOS__ #include "initguid.h" DEFINE_GUID(CLSID_Picture_Metafile,0x315,0,0,0xc0,0,0,0,0,0,0,0x46); DEFINE_GUID(CLSID_Picture_Dib,0x316,0,0,0xc0,0,0,0,0,0,0,0x46); +DEFINE_GUID(CLSID_Picture_EnhMetafile,0x319,0,0,0xc0,0,0,0,0,0,0,0x46); +#endif #define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08x\n", hr) @@ -142,7 +145,7 @@ typedef struct PresentationDataHeader DWORD unknown3; /* 4, possibly TYMED_ISTREAM */ DVASPECT dvAspect; DWORD lindex; - DWORD tymed; + DWORD advf; DWORD unknown7; /* 0 */ DWORD dwObjectExtentX; DWORD dwObjectExtentY; @@ -1180,7 +1183,7 @@ static void test_OleLoad(IStorage *pStorage) IStorage *stg; IStream *stream; IUnknown *obj; - DWORD data, i, tymed, data_size; + DWORD data, i, data_size; PresentationDataHeader header; HDC hdc; HGDIOBJ hobj; @@ -1229,12 +1232,10 @@ static void test_OleLoad(IStorage *pStorage) break; } - tymed = 1 << i; - header.unknown3 = 4; header.dvAspect = DVASPECT_CONTENT; header.lindex = -1; - header.tymed = tymed; + header.advf = 1 << i; header.unknown7 = 0; header.dwObjectExtentX = 1; header.dwObjectExtentY = 1; @@ -1254,19 +1255,19 @@ static void test_OleLoad(IStorage *pStorage) IStorage_Release(stg); continue; } - ok(hr == S_OK, "OleLoad error %#x: cfFormat = %u, tymed = %u\n", hr, fmt, tymed); + ok(hr == S_OK, "OleLoad error %#x: cfFormat = %u, advf = %#x\n", hr, fmt, header.advf); hdc = CreateCompatibleDC(0); SetRect(&rc, 0, 0, 100, 100); hr = OleDraw(obj, DVASPECT_CONTENT, hdc, &rc); DeleteDC(hdc); if (fmt == CF_METAFILEPICT) - ok(hr == S_OK, "OleDraw error %#x: cfFormat = %u, tymed = %u\n", hr, fmt, tymed); + ok(hr == S_OK, "OleDraw error %#x: cfFormat = %u, advf = %#x\n", hr, fmt, header.advf); else if (fmt == CF_ENHMETAFILE) todo_wine - ok(hr == S_OK, "OleDraw error %#x: cfFormat = %u, tymed = %u\n", hr, fmt, tymed); + ok(hr == S_OK, "OleDraw error %#x: cfFormat = %u, advf = %#x\n", hr, fmt, header.advf); else - ok(hr == OLE_E_BLANK || hr == OLE_E_NOTRUNNING || hr == E_FAIL, "OleDraw should fail: %#x, cfFormat = %u, tymed = %u\n", hr, fmt, header.tymed); + ok(hr == OLE_E_BLANK || hr == OLE_E_NOTRUNNING || hr == E_FAIL, "OleDraw should fail: %#x, cfFormat = %u, advf = %#x\n", hr, fmt, header.advf); IUnknown_Release(obj); IStorage_Release(stg); @@ -1529,7 +1530,7 @@ static const IUnknownVtbl UnknownVtbl = static IUnknown unknown = { &UnknownVtbl }; -static void check_enum_cache(IOleCache2 *cache, STATDATA *expect, int num) +static void check_enum_cache(IOleCache2 *cache, const STATDATA *expect, int num) { IEnumSTATDATA *enum_stat; STATDATA stat; @@ -2149,6 +2150,7 @@ static void test_data_cache_bitmap(void) hr = IOleCache2_Cache( cache, &fmt, 0, &conn ); ok( hr == S_OK, "got %08x\n", hr ); + ok( conn == 2, "got %d\n", conn ); expect[0].dwConnection = conn; expect[1].dwConnection = conn; @@ -2167,6 +2169,7 @@ static void test_data_cache_bitmap(void) hr = IOleCache2_Cache( cache, &fmt, 0, &conn ); ok( hr == S_OK, "got %08x\n", hr ); + ok( conn == 3, "got %d\n", conn ); expect[2].dwConnection = conn; check_enum_cache( cache, expect, 3); @@ -2177,6 +2180,7 @@ static void test_data_cache_bitmap(void) hr = IOleCache2_Cache( cache, &fmt, 0, &conn ); ok( hr == S_OK, "got %08x\n", hr ); + ok( conn == 4, "got %d\n", conn ); expect[3].dwConnection = conn; check_enum_cache( cache, expect, 4 ); @@ -2259,6 +2263,166 @@ static void test_data_cache_bitmap(void) IOleCache2_Release( cache ); } +/* The CLSID_Picture_ classes automatically create appropriate cache entries */ +static void test_data_cache_init(void) +{ + HRESULT hr; + IOleCache2 *cache; + IPersistStorage *persist; + int i; + CLSID clsid; + static const STATDATA enum_expect[] = + { + {{ CF_DIB, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }, 0, NULL, 1 }, + {{ CF_BITMAP, 0, DVASPECT_CONTENT, -1, TYMED_GDI }, 0, NULL, 1 }, + {{ CF_METAFILEPICT, 0, DVASPECT_CONTENT, -1, TYMED_MFPICT }, 0, NULL, 1 }, + {{ CF_ENHMETAFILE, 0, DVASPECT_CONTENT, -1, TYMED_ENHMF }, 0, NULL, 1 } + }; + static const struct + { + const CLSID *clsid; + int enum_start, enum_num; + } data[] = + { + { &CLSID_NULL, 0, 0 }, + { &CLSID_WineTestOld, 0, 0 }, + { &CLSID_Picture_Dib, 0, 2 }, + { &CLSID_Picture_Metafile, 2, 1 }, + { &CLSID_Picture_EnhMetafile, 3, 1 } + }; + + for (i = 0; i < sizeof(data) / sizeof(data[0]); i++) + { + hr = CreateDataCache( NULL, data[i].clsid, &IID_IOleCache2, (void **)&cache ); + ok( hr == S_OK, "got %08x\n", hr ); + + check_enum_cache( cache, enum_expect + data[i].enum_start , data[i].enum_num ); + + IOleCache2_QueryInterface( cache, &IID_IPersistStorage, (void **) &persist ); + hr = IPersistStorage_GetClassID( persist, &clsid ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( IsEqualCLSID( &clsid, data[i].clsid ), "class id mismatch %s %s\n", wine_dbgstr_guid( &clsid ), + wine_dbgstr_guid( data[i].clsid ) ); + + IPersistStorage_Release( persist ); + IOleCache2_Release( cache ); + } +} + +static void test_data_cache_initnew(void) +{ + HRESULT hr; + IOleCache2 *cache; + IPersistStorage *persist; + IStorage *stg_dib, *stg_mf, *stg_wine; + CLSID clsid; + static const STATDATA initnew_expect[] = + { + {{ CF_DIB, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }, 0, NULL, 1 }, + {{ CF_BITMAP, 0, DVASPECT_CONTENT, -1, TYMED_GDI }, 0, NULL, 1 }, + }; + static const STATDATA initnew2_expect[] = + { + {{ CF_METAFILEPICT, 0, DVASPECT_CONTENT, -1, TYMED_MFPICT }, 0, NULL, 1 }, + {{ CF_DIB, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }, 0, NULL, 2 }, + {{ CF_BITMAP, 0, DVASPECT_CONTENT, -1, TYMED_GDI }, 0, NULL, 2 }, + }; + static const STATDATA initnew3_expect[] = + { + {{ CF_DIB, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }, 0, NULL, 1 }, + {{ CF_BITMAP, 0, DVASPECT_CONTENT, -1, TYMED_GDI }, 0, NULL, 1 }, + {{ CF_DIB, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }, 0, NULL, 2 }, + {{ CF_BITMAP, 0, DVASPECT_CONTENT, -1, TYMED_GDI }, 0, NULL, 2 }, + {{ CF_METAFILEPICT, 0, DVASPECT_CONTENT, -1, TYMED_MFPICT }, 0, NULL, 3 }, + }; + static const STATDATA initnew4_expect[] = + { + {{ CF_DIB, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }, 0, NULL, 2 }, + {{ CF_BITMAP, 0, DVASPECT_CONTENT, -1, TYMED_GDI }, 0, NULL, 2 }, + {{ CF_METAFILEPICT, 0, DVASPECT_CONTENT, -1, TYMED_MFPICT }, 0, NULL, 3 }, + {{ CF_DIB, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }, 0, NULL, 4 }, + {{ CF_BITMAP, 0, DVASPECT_CONTENT, -1, TYMED_GDI }, 0, NULL, 4 }, + }; + + hr = StgCreateDocfile( NULL, STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_DELETEONRELEASE, 0, &stg_dib ); + ok( hr == S_OK, "got %08x\n", hr); + hr = IStorage_SetClass( stg_dib, &CLSID_Picture_Dib ); + ok( hr == S_OK, "got %08x\n", hr); + + hr = StgCreateDocfile( NULL, STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_DELETEONRELEASE, 0, &stg_mf ); + ok( hr == S_OK, "got %08x\n", hr); + hr = IStorage_SetClass( stg_mf, &CLSID_Picture_Metafile ); + ok( hr == S_OK, "got %08x\n", hr); + + hr = StgCreateDocfile( NULL, STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_DELETEONRELEASE, 0, &stg_wine ); + ok( hr == S_OK, "got %08x\n", hr); + hr = IStorage_SetClass( stg_wine, &CLSID_WineTestOld ); + ok( hr == S_OK, "got %08x\n", hr); + + hr = CreateDataCache( NULL, &CLSID_WineTestOld, &IID_IOleCache2, (void **)&cache ); + ok( hr == S_OK, "got %08x\n", hr ); + IOleCache2_QueryInterface( cache, &IID_IPersistStorage, (void **) &persist ); + + hr = IPersistStorage_InitNew( persist, stg_dib ); + ok( hr == S_OK, "got %08x\n", hr); + + hr = IPersistStorage_GetClassID( persist, &clsid ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( IsEqualCLSID( &clsid, &CLSID_Picture_Dib ), "got %s\n", wine_dbgstr_guid( &clsid ) ); + + check_enum_cache( cache, initnew_expect, 2 ); + + hr = IPersistStorage_InitNew( persist, stg_mf ); + ok( hr == CO_E_ALREADYINITIALIZED, "got %08x\n", hr); + + hr = IPersistStorage_HandsOffStorage( persist ); + ok( hr == S_OK, "got %08x\n", hr); + + hr = IPersistStorage_GetClassID( persist, &clsid ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( IsEqualCLSID( &clsid, &CLSID_Picture_Dib ), "got %s\n", wine_dbgstr_guid( &clsid ) ); + + hr = IPersistStorage_InitNew( persist, stg_mf ); + ok( hr == S_OK, "got %08x\n", hr); + + hr = IPersistStorage_GetClassID( persist, &clsid ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( IsEqualCLSID( &clsid, &CLSID_Picture_Metafile ), "got %s\n", wine_dbgstr_guid( &clsid ) ); + + check_enum_cache( cache, initnew2_expect, 3 ); + + hr = IPersistStorage_HandsOffStorage( persist ); + ok( hr == S_OK, "got %08x\n", hr); + + hr = IPersistStorage_InitNew( persist, stg_dib ); + ok( hr == S_OK, "got %08x\n", hr); + + hr = IPersistStorage_GetClassID( persist, &clsid ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( IsEqualCLSID( &clsid, &CLSID_Picture_Dib ), "got %s\n", wine_dbgstr_guid( &clsid ) ); + + check_enum_cache( cache, initnew3_expect, 5 ); + + hr = IPersistStorage_HandsOffStorage( persist ); + ok( hr == S_OK, "got %08x\n", hr); + + hr = IPersistStorage_InitNew( persist, stg_wine ); + ok( hr == S_OK, "got %08x\n", hr); + + hr = IPersistStorage_GetClassID( persist, &clsid ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( IsEqualCLSID( &clsid, &CLSID_WineTestOld ), "got %s\n", wine_dbgstr_guid( &clsid ) ); + + check_enum_cache( cache, initnew4_expect, 5 ); + + IStorage_Release( stg_wine ); + IStorage_Release( stg_mf ); + IStorage_Release( stg_dib ); + + IPersistStorage_Release( persist ); + IOleCache2_Release( cache ); +} + static void test_default_handler(void) { HRESULT hr; @@ -3012,6 +3176,8 @@ START_TEST(ole2) test_data_cache_dib_contents_stream( 0 ); test_data_cache_dib_contents_stream( 1 ); test_data_cache_bitmap(); + test_data_cache_init(); + test_data_cache_initnew(); test_default_handler(); test_runnable(); test_OleRun();