From 5e32397cdee1c0ea5a7de7c6e8157ddad8a605b6 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Mon, 11 Nov 2019 10:36:51 +0300 Subject: [PATCH] comsvcs: Implement BindToObject() for "new" moniker. Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- 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 86ffe2587b2..827a6e8e5e5 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 d94b99afd1c..29de7cfe974 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); }