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

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


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

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

oleaut32: Support for VT_DISPATCH in VarAdd.

---

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

diff --git a/dlls/oleaut32/variant.c b/dlls/oleaut32/variant.c
index 899cb92..a1102d3 100644
--- a/dlls/oleaut32/variant.c
+++ b/dlls/oleaut32/variant.c
@@ -3130,6 +3130,7 @@ HRESULT WINAPI VarAdd(LPVARIANT left, LP
     HRESULT hres;
     VARTYPE lvt, rvt, resvt, tvt;
     VARIANT lv, rv, tv;
+    VARIANT tempLeft, tempRight;
     double r8res;
 
     /* Variant priority for coercion. Sorted from lowest to highest.
@@ -3161,6 +3162,26 @@ HRESULT WINAPI VarAdd(LPVARIANT left, LP
     VariantInit(&lv);
     VariantInit(&rv);
     VariantInit(&tv);
+    VariantInit(&tempLeft);
+    VariantInit(&tempRight);
+
+    /* Handle VT_DISPATCH by storing and taking address of returned value */
+    if ((V_VT(left) & VT_TYPEMASK) != VT_NULL && (V_VT(right) & VT_TYPEMASK) != VT_NULL)
+    {
+        if ((V_VT(left) & VT_TYPEMASK) == VT_DISPATCH)
+        {
+            hres = VARIANT_FetchDispatchValue(left, &tempLeft);
+            if (FAILED(hres)) goto end;
+            left = &tempLeft;
+        }
+        if ((V_VT(right) & VT_TYPEMASK) == VT_DISPATCH)
+        {
+            hres = VARIANT_FetchDispatchValue(right, &tempRight);
+            if (FAILED(hres)) goto end;
+            right = &tempRight;
+        }
+    }
+
     lvt = V_VT(left)&VT_TYPEMASK;
     rvt = V_VT(right)&VT_TYPEMASK;
 
@@ -3288,6 +3309,8 @@ end:
     VariantClear(&lv);
     VariantClear(&rv);
     VariantClear(&tv);
+    VariantClear(&tempLeft);
+    VariantClear(&tempRight);
     TRACE("returning 0x%8x (variant type %s)\n", hres, debugstr_VT(result));
     return hres;
 }




More information about the wine-cvs mailing list