mshtml: Skip unused named args in Invoke calls.
authorJacek Caban <jacek@codeweavers.com>
Mon, 11 Jan 2016 19:49:24 +0000 (20:49 +0100)
committerAlexandre Julliard <julliard@winehq.org>
Tue, 12 Jan 2016 16:56:06 +0000 (01:56 +0900)
Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
dlls/mshtml/dispex.c
dlls/mshtml/tests/script.c

index ff4e28a4046c27c5c63f0073bcc5dc638bea8b1b..3980daff575ee98c0aeb2a943619e58c7dacba8b 100644 (file)
@@ -617,6 +617,7 @@ static HRESULT dispex_value(DispatchEx *This, LCID lcid, WORD flags, DISPPARAMS
 static HRESULT typeinfo_invoke(DispatchEx *This, func_info_t *func, WORD flags, DISPPARAMS *dp, VARIANT *res,
         EXCEPINFO *ei)
 {
+    DISPPARAMS params = {dp->rgvarg+dp->cNamedArgs, NULL, dp->cArgs-dp->cNamedArgs, 0};
     ITypeInfo *ti;
     IUnknown *unk;
     UINT argerr=0;
@@ -634,7 +635,7 @@ static HRESULT typeinfo_invoke(DispatchEx *This, func_info_t *func, WORD flags,
         return E_FAIL;
     }
 
-    hres = ITypeInfo_Invoke(ti, unk, func->id, flags, dp, res, ei, &argerr);
+    hres = ITypeInfo_Invoke(ti, unk, func->id, flags, &params, res, ei, &argerr);
 
     IUnknown_Release(unk);
     return hres;
index 251193954f56234bf6fbd02e33a536a06724c267..73b1185b2470543b0090e3f28e69d6bbae856ed9 100644 (file)
@@ -1926,6 +1926,23 @@ static void test_func(IDispatchEx *obj)
     hres = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dp, &var, &ei, NULL);
     ok(hres == S_OK || broken(E_ACCESSDENIED), "InvokeEx failed: %08x\n", hres);
     if(SUCCEEDED(hres)) {
+        DISPID named_args[2] = { DISPID_THIS, 0xdeadbeef };
+        VARIANT args[2];
+
+        ok(V_VT(&var) == VT_BSTR, "V_VT(var)=%d\n", V_VT(&var));
+        ok(!strcmp_wa(V_BSTR(&var), "[object]"), "V_BSTR(var) = %s\n", wine_dbgstr_w(V_BSTR(&var)));
+        VariantClear(&var);
+
+        dp.rgdispidNamedArgs = named_args;
+        dp.cNamedArgs = 2;
+        dp.cArgs = 2;
+        dp.rgvarg = &var;
+        V_VT(args) = VT_DISPATCH;
+        V_DISPATCH(args) = (IDispatch*)obj;
+        V_VT(args+1) = VT_I4;
+        V_I4(args+1) = 3;
+        hres = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dp, &var, &ei, NULL);
+        ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
         ok(V_VT(&var) == VT_BSTR, "V_VT(var)=%d\n", V_VT(&var));
         ok(!strcmp_wa(V_BSTR(&var), "[object]"), "V_BSTR(var) = %s\n", wine_dbgstr_w(V_BSTR(&var)));
         VariantClear(&var);