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

ITypeInfo::Invoke.
This commit is contained in:
Robert Shearman 2006-01-16 20:44:13 +01:00 committed by Alexandre Julliard
parent d86f8d2ef2
commit 1f04fc6a49

View file

@ -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];