From 5aacee9550cac739ad7ae43e527dd29fade4668f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Alex=20Villac=C3=ADs=20Lasso?= Date: Tue, 2 Jan 2007 18:53:37 -0500 Subject: [PATCH] oleaut32: Support for VT_DISPATCH in VarXor. --- dlls/oleaut32/variant.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/dlls/oleaut32/variant.c b/dlls/oleaut32/variant.c index 318ebfc8333..2a90b06094a 100644 --- a/dlls/oleaut32/variant.c +++ b/dlls/oleaut32/variant.c @@ -4520,6 +4520,7 @@ HRESULT WINAPI VarXor(LPVARIANT pVarLeft, LPVARIANT pVarRight, LPVARIANT pVarOut { VARTYPE vt; VARIANT varLeft, varRight; + VARIANT tempLeft, tempRight; double d; HRESULT hRet; @@ -4542,6 +4543,23 @@ HRESULT WINAPI VarXor(LPVARIANT pVarLeft, LPVARIANT pVarRight, LPVARIANT pVarOut return S_OK; } + VariantInit(&tempLeft); + VariantInit(&tempRight); + + /* Handle VT_DISPATCH by storing and taking address of returned value */ + if ((V_VT(pVarLeft) & VT_TYPEMASK) == VT_DISPATCH) + { + hRet = VARIANT_FetchDispatchValue(pVarLeft, &tempLeft); + if (FAILED(hRet)) goto VarXor_Exit; + pVarLeft = &tempLeft; + } + if ((V_VT(pVarRight) & VT_TYPEMASK) == VT_DISPATCH) + { + hRet = VARIANT_FetchDispatchValue(pVarRight, &tempRight); + if (FAILED(hRet)) goto VarXor_Exit; + pVarRight = &tempRight; + } + /* Copy our inputs so we don't disturb anything */ V_VT(&varLeft) = V_VT(&varRight) = VT_EMPTY; @@ -4576,7 +4594,10 @@ HRESULT WINAPI VarXor(LPVARIANT pVarLeft, LPVARIANT pVarRight, LPVARIANT pVarOut if (V_VT(&varLeft) == VT_I8 || V_VT(&varRight) == VT_I8) { if (V_VT(pVarLeft) == VT_INT || V_VT(pVarRight) == VT_INT) - return DISP_E_TYPEMISMATCH; + { + hRet = DISP_E_TYPEMISMATCH; + goto VarXor_Exit; + } vt = VT_I8; } else @@ -4654,6 +4675,8 @@ HRESULT WINAPI VarXor(LPVARIANT pVarLeft, LPVARIANT pVarRight, LPVARIANT pVarOut VarXor_Exit: VariantClear(&varLeft); VariantClear(&varRight); + VariantClear(&tempLeft); + VariantClear(&tempRight); return hRet; } -- 2.11.4.GIT