Alex Villacís Lasso : oleaut32: Support for VT_DISPATCH in VarXor.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Jan 3 05:37:37 CST 2007


Module: wine
Branch: master
Commit: 5aacee9550cac739ad7ae43e527dd29fade4668f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5aacee9550cac739ad7ae43e527dd29fade4668f

Author: Alex Villacís Lasso <a_villacis at palosanto.com>
Date:   Tue Jan  2 18:53:37 2007 -0500

oleaut32: Support for VT_DISPATCH in VarXor.

---

 dlls/oleaut32/variant.c |   25 ++++++++++++++++++++++++-
 1 files changed, 24 insertions(+), 1 deletions(-)

diff --git a/dlls/oleaut32/variant.c b/dlls/oleaut32/variant.c
index 318ebfc..2a90b06 100644
--- a/dlls/oleaut32/variant.c
+++ b/dlls/oleaut32/variant.c
@@ -4520,6 +4520,7 @@ HRESULT WINAPI VarXor(LPVARIANT pVarLeft
 {
     VARTYPE vt;
     VARIANT varLeft, varRight;
+    VARIANT tempLeft, tempRight;
     double d;
     HRESULT hRet;
 
@@ -4542,6 +4543,23 @@ HRESULT WINAPI VarXor(LPVARIANT pVarLeft
         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
     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
 VarXor_Exit:
     VariantClear(&varLeft);
     VariantClear(&varRight);
+    VariantClear(&tempLeft);
+    VariantClear(&tempRight);
     return hRet;
 }
 




More information about the wine-cvs mailing list