Robert Shearman : oleaut: Handle a non-byref variant being passed for a byref param in

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jan 16 14:37:58 CST 2006


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

Author: Robert Shearman <rob at codeweavers.com>
Date:   Mon Jan 16 20:44:13 2006 +0100

oleaut: Handle a non-byref variant being passed for a byref param in
ITypeInfo::Invoke.

---

 dlls/oleaut32/typelib.c |   21 +++++++++++++++++----
 1 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 9799b5b..64ae776 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -5262,14 +5262,27 @@ static HRESULT WINAPI ITypeInfo_fnInvoke
                 }
                 else if (i < pDispParams->cArgs)
                 {
-                    V_VT(&rgvarg[i]) = V_VT(&pDispParams->rgvarg[pDispParams->cArgs - 1 - i]);
-                    dump_Variant(&pDispParams->rgvarg[pDispParams->cArgs - 1 - i]);
+                    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 */
-                    hres = VariantChangeType(&rgvarg[i], &pDispParams->rgvarg[pDispParams->cArgs - 1 - i], 0, rgvt[i]);
+                    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]);
+                    }
+                    else
+                        hres = VariantChangeType(&rgvarg[i], src_arg, 0, rgvt[i]);
+
                     if (FAILED(hres))
                     {
-                        ERR("failed to convert param %d to vt %d\n", i, rgvt[i]);
+                        ERR("failed to convert param %d to %s%s from %s%s\n", i,
+                            debugstr_vt(rgvt[i]), debugstr_vf(rgvt[i]),
+                            debugstr_VT(src_arg), debugstr_VF(src_arg));
                         break;
                     }
                     V_VT(&rgvarg[i]) = rgvt[i];




More information about the wine-cvs mailing list