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