Module: wine Branch: refs/heads/master Commit: 1f04fc6a491c8ab00d523f3dd847fd6ade91f19a URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=1f04fc6a491c8ab00d523f3d...
Author: Robert Shearman rob@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];