oleaut32: Always use DISPID_PROPERTYPUT to fill in the last argument.
authorVincent Povirk <vincent@codeweavers.com>
Tue, 16 Mar 2010 18:32:57 +0000 (13:32 -0500)
committerAlexandre Julliard <julliard@winehq.org>
Wed, 17 Mar 2010 09:07:57 +0000 (10:07 +0100)
dlls/oleaut32/tests/tmarshal.c
dlls/oleaut32/tests/tmarshal.idl
dlls/oleaut32/tests/tmarshal_dispids.h
dlls/oleaut32/typelib.c

index 33adf3c6597eb04b42c9cb2e01f9c36a8fb8f1e5..64b6633a9a24bc32ed958dcf1d73e4a88ef1b1da 100644 (file)
@@ -594,6 +594,15 @@ static HRESULT WINAPI Widget_ByRefUInt(
     return S_OK;
 }
 
+static HRESULT WINAPI Widget_put_prop_opt_arg(
+    IWidget* iface, INT opt, INT i)
+{
+    trace("put_prop_opt_arg(%08x, %08x)\n", opt, i);
+    todo_wine ok(opt == 0, "got opt=%08x\n", opt);
+    ok(i == 0xcafe, "got i=%08x\n", i);
+    return S_OK;
+}
+
 static const struct IWidgetVtbl Widget_VTable =
 {
     Widget_QueryInterface,
@@ -627,6 +636,7 @@ static const struct IWidgetVtbl Widget_VTable =
     Widget_get_prop_int,
     Widget_get_prop_uint,
     Widget_ByRefUInt,
+    Widget_put_prop_opt_arg,
 };
 
 static HRESULT WINAPI StaticWidget_QueryInterface(IStaticWidget *iface, REFIID riid, void **ppvObject)
@@ -1387,6 +1397,19 @@ static void test_typelibmarshal(void)
     VariantClear(&varresult);
     VariantClear(&vararg[0]);
 
+    /* test propput with optional argument. */
+    VariantInit(&vararg[0]);
+    V_VT(&vararg[0]) = VT_I4;
+    V_I4(&vararg[0]) = 0xcafe;
+    dispparams.cNamedArgs = 1;
+    dispparams.rgdispidNamedArgs = &dispidNamed;
+    dispparams.cArgs = 1;
+    dispparams.rgvarg = vararg;
+    VariantInit(&varresult);
+    hr = IDispatch_Invoke(pDispatch, DISPID_TM_PROP_OPT_ARG, &IID_NULL, 0x40c, DISPATCH_PROPERTYPUT, &dispparams, &varresult, &excepinfo, NULL);
+    ok_ole_success(hr, ITypeInfo_Invoke);
+    VariantClear(&varresult);
+
     IDispatch_Release(pDispatch);
     IWidget_Release(pWidget);
 
index 5dc3a128b0c6e7d90686d6db1bfbaf2e7ca09284..077fb59f77e2963d5ecc57ab9f571850a8feac02 100644 (file)
@@ -140,6 +140,9 @@ library TestTypelib
 
         [id(DISPID_TM_BYREF_UINT)]
         HRESULT ByRefUInt([in, out] UINT *i);
+
+        [id(DISPID_TM_PROP_OPT_ARG), propput]
+        HRESULT prop_opt_arg([in,optional] INT opt, [in] INT i);
     }
 
     [
index ad8ba1b8dfa5dee6f9857aaaa4e58991d34af404..a4f467ed6f7e1c4b772ab04cdc5f4b3a89ad74ce 100644 (file)
@@ -38,6 +38,7 @@
 #define DISPID_TM_PROP_INT 19
 #define DISPID_TM_PROP_UINT 20
 #define DISPID_TM_BYREF_UINT 21
+#define DISPID_TM_PROP_OPT_ARG 22
 
 #define DISPID_NOA_BSTRRET 1
 #define DISPID_NOA_ERROR 2
index c3f5fc25be024a52850160a1e8dd4f431765f161..08a39b976fc244b646c789ebf4b1252f2e683e7c 100644 (file)
@@ -6065,9 +6065,6 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
                     hres = DISP_E_PARAMNOTFOUND;
                     goto func_fail;
                 }
-                /* ignore the DISPID_PROPERTYPUT named argument from now on */
-                cNamedArgs--;
-                rgdispidNamedArgs++;
             }
 
             if (func_desc->cParamsOpt < 0 && cNamedArgs)
@@ -6105,7 +6102,7 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
                     USHORT j;
                     src_arg = NULL;
                     for (j = 0; j < cNamedArgs; j++)
-                        if (rgdispidNamedArgs[j] == i)
+                        if (rgdispidNamedArgs[j] == i || (i == func_desc->cParams-1 && rgdispidNamedArgs[j] == DISPID_PROPERTYPUT))
                         {
                             src_arg = &pDispParams->rgvarg[j];
                             break;