Vincent Povirk : oleaut32: Allow named args to be combined with positional args in fnInvoke.

Alexandre Julliard julliard at winehq.org
Mon Mar 22 11:11:59 CDT 2010


Module: wine
Branch: master
Commit: 8ff7238adeff518fced37159a4b5a17b9551f4dc
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8ff7238adeff518fced37159a4b5a17b9551f4dc

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Fri Mar 19 11:53:26 2010 -0500

oleaut32: Allow named args to be combined with positional args in fnInvoke.

---

 dlls/oleaut32/tests/tmarshal.c         |   26 ++++++++++++++++++++++++++
 dlls/oleaut32/tests/tmarshal.idl       |    3 +++
 dlls/oleaut32/tests/tmarshal_dispids.h |    1 +
 dlls/oleaut32/typelib.c                |    8 +++++---
 4 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/dlls/oleaut32/tests/tmarshal.c b/dlls/oleaut32/tests/tmarshal.c
index 64b6633..f7df82f 100644
--- a/dlls/oleaut32/tests/tmarshal.c
+++ b/dlls/oleaut32/tests/tmarshal.c
@@ -603,6 +603,15 @@ static HRESULT WINAPI Widget_put_prop_opt_arg(
     return S_OK;
 }
 
+static HRESULT WINAPI Widget_put_prop_req_arg(
+    IWidget* iface, INT req, INT i)
+{
+    trace("put_prop_req_arg(%08x, %08x)\n", req, i);
+    ok(req == 0x5678, "got req=%08x\n", req);
+    ok(i == 0x1234, "got i=%08x\n", i);
+    return S_OK;
+}
+
 static const struct IWidgetVtbl Widget_VTable =
 {
     Widget_QueryInterface,
@@ -637,6 +646,7 @@ static const struct IWidgetVtbl Widget_VTable =
     Widget_get_prop_uint,
     Widget_ByRefUInt,
     Widget_put_prop_opt_arg,
+    Widget_put_prop_req_arg,
 };
 
 static HRESULT WINAPI StaticWidget_QueryInterface(IStaticWidget *iface, REFIID riid, void **ppvObject)
@@ -1410,6 +1420,22 @@ static void test_typelibmarshal(void)
     ok_ole_success(hr, ITypeInfo_Invoke);
     VariantClear(&varresult);
 
+    /* test propput with required argument. */
+    VariantInit(&vararg[0]);
+    VariantInit(&vararg[1]);
+    V_VT(&vararg[0]) = VT_I4;
+    V_I4(&vararg[0]) = 0x1234;
+    V_VT(&vararg[1]) = VT_I4;
+    V_I4(&vararg[1]) = 0x5678;
+    dispparams.cNamedArgs = 1;
+    dispparams.rgdispidNamedArgs = &dispidNamed;
+    dispparams.cArgs = 2;
+    dispparams.rgvarg = vararg;
+    VariantInit(&varresult);
+    hr = IDispatch_Invoke(pDispatch, DISPID_TM_PROP_REQ_ARG, &IID_NULL, 0x40c, DISPATCH_PROPERTYPUT, &dispparams, &varresult, &excepinfo, NULL);
+    ok_ole_success(hr, ITypeInfo_Invoke);
+    VariantClear(&varresult);
+
     IDispatch_Release(pDispatch);
     IWidget_Release(pWidget);
 
diff --git a/dlls/oleaut32/tests/tmarshal.idl b/dlls/oleaut32/tests/tmarshal.idl
index 077fb59..7616789 100644
--- a/dlls/oleaut32/tests/tmarshal.idl
+++ b/dlls/oleaut32/tests/tmarshal.idl
@@ -143,6 +143,9 @@ library TestTypelib
 
         [id(DISPID_TM_PROP_OPT_ARG), propput]
         HRESULT prop_opt_arg([in,optional] INT opt, [in] INT i);
+
+        [id(DISPID_TM_PROP_REQ_ARG), propput]
+        HRESULT prop_req_arg([in] INT req, [in] INT i);
     }
 
     [
diff --git a/dlls/oleaut32/tests/tmarshal_dispids.h b/dlls/oleaut32/tests/tmarshal_dispids.h
index a4f467e..376162b 100644
--- a/dlls/oleaut32/tests/tmarshal_dispids.h
+++ b/dlls/oleaut32/tests/tmarshal_dispids.h
@@ -39,6 +39,7 @@
 #define DISPID_TM_PROP_UINT 20
 #define DISPID_TM_BYREF_UINT 21
 #define DISPID_TM_PROP_OPT_ARG 22
+#define DISPID_TM_PROP_REQ_ARG 23
 
 #define DISPID_NOA_BSTRRET 1
 #define DISPID_NOA_ERROR 2
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index b09f7ab..c1fa321 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -6102,10 +6102,11 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
                     continue;
                 }
 
+                src_arg = NULL;
+
                 if (cNamedArgs)
                 {
                     USHORT j;
-                    src_arg = NULL;
                     for (j = 0; j < cNamedArgs; j++)
                         if (rgdispidNamedArgs[j] == i || (i == func_desc->cParams-1 && rgdispidNamedArgs[j] == DISPID_PROPERTYPUT))
                         {
@@ -6113,9 +6114,10 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
                             break;
                         }
                 }
-                else
+
+                if (!src_arg && vargs_converted + cNamedArgs < pDispParams->cArgs)
                 {
-                    src_arg = vargs_converted < pDispParams->cArgs ? &pDispParams->rgvarg[pDispParams->cArgs - 1 - vargs_converted] : NULL;
+                    src_arg = &pDispParams->rgvarg[pDispParams->cArgs - 1 - vargs_converted];
                     vargs_converted++;
                 }
 




More information about the wine-cvs mailing list