Alex Villacís Lasso : oleaut32: Support for VT_DISPATCH in VarAnd.
Module: wine Branch: master Commit: 97d13c552cc5a5977176002ac539d32f0ae29d57 URL: http://source.winehq.org/git/wine.git/?a=commit;h=97d13c552cc5a5977176002ac5... Author: Alex Villacís Lasso <a_villacis(a)palosanto.com> Date: Tue Jan 2 18:49:17 2007 -0500 oleaut32: Support for VT_DISPATCH in VarAnd. --- dlls/oleaut32/variant.c | 34 +++++++++++++++++++++++++++++++--- 1 files changed, 31 insertions(+), 3 deletions(-) diff --git a/dlls/oleaut32/variant.c b/dlls/oleaut32/variant.c index 52193e9..899cb92 100644 --- a/dlls/oleaut32/variant.c +++ b/dlls/oleaut32/variant.c @@ -2893,20 +2893,40 @@ HRESULT WINAPI VarAnd(LPVARIANT left, LP 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, LP 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, LP 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, LP VarAnd_Exit: VariantClear(&varLeft); VariantClear(&varRight); + VariantClear(&tempLeft); + VariantClear(&tempRight); return hres; }
participants (1)
-
Alexandre Julliard