Huw Davies : oleaut32: Handle marshaling of VARTYPE-less FADF_VARIANT safearrays.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jun 25 07:28:02 CDT 2007


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Fri Jun 22 15:10:04 2007 +0100

oleaut32: Handle marshaling of VARTYPE-less FADF_VARIANT safearrays.

---

 dlls/oleaut32/tests/usrmarshal.c |   25 +++++++++++++++++++++++++
 dlls/oleaut32/usrmarshal.c       |    2 ++
 2 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/dlls/oleaut32/tests/usrmarshal.c b/dlls/oleaut32/tests/usrmarshal.c
index 5989c1d..21714c4 100644
--- a/dlls/oleaut32/tests/usrmarshal.c
+++ b/dlls/oleaut32/tests/usrmarshal.c
@@ -49,6 +49,8 @@ static inline SF_TYPE get_union_type(SAFEARRAY *psa)
     hr = SafeArrayGetVartype(psa, &vt);
     if (FAILED(hr))
     {
+        if(psa->fFeatures & FADF_VARIANT) return SF_VARIANT;
+
         switch(psa->cbElements)
         {
         case 1: vt = VT_I1; break;
@@ -264,6 +266,29 @@ static void test_marshal_LPSAFEARRAY(void)
     HeapFree(GetProcessHeap(), 0, buffer);
     SafeArrayDestroyData(lpsa);
     SafeArrayDestroyDescriptor(lpsa);
+
+    /* VARTYPE-less arrays with FADF_VARIANT */
+    hr = SafeArrayAllocDescriptor(1, &lpsa);
+    ok(hr == S_OK, "saad failed %08x\n", hr);
+    lpsa->cbElements = 16;
+    lpsa->fFeatures = FADF_VARIANT;
+    lpsa->rgsabound[0].lLbound = 2;
+    lpsa->rgsabound[0].cElements = 48;
+    hr = SafeArrayAllocData(lpsa);
+    ok(hr == S_OK, "saad failed %08x\n", hr);
+
+    hr = SafeArrayGetVartype(lpsa, &vt);
+    ok(hr == E_INVALIDARG, "ret %08x\n", hr);
+
+    size = LPSAFEARRAY_UserSize(&umcb.Flags, 0, &lpsa);
+    todo_wine
+    ok(size == 1388, "size %ld\n", size);
+    buffer = (unsigned char *)HeapAlloc(GetProcessHeap(), 0, size);
+    LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa);
+    check_safearray(buffer, lpsa);
+    HeapFree(GetProcessHeap(), 0, buffer);
+    SafeArrayDestroyData(lpsa);
+    SafeArrayDestroyDescriptor(lpsa);
 }
 
 static void check_bstr(void *buffer, BSTR b)
diff --git a/dlls/oleaut32/usrmarshal.c b/dlls/oleaut32/usrmarshal.c
index 25f831a..67faf20 100644
--- a/dlls/oleaut32/usrmarshal.c
+++ b/dlls/oleaut32/usrmarshal.c
@@ -711,6 +711,8 @@ static inline SF_TYPE SAFEARRAY_GetUnionType(SAFEARRAY *psa)
     hr = SafeArrayGetVartype(psa, &vt);
     if (FAILED(hr))
     {
+        if(psa->fFeatures & FADF_VARIANT) return SF_VARIANT;
+
         switch(psa->cbElements)
         {
         case 1: vt = VT_I1; break;




More information about the wine-cvs mailing list