Robert Shearman : oleaut: Better support for invoking methods with VT_VARIANT argument types.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Mar 21 13:21:15 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 264b122d52405864db8c2807548bc65e88e9cc42
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=264b122d52405864db8c2807548bc65e88e9cc42

Author: Robert Shearman <rob at codeweavers.com>
Date:   Tue Mar 21 13:45:22 2006 +0000

oleaut: Better support for invoking methods with VT_VARIANT argument types.

---

 dlls/oleaut32/typelib.c |   20 ++++++++++++++------
 1 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 317b44c..ede6de5 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -5110,7 +5110,10 @@ DispCallFunc(
     {
         VARIANT *arg = prgpvarg[i];
         TRACE("Storing arg %d (%d as %d)\n",i,V_VT(arg),prgvt[i]);
-        memcpy(&args[argspos], &V_NONE(arg), _argsize(prgvt[i]) * sizeof(DWORD));
+        if (prgvt[i] == VT_VARIANT)
+            memcpy(&args[argspos], arg, _argsize(prgvt[i]) * sizeof(DWORD));
+        else
+            memcpy(&args[argspos], &V_NONE(arg), _argsize(prgvt[i]) * sizeof(DWORD));
         argspos += _argsize(prgvt[i]);
     }
 
@@ -5231,20 +5234,26 @@ static HRESULT WINAPI ITypeInfo_fnInvoke
                 else if (i < pDispParams->cArgs)
                 {
                     VARIANTARG *src_arg = &pDispParams->rgvarg[pDispParams->cArgs - 1 - i];
-                    V_VT(&rgvarg[i]) = V_VT(src_arg);
                     dump_Variant(src_arg);
 
-                    /* FIXME: this doesn't work for VT_BYREF arguments if
-                     * they are not the same type as in the paramdesc */
-                    if ((rgvt[i] & VT_BYREF) && !V_ISBYREF(src_arg))
+                    if (rgvt[i] == VT_VARIANT)
+                        VariantCopy(&rgvarg[i], src_arg);
+                    else if ((rgvt[i] & VT_BYREF) && !V_ISBYREF(src_arg))
                     {
                         VARIANTARG *missing_arg = INVBUF_GET_MISSING_ARG_ARRAY(buffer, func_desc->cParams);
                         V_VT(&missing_arg[i]) = V_VT(src_arg);
                         hres = VariantChangeType(&missing_arg[i], src_arg, 0, rgvt[i] & ~VT_BYREF);
                         V_BYREF(&rgvarg[i]) = &V_NONE(&missing_arg[i]);
+                        V_VT(&rgvarg[i]) = rgvt[i];
                     }
                     else
+                    {
+                        /* FIXME: this doesn't work for VT_BYREF arguments if
+                         * they are not the same type as in the paramdesc */
+                        V_VT(&rgvarg[i]) = V_VT(src_arg);
                         hres = VariantChangeType(&rgvarg[i], src_arg, 0, rgvt[i]);
+                        V_VT(&rgvarg[i]) = rgvt[i];
+                    }
 
                     if (FAILED(hres))
                     {
@@ -5253,7 +5262,6 @@ static HRESULT WINAPI ITypeInfo_fnInvoke
                             debugstr_VT(src_arg), debugstr_VF(src_arg));
                         break;
                     }
-                    V_VT(&rgvarg[i]) = rgvt[i];
                     prgpvarg[i] = &rgvarg[i];
                 }
                 else if (wParamFlags & PARAMFLAG_FOPT)




More information about the wine-cvs mailing list