From: Nikolay Sivov Subject: [PATCH 1/2] ole32: Fix bind speed used in BindToObject() of item moniker. Message-Id: <20200122091147.1355502-1-nsivov@codeweavers.com> Date: Wed, 22 Jan 2020 12:11:46 +0300 Signed-off-by: Nikolay Sivov --- dlls/ole32/itemmoniker.c | 32 +++++++++++++++++++++----------- dlls/ole32/tests/moniker.c | 3 --- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/dlls/ole32/itemmoniker.c b/dlls/ole32/itemmoniker.c index bd6fd6fd87..c37d7a87c5 100644 --- a/dlls/ole32/itemmoniker.c +++ b/dlls/ole32/itemmoniker.c @@ -329,6 +329,18 @@ static HRESULT WINAPI ItemMonikerImpl_GetSizeMax(IMoniker* iface, ULARGE_INTEGER return S_OK; } +static DWORD get_bind_speed_from_bindctx(IBindCtx *pbc) +{ + DWORD bind_speed = BINDSPEED_INDEFINITE; + BIND_OPTS bind_opts; + + bind_opts.cbStruct = sizeof(bind_opts); + if (SUCCEEDED(IBindCtx_GetBindOptions(pbc, &bind_opts)) && bind_opts.dwTickCountDeadline) + bind_speed = bind_opts.dwTickCountDeadline < 2500 ? BINDSPEED_IMMEDIATE : BINDSPEED_MODERATE; + + return bind_speed; +} + /****************************************************************************** * ItemMoniker_BindToObject ******************************************************************************/ @@ -339,9 +351,8 @@ static HRESULT WINAPI ItemMonikerImpl_BindToObject(IMoniker* iface, VOID** ppvResult) { ItemMonikerImpl *This = impl_from_IMoniker(iface); - HRESULT res; - IID refid=IID_IOleItemContainer; - IOleItemContainer *poic=0; + IOleItemContainer *container; + HRESULT hr; TRACE("(%p,%p,%p,%s,%p)\n",iface,pbc,pmkToLeft,debugstr_guid(riid),ppvResult); @@ -353,16 +364,15 @@ static HRESULT WINAPI ItemMonikerImpl_BindToObject(IMoniker* iface, *ppvResult=0; - res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&refid,(void**)&poic); - - if (SUCCEEDED(res)){ - - res=IOleItemContainer_GetObject(poic,This->itemName,BINDSPEED_MODERATE,pbc,riid,ppvResult); - - IOleItemContainer_Release(poic); + hr = IMoniker_BindToObject(pmkToLeft, pbc, NULL, &IID_IOleItemContainer, (void **)&container); + if (SUCCEEDED(hr)) + { + hr = IOleItemContainer_GetObject(container, This->itemName, get_bind_speed_from_bindctx(pbc), pbc, + riid, ppvResult); + IOleItemContainer_Release(container); } - return res; + return hr; } /****************************************************************************** diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c index 9a61be4f47..bbd964e723 100644 --- a/dlls/ole32/tests/moniker.c +++ b/dlls/ole32/tests/moniker.c @@ -2105,7 +2105,6 @@ todo_wine container_moniker = create_test_moniker(); hr = IMoniker_BindToObject(moniker, bindctx, &container_moniker->IMoniker_iface, &IID_IUnknown, (void **)&unknown); -todo_wine ok(hr == (0x8bee0000 | BINDSPEED_INDEFINITE), "Unexpected hr %#x.\n", hr); bind_opts.cbStruct = sizeof(bind_opts); @@ -2116,14 +2115,12 @@ todo_wine hr = IBindCtx_SetBindOptions(bindctx, &bind_opts); ok(hr == S_OK, "Failed to set bind options, hr %#x.\n", hr); hr = IMoniker_BindToObject(moniker, bindctx, &container_moniker->IMoniker_iface, &IID_IUnknown, (void **)&unknown); -todo_wine ok(hr == (0x8bee0000 | BINDSPEED_IMMEDIATE), "Unexpected hr %#x.\n", hr); bind_opts.dwTickCountDeadline = 2499; hr = IBindCtx_SetBindOptions(bindctx, &bind_opts); ok(hr == S_OK, "Failed to set bind options, hr %#x.\n", hr); hr = IMoniker_BindToObject(moniker, bindctx, &container_moniker->IMoniker_iface, &IID_IUnknown, (void **)&unknown); -todo_wine ok(hr == (0x8bee0000 | BINDSPEED_IMMEDIATE), "Unexpected hr %#x.\n", hr); bind_opts.dwTickCountDeadline = 2500; -- 2.24.1