Module: wine Branch: master Commit: 1c85155eaac6ab8ad6a6f3cbdfcac8bd833d940f URL: http://source.winehq.org/git/wine.git/?a=commit;h=1c85155eaac6ab8ad6a6f3cbdf... Author: Alex Villacís Lasso <a_villacis(a)palosanto.com> Date: Tue Jan 2 18:56:15 2007 -0500 oleaut32: Support for VT_DISPATCH in VarImp. --- dlls/oleaut32/variant.c | 44 +++++++++++++++++++++++++++++++++++--------- 1 files changed, 35 insertions(+), 9 deletions(-) diff --git a/dlls/oleaut32/variant.c b/dlls/oleaut32/variant.c index b3d1906..03c1537 100644 --- a/dlls/oleaut32/variant.c +++ b/dlls/oleaut32/variant.c @@ -5623,6 +5623,29 @@ HRESULT WINAPI VarImp(LPVARIANT left, LP VARTYPE rightExtraFlags,leftExtraFlags,ExtraFlags; VARIANT lv,rv; double d; + VARIANT tempLeft, tempRight; + + VariantInit(&lv); + VariantInit(&rv); + VariantInit(&tempLeft); + VariantInit(&tempRight); + + TRACE("(%p->(%s%s),%p->(%s%s),%p)\n", left, debugstr_VT(left), + debugstr_VF(left), right, debugstr_VT(right), debugstr_VF(right), result); + + /* Handle VT_DISPATCH by storing and taking address of returned value */ + if ((V_VT(left) & VT_TYPEMASK) == VT_DISPATCH) + { + hres = VARIANT_FetchDispatchValue(left, &tempLeft); + if (FAILED(hres)) goto VarImp_Exit; + left = &tempLeft; + } + if ((V_VT(right) & VT_TYPEMASK) == VT_DISPATCH) + { + hres = VARIANT_FetchDispatchValue(right, &tempRight); + if (FAILED(hres)) goto VarImp_Exit; + right = &tempRight; + } leftvt = V_VT(left)&VT_TYPEMASK; rightvt = V_VT(right)&VT_TYPEMASK; @@ -5630,25 +5653,29 @@ HRESULT WINAPI VarImp(LPVARIANT left, LP rightExtraFlags = V_VT(right)&(~VT_TYPEMASK); if (leftExtraFlags != rightExtraFlags) - return DISP_E_BADVARTYPE; + { + hres = DISP_E_BADVARTYPE; + goto VarImp_Exit; + } ExtraFlags = leftExtraFlags; - TRACE("(%p->(%s%s),%p->(%s%s),%p)\n", left, debugstr_VT(left), - debugstr_VF(left), right, debugstr_VT(right), debugstr_VF(right), result); - /* Native VarImp always returns a error when using any extra * flags or if the variants are I8 and INT. */ if ((leftvt == VT_I8 && rightvt == VT_INT) || ExtraFlags != 0) - return DISP_E_BADVARTYPE; + { + hres = DISP_E_BADVARTYPE; + goto VarImp_Exit; + } /* Determine result type */ else if ((leftvt == VT_NULL && rightvt == VT_NULL) || (leftvt == VT_NULL && rightvt == VT_EMPTY)) { V_VT(result) = VT_NULL; - return S_OK; + hres = S_OK; + goto VarImp_Exit; } else if (leftvt == VT_I8 || rightvt == VT_I8) resvt = VT_I8; @@ -5677,9 +5704,6 @@ HRESULT WINAPI VarImp(LPVARIANT left, LP leftvt == VT_BSTR || rightvt == VT_BSTR) resvt = VT_BOOL; - VariantInit(&lv); - VariantInit(&rv); - /* VT_NULL requires special handling for when the opposite * variant is equal to something other than -1. * (NULL Imp 0 = NULL, NULL Imp n = n) @@ -5824,6 +5848,8 @@ VarImp_Exit: VariantClear(&lv); VariantClear(&rv); + VariantClear(&tempLeft); + VariantClear(&tempRight); return hres; }