Nikolay Sivov : ole32: Fix bind speed used in BindToObject() of item moniker.

Alexandre Julliard julliard at winehq.org
Wed Jan 22 14:53:00 CST 2020


Module: wine
Branch: master
Commit: a456e8fff2ad5eecaffe7bdafe8676d84ff70d33
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=a456e8fff2ad5eecaffe7bdafe8676d84ff70d33

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed Jan 22 12:11:46 2020 +0300

ole32: Fix bind speed used in BindToObject() of item moniker.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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;




More information about the wine-cvs mailing list