From 97d13c552cc5a5977176002ac539d32f0ae29d57 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Alex=20Villac=C3=ADs=20Lasso?= Date: Tue, 2 Jan 2007 18:49:17 -0500 Subject: [PATCH] oleaut32: Support for VT_DISPATCH in VarAnd. --- dlls/oleaut32/variant.c | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/dlls/oleaut32/variant.c b/dlls/oleaut32/variant.c index 52193e99a38..899cb925a39 100644 --- a/dlls/oleaut32/variant.c +++ b/dlls/oleaut32/variant.c @@ -2893,20 +2893,40 @@ HRESULT WINAPI VarAnd(LPVARIANT left, LPVARIANT right, LPVARIANT result) VARTYPE leftvt,rightvt; VARTYPE rightExtraFlags,leftExtraFlags,ExtraFlags; VARIANT varLeft, varRight; + VARIANT tempLeft, tempRight; VariantInit(&varLeft); VariantInit(&varRight); + 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 VarAnd_Exit; + left = &tempLeft; + } + if ((V_VT(right) & VT_TYPEMASK) == VT_DISPATCH) + { + hres = VARIANT_FetchDispatchValue(right, &tempRight); + if (FAILED(hres)) goto VarAnd_Exit; + right = &tempRight; + } + leftvt = V_VT(left)&VT_TYPEMASK; rightvt = V_VT(right)&VT_TYPEMASK; leftExtraFlags = V_VT(left)&(~VT_TYPEMASK); rightExtraFlags = V_VT(right)&(~VT_TYPEMASK); if (leftExtraFlags != rightExtraFlags) - return DISP_E_BADVARTYPE; + { + hres = DISP_E_BADVARTYPE; + goto VarAnd_Exit; + } ExtraFlags = leftExtraFlags; /* Native VarAnd always returns a error when using any extra @@ -2915,7 +2935,10 @@ HRESULT WINAPI VarAnd(LPVARIANT left, LPVARIANT right, LPVARIANT result) if ((leftvt == VT_I8 && rightvt == VT_INT) || (leftvt == VT_INT && rightvt == VT_I8) || ExtraFlags != 0) - return DISP_E_BADVARTYPE; + { + hres = DISP_E_BADVARTYPE; + goto VarAnd_Exit; + } /* Determine return type */ else if (leftvt == VT_I8 || rightvt == VT_I8) @@ -2950,7 +2973,10 @@ HRESULT WINAPI VarAnd(LPVARIANT left, LPVARIANT right, LPVARIANT result) leftvt == VT_BSTR || rightvt == VT_BSTR) resvt = VT_NULL; else - return DISP_E_BADVARTYPE; + { + hres = DISP_E_BADVARTYPE; + goto VarAnd_Exit; + } if (leftvt == VT_NULL || rightvt == VT_NULL) { @@ -3068,6 +3094,8 @@ HRESULT WINAPI VarAnd(LPVARIANT left, LPVARIANT right, LPVARIANT result) VarAnd_Exit: VariantClear(&varLeft); VariantClear(&varRight); + VariantClear(&tempLeft); + VariantClear(&tempRight); return hres; } -- 2.11.4.GIT