oleaut32: Fix BSTR to DATE conversion

André Hentschel nerv at dawncrow.de
Wed Mar 3 12:54:50 CST 2010


For cases were the BSTR contains a float like "1.2345"
---
 dlls/oleaut32/tests/varformat.c |    4 ++--
 dlls/oleaut32/variant.c         |    9 ++++++++-
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/dlls/oleaut32/tests/varformat.c b/dlls/oleaut32/tests/varformat.c
index fd598cb..87018dc 100644
--- a/dlls/oleaut32/tests/varformat.c
+++ b/dlls/oleaut32/tests/varformat.c
@@ -317,8 +317,8 @@ static void test_VarFormat(void)
   VARFMT(VT_BSTR,V_BSTR,bstrin,"<&>&",S_OK,"testing");
   SysFreeString(bstrin);
   bstrin = SysAllocString(szNum);
-  todo_wine VARFMT(VT_BSTR,V_BSTR,bstrin,"hh:mm",S_OK,"02:38");
-  todo_wine VARFMT(VT_BSTR,V_BSTR,bstrin,"mm-dd-yy",S_OK,"09-06-08");
+  VARFMT(VT_BSTR,V_BSTR,bstrin,"hh:mm",S_OK,"02:38");
+  VARFMT(VT_BSTR,V_BSTR,bstrin,"mm-dd-yy",S_OK,"09-06-08");
   SysFreeString(bstrin);
   /* Numeric values are converted to strings then output */
   VARFMT(VT_I1,V_I1,1,"<&>&",S_OK,"1");
diff --git a/dlls/oleaut32/variant.c b/dlls/oleaut32/variant.c
index 450856f..4ed4f01 100644
--- a/dlls/oleaut32/variant.c
+++ b/dlls/oleaut32/variant.c
@@ -85,6 +85,7 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags,
   HRESULT res = DISP_E_TYPEMISMATCH;
   VARTYPE vtFrom =  V_TYPE(ps);
   DWORD dwFlags = 0;
+  VARIANTARG vTmp;
 
   TRACE("(%p->(%s%s),0x%08x,0x%04x,%p->(%s%s),%s%s)\n", pd, debugstr_VT(pd),
         debugstr_VF(pd), lcid, wFlags, ps, debugstr_VT(ps), debugstr_VF(ps),
@@ -92,6 +93,8 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags,
 
   if (vt == VT_BSTR || vtFrom == VT_BSTR)
   {
+    V_VT(&vTmp) = VT_EMPTY;
+    VariantClear(&vTmp);
     /* All flags passed to low level function are only used for
      * changing to or from strings. Map these here.
      */
@@ -384,7 +387,11 @@ static inline HRESULT VARIANT_Coerce(VARIANTARG* pd, LCID lcid, USHORT wFlags,
     case VT_CY:       return VarDateFromCy(V_CY(ps), &V_DATE(pd));
     case VT_DECIMAL:  return VarDateFromDec(&V_DECIMAL(ps), &V_DATE(pd));
     case VT_DISPATCH: return VarDateFromDisp(V_DISPATCH(ps), lcid, &V_DATE(pd));
-    case VT_BSTR:     return VarDateFromStr(V_BSTR(ps), lcid, dwFlags, &V_DATE(pd));
+    case VT_BSTR:
+      if(SUCCEEDED(VarR8FromStr(V_BSTR(ps), lcid, dwFlags, &V_R8(&vTmp))))
+        return VarDateFromR8(V_R8(&vTmp), &V_DATE(pd));
+      else
+        return VarDateFromStr(V_BSTR(ps), lcid, dwFlags, &V_DATE(pd));
     }
     break;
 
-- 

Best Regards, André Hentschel



More information about the wine-patches mailing list