From bbf0abdea5c8c8d3c77214fff995ef38077c902a Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Tue, 21 Sep 2021 15:05:07 +0300 Subject: [PATCH] ole32/composite: Return requested interface in BindToObject() in NULL left moniker path. Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- dlls/ole32/compositemoniker.c | 48 ++++++++++++++++------------------- dlls/ole32/tests/moniker.c | 38 ++++++++++++++++++++++----- 2 files changed, 53 insertions(+), 33 deletions(-) diff --git a/dlls/ole32/compositemoniker.c b/dlls/ole32/compositemoniker.c index 5914008fe39..38a2e2a4892 100644 --- a/dlls/ole32/compositemoniker.c +++ b/dlls/ole32/compositemoniker.c @@ -323,37 +323,33 @@ CompositeMonikerImpl_GetSizeMax(IMoniker* iface,ULARGE_INTEGER* pcbSize) return S_OK; } -/****************************************************************************** - * CompositeMoniker_BindToObject - ******************************************************************************/ -static HRESULT WINAPI -CompositeMonikerImpl_BindToObject(IMoniker* iface, IBindCtx* pbc, - IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult) +static HRESULT WINAPI CompositeMonikerImpl_BindToObject(IMoniker *iface, IBindCtx *pbc, + IMoniker *pmkToLeft, REFIID riid, void **result) { - HRESULT res; - IRunningObjectTable *prot; + IRunningObjectTable *rot; + IUnknown *object; + HRESULT hr; IMoniker *tempMk,*antiMk,*rightMostMk; IEnumMoniker *enumMoniker; - TRACE("(%p,%p,%p,%s,%p)\n",iface,pbc,pmkToLeft,debugstr_guid(riid),ppvResult); + TRACE("(%p,%p,%p,%s,%p)\n", iface, pbc, pmkToLeft, debugstr_guid(riid), result); - if (ppvResult==NULL) + if (!result) return E_POINTER; - *ppvResult=0; - /* If pmkToLeft is NULL, this method looks for the moniker in the ROT, and if found, queries the retrieved */ - /* object for the requested interface pointer. */ - if(pmkToLeft==NULL){ + *result = NULL; - res=IBindCtx_GetRunningObjectTable(pbc,&prot); + if (!pmkToLeft) + { + hr = IBindCtx_GetRunningObjectTable(pbc, &rot); + if (SUCCEEDED(hr)) + { + hr = IRunningObjectTable_GetObject(rot, iface, &object); + IRunningObjectTable_Release(rot); + if (FAILED(hr)) return E_INVALIDARG; - if (SUCCEEDED(res)){ - - /* if the requested class was loaded before ! we don't need to reload it */ - res = IRunningObjectTable_GetObject(prot,iface,(IUnknown**)ppvResult); - - if (res==S_OK) - return res; + hr = IUnknown_QueryInterface(object, riid, result); + IUnknown_Release(object); } } else{ @@ -364,17 +360,17 @@ CompositeMonikerImpl_BindToObject(IMoniker* iface, IBindCtx* pbc, IEnumMoniker_Next(enumMoniker,1,&rightMostMk,NULL); IEnumMoniker_Release(enumMoniker); - res=CreateAntiMoniker(&antiMk); - res=IMoniker_ComposeWith(iface,antiMk,0,&tempMk); + hr = CreateAntiMoniker(&antiMk); + hr = IMoniker_ComposeWith(iface,antiMk,0,&tempMk); IMoniker_Release(antiMk); - res=IMoniker_BindToObject(rightMostMk,pbc,tempMk,riid,ppvResult); + hr = IMoniker_BindToObject(rightMostMk,pbc,tempMk,riid,result); IMoniker_Release(tempMk); IMoniker_Release(rightMostMk); } - return res; + return hr; } /****************************************************************************** diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c index b584f370d70..d65535a0584 100644 --- a/dlls/ole32/tests/moniker.c +++ b/dlls/ole32/tests/moniker.c @@ -2906,8 +2906,9 @@ static void test_generic_composite_moniker(void) { IMoniker *moniker, *inverse, *inverse2, *moniker1, *moniker2, *moniker3, *moniker4; IEnumMoniker *enummoniker; + IRunningObjectTable *rot; + DWORD hash, cookie; HRESULT hr; - DWORD hash; IBindCtx *bindctx; FILETIME filetime; IUnknown *unknown; @@ -3032,15 +3033,9 @@ todo_wine hr = IMoniker_GetTimeOfLastChange(moniker, bindctx, NULL, &filetime); ok(hr == MK_E_NOTBINDABLE, "IMoniker_GetTimeOfLastChange should return MK_E_NOTBINDABLE, not 0x%08x\n", hr); - hr = IMoniker_BindToObject(moniker, bindctx, NULL, &IID_IUnknown, (void **)&unknown); - todo_wine - ok(hr == E_INVALIDARG, "IMoniker_BindToObject should return E_INVALIDARG, not 0x%08x\n", hr); - hr = IMoniker_BindToStorage(moniker, bindctx, NULL, &IID_IUnknown, (void **)&unknown); ok(hr == E_INVALIDARG, "IMoniker_BindToStorage should return E_INVALIDARG, not 0x%08x\n", hr); - IBindCtx_Release(bindctx); - hr = IMoniker_Inverse(moniker, &inverse); ok(hr == S_OK, "Failed to get inverse, hr %#x.\n", hr); TEST_MONIKER_TYPE(inverse, MKSYS_GENERICCOMPOSITE); @@ -3059,7 +3054,36 @@ todo_wine todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); + /* BindToObject() */ + hr = IMoniker_BindToObject(moniker, bindctx, NULL, &IID_IUnknown, (void **)&unknown); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); + + hr = IBindCtx_GetRunningObjectTable(bindctx, &rot); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = IRunningObjectTable_Register(rot, ROTFLAGS_REGISTRATIONKEEPSALIVE, (IUnknown *)moniker, + moniker, &cookie); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = IMoniker_BindToObject(moniker, bindctx, NULL, &IID_IUnknown, (void **)&unknown); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + IUnknown_Release(unknown); + + hr = IMoniker_BindToObject(moniker, bindctx, NULL, &IID_IMoniker, (void **)&unknown); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + IUnknown_Release(unknown); + + hr = IMoniker_BindToObject(moniker, bindctx, NULL, &IID_IDispatch, (void **)&unknown); + ok(hr == E_NOINTERFACE, "Unexpected hr %#x.\n", hr); + + hr = IRunningObjectTable_Revoke(rot, cookie); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + IRunningObjectTable_Release(rot); + IMoniker_Release(moniker); + + IBindCtx_Release(bindctx); } static void test_pointer_moniker(void)