From d95e2dbd62dad2a4446c4bff9e9dd7e63061703b Mon Sep 17 00:00:00 2001 From: David Hedberg Date: Mon, 18 Oct 2010 04:19:23 +0200 Subject: [PATCH] ole32: OleLoad should not fail even if IOleObject::GetMiscStatus fails. --- dlls/ole32/ole2.c | 13 ++++++------- dlls/ole32/tests/ole2.c | 40 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/dlls/ole32/ole2.c b/dlls/ole32/ole2.c index 03cb7f0d8a..ca4cd4cf2d 100644 --- a/dlls/ole32/ole2.c +++ b/dlls/ole32/ole2.c @@ -1181,13 +1181,12 @@ HRESULT WINAPI OleLoad( } } - if (SUCCEEDED(hres)) - /* - * Initialize the object with it's IPersistStorage interface. - */ - hres = IOleObject_QueryInterface(pUnk, - &IID_IPersistStorage, - (void**)&persistStorage); + /* + * Initialize the object with its IPersistStorage interface. + */ + hres = IOleObject_QueryInterface(pUnk, + &IID_IPersistStorage, + (void**)&persistStorage); if (SUCCEEDED(hres)) { diff --git a/dlls/ole32/tests/ole2.c b/dlls/ole32/tests/ole2.c index cd83a3b598..d8c2bab69f 100644 --- a/dlls/ole32/tests/ole2.c +++ b/dlls/ole32/tests/ole2.c @@ -57,6 +57,7 @@ static FORMATETC *g_expected_fetc = NULL; static BOOL g_showRunnable = TRUE; static BOOL g_isRunning = TRUE; +static BOOL g_failGetMiscStatus; #define CHECK_EXPECTED_METHOD(method_name) \ do { \ @@ -328,8 +329,16 @@ static HRESULT WINAPI OleObject_GetMiscStatus ) { CHECK_EXPECTED_METHOD("OleObject_GetMiscStatus"); - *pdwStatus = DVASPECT_CONTENT; - return S_OK; + if(!g_failGetMiscStatus) + { + *pdwStatus = OLEMISC_RECOMPOSEONRESIZE; + return S_OK; + } + else + { + *pdwStatus = 0x1234; + return E_FAIL; + } } static HRESULT WINAPI OleObject_SetColorScheme @@ -899,10 +908,32 @@ static void test_OleLoad(IStorage *pStorage) { "OleObject_SetClientSite", 0 }, { "OleObject_Release", 0 }, { "OleObject_QueryInterface", 0 }, + { "OleObject_GetMiscStatus", 0 }, { "OleObject_Release", 0 }, { NULL, 0 } }; + /* Test once with IOleObject_GetMiscStatus failing */ + expected_method_list = methods_oleload; + g_failGetMiscStatus = TRUE; + trace("OleLoad:\n"); + hr = OleLoad(pStorage, &IID_IOleObject, (IOleClientSite *)0xdeadbeef, (void **)&pObject); + ok(hr == S_OK || + broken(hr == E_INVALIDARG), /* win98 and win2k */ + "OleLoad failed with error 0x%08x\n", hr); + if(pObject) + { + DWORD dwStatus = 0xdeadbeef; + hr = IOleObject_GetMiscStatus(pObject, DVASPECT_CONTENT, &dwStatus); + ok(hr == E_FAIL, "Got 0x%08x\n", hr); + ok(dwStatus == 0x1234, "Got 0x%08x\n", dwStatus); + + IOleObject_Release(pObject); + CHECK_NO_EXTRA_METHODS(); + } + + /* Test again, let IOleObject_GetMiscStatus succeed. */ + g_failGetMiscStatus = FALSE; expected_method_list = methods_oleload; trace("OleLoad:\n"); hr = OleLoad(pStorage, &IID_IOleObject, (IOleClientSite *)0xdeadbeef, (void **)&pObject); @@ -911,6 +942,11 @@ static void test_OleLoad(IStorage *pStorage) "OleLoad failed with error 0x%08x\n", hr); if (pObject) { + DWORD dwStatus = 0xdeadbeef; + hr = IOleObject_GetMiscStatus(pObject, DVASPECT_CONTENT, &dwStatus); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(dwStatus == 1, "Got 0x%08x\n", dwStatus); + IOleObject_Release(pObject); CHECK_NO_EXTRA_METHODS(); }