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