Nikolay Sivov : comsvcs: Implement BindToObject() for "new" moniker.

Alexandre Julliard julliard at winehq.org
Mon Nov 11 16:20:21 CST 2019


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Nov 11 10:36:51 2019 +0300

comsvcs: Implement BindToObject() for "new" moniker.

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

---

 dlls/comsvcs/main.c          | 37 +++++++++++++++++++++++++++++++++++--
 dlls/comsvcs/tests/comsvcs.c |  8 ++------
 2 files changed, 37 insertions(+), 8 deletions(-)

diff --git a/dlls/comsvcs/main.c b/dlls/comsvcs/main.c
index 86ffe2587b..827a6e8e5e 100644
--- a/dlls/comsvcs/main.c
+++ b/dlls/comsvcs/main.c
@@ -551,9 +551,42 @@ static HRESULT WINAPI new_moniker_GetSizeMax(IMoniker *iface, ULARGE_INTEGER *si
 static HRESULT WINAPI new_moniker_BindToObject(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft,
         REFIID riid, void **ret)
 {
-    FIXME("%p, %p, %p, %s, %p.\n", iface, pbc, pmkToLeft, debugstr_guid(riid), ret);
+    struct new_moniker *moniker = impl_from_IMoniker(iface);
+    IClassActivator *activator;
+    IClassFactory *factory;
+    BIND_OPTS2 bindopts;
+    MULTI_QI qi;
+    HRESULT hr;
 
-    return E_NOTIMPL;
+    TRACE("%p, %p, %p, %s, %p.\n", iface, pbc, pmkToLeft, debugstr_guid(riid), ret);
+
+    bindopts.cbStruct = sizeof(bindopts);
+    if (FAILED(hr = IBindCtx_GetBindOptions(pbc, (BIND_OPTS *)&bindopts)))
+        return hr;
+
+    if (!pmkToLeft)
+    {
+        qi.pIID = riid;
+        qi.pItf = NULL;
+        qi.hr = S_OK;
+        hr = CoCreateInstanceEx(&moniker->clsid, NULL, bindopts.dwClassContext, bindopts.pServerInfo, 1, &qi);
+        *ret = qi.pItf;
+    }
+    else
+    {
+        if (SUCCEEDED(hr = IMoniker_BindToObject(pmkToLeft, pbc, NULL, &IID_IClassActivator, (void **)&activator)))
+        {
+            hr = IClassActivator_GetClassObject(activator, &moniker->clsid, bindopts.dwClassContext, bindopts.locale, riid, ret);
+            IClassActivator_Release(activator);
+        }
+        else if (SUCCEEDED(hr = IMoniker_BindToObject(pmkToLeft, pbc, NULL, &IID_IClassFactory, (void **)&factory)))
+        {
+            hr = IClassFactory_CreateInstance(factory, NULL, riid, ret);
+            IClassFactory_Release(factory);
+        }
+    }
+
+    return hr;
 }
 
 static HRESULT WINAPI new_moniker_BindToStorage(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft, REFIID riid,
diff --git a/dlls/comsvcs/tests/comsvcs.c b/dlls/comsvcs/tests/comsvcs.c
index d94b99afd1..29de7cfe97 100644
--- a/dlls/comsvcs/tests/comsvcs.c
+++ b/dlls/comsvcs/tests/comsvcs.c
@@ -352,10 +352,8 @@ todo_wine
     ok(hr == MK_E_UNAVAILABLE, "Unexpected hr %#x.\n", hr);
 
     hr = IMoniker_BindToObject(moniker, bindctx, NULL, &IID_IUnknown, (void **)&obj);
-todo_wine
     ok(hr == S_OK, "Failed to bind to object, hr %#x.\n", hr);
-    if (SUCCEEDED(hr))
-        IUnknown_Release(obj);
+    IUnknown_Release(obj);
 
     hr = IMoniker_BindToStorage(moniker, bindctx, NULL, &IID_IUnknown, (void **)&obj);
 todo_wine
@@ -423,10 +421,8 @@ todo_wine
     bind_opts.dwClassContext = CLSCTX_INPROC_SERVER;
 
     hr = CoGetObject(L"new:msxml2.domdocument", (BIND_OPTS *)&bind_opts, &IID_IXMLDOMDocument, (void **)&obj);
-todo_wine
     ok(hr == S_OK, "Failed to create object, hr %#x.\n", hr);
-    if (SUCCEEDED(hr))
-        IUnknown_Release(obj);
+    IUnknown_Release(obj);
 
     IBindCtx_Release(bindctx);
 }




More information about the wine-cvs mailing list