Gabriel Ivăncescu : msscript.ocx: Supply a stub ServiceProvider to InvokeEx in run_procedure.

Alexandre Julliard julliard at winehq.org
Thu Sep 10 16:21:45 CDT 2020


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

Author: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Date:   Thu Sep 10 16:32:59 2020 +0300

msscript.ocx: Supply a stub ServiceProvider to InvokeEx in run_procedure.

Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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 ed17be90d8..70dc05f61e 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 a6ec0992c8..4f43764234 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;




More information about the wine-cvs mailing list