From c409ab6290fd3d9e69492e10836db153e7f6a836 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Iv=C4=83ncescu?= Date: Thu, 10 Sep 2020 16:32:59 +0300 Subject: [PATCH] msscript.ocx: Supply a stub ServiceProvider to InvokeEx in run_procedure. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Gabriel Ivăncescu Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- dlls/msscript.ocx/msscript.c | 47 +++++++++++++++++++++++++++++- dlls/msscript.ocx/tests/msscript.c | 30 +++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) diff --git a/dlls/msscript.ocx/msscript.c b/dlls/msscript.ocx/msscript.c index ed17be90d8f..70dc05f61e0 100644 --- a/dlls/msscript.ocx/msscript.c +++ b/dlls/msscript.ocx/msscript.c @@ -434,6 +434,51 @@ static HRESULT parse_script_text(ScriptModule *module, BSTR script_text, DWORD f return hr; } +static HRESULT WINAPI sp_caller_QueryInterface(IServiceProvider *iface, REFIID riid, void **obj) +{ + if (IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IServiceProvider, riid)) + *obj = iface; + else + { + FIXME("(%p)->(%s)\n", iface, debugstr_guid(riid)); + *obj = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*obj); + return S_OK; +} + +static ULONG WINAPI sp_caller_AddRef(IServiceProvider *iface) +{ + return 2; +} + +static ULONG WINAPI sp_caller_Release(IServiceProvider *iface) +{ + return 1; +} + +static HRESULT WINAPI sp_caller_QueryService(IServiceProvider *iface, REFGUID service, REFIID riid, void **obj) +{ + FIXME("(%p)->(%s %s %p): semi-stub\n", iface, debugstr_guid(service), debugstr_guid(riid), obj); + + *obj = NULL; + if (IsEqualGUID(&SID_GetCaller, service)) + return S_OK; + + return E_NOINTERFACE; +} + +static const IServiceProviderVtbl sp_caller_vtbl = { + sp_caller_QueryInterface, + sp_caller_AddRef, + sp_caller_Release, + sp_caller_QueryService +}; + +static IServiceProvider sp_caller = { &sp_caller_vtbl }; + static HRESULT run_procedure(ScriptModule *module, BSTR procedure_name, SAFEARRAY *args, VARIANT *res) { IDispatchEx *dispex; @@ -475,7 +520,7 @@ static HRESULT run_procedure(ScriptModule *module, BSTR procedure_name, SAFEARRA else { hr = IDispatchEx_InvokeEx(dispex, dispid, LOCALE_USER_DEFAULT, - DISPATCH_METHOD, &dp, res, NULL, NULL); + DISPATCH_METHOD, &dp, res, NULL, &sp_caller); IDispatchEx_Release(dispex); } } diff --git a/dlls/msscript.ocx/tests/msscript.c b/dlls/msscript.ocx/tests/msscript.c index a6ec0992c89..4f43764234c 100644 --- a/dlls/msscript.ocx/tests/msscript.c +++ b/dlls/msscript.ocx/tests/msscript.c @@ -673,6 +673,10 @@ static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DW static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) { + IServiceProvider *sp; + IUnknown *unk; + HRESULT hr; + CHECK_EXPECT(InvokeEx); ok(lcid == LOCALE_USER_DEFAULT, "unexpected lcid %u.\n", lcid); ok(wFlags == DISPATCH_METHOD, "unexpected wFlags %u.\n", wFlags); @@ -690,6 +694,32 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc "unexpected second parameter V_VT = %d, V_I4 = %d.\n", V_VT(pdp->rgvarg), V_I4(pdp->rgvarg)); } + ok(!!pspCaller, "unexpected NULL pspCaller.\n"); + + hr = IActiveScriptSite_QueryInterface(site, &IID_IServiceProvider, (void**)&sp); + ok(hr == S_OK, "Failed to retrieve IID_IServiceProvider from script site: 0x%08x.\n", hr); + ok(sp != pspCaller, "Same IServiceProvider objects.\n"); + IServiceProvider_Release(sp); + + hr = IServiceProvider_QueryInterface(pspCaller, &IID_IActiveScriptSite, (void**)&unk); + ok(hr == E_NOINTERFACE, "QueryInterface IActiveScriptSite returned: 0x%08x.\n", hr); + + unk = (IUnknown*)0xdeadbeef; + hr = IServiceProvider_QueryService(pspCaller, &SID_GetCaller, NULL, (void**)&unk); + ok(hr == S_OK, "QueryService failed: 0x%08x.\n", hr); + ok(!unk, "unexpected object returned %p.\n", unk); + unk = (IUnknown*)0xdeadbeef; + hr = IServiceProvider_QueryService(pspCaller, &SID_GetCaller, &IID_IUnknown, (void**)&unk); + ok(hr == S_OK, "QueryService failed: 0x%08x.\n", hr); + ok(!unk, "unexpected object returned %p.\n", unk); + sp = (IServiceProvider*)0xdeadbeef; + hr = IServiceProvider_QueryService(pspCaller, &SID_GetCaller, &IID_IServiceProvider, (void**)&sp); + ok(hr == S_OK, "QueryService failed: 0x%08x.\n", hr); + ok(!sp, "unexpected object returned %p.\n", sp); + unk = (IUnknown*)0xdeadbeef; + hr = IServiceProvider_QueryService(pspCaller, &SID_VariantConversion, &IID_IVariantChangeType, (void**)&unk); + ok(hr == E_NOINTERFACE, "QueryService returned: 0x%08x.\n", hr); + ok(!unk, "unexpected object returned %p.\n", unk); V_VT(pvarRes) = VT_I2; V_I2(pvarRes) = 42;