Nikolay Sivov : oleaut32: Fix SafeArrayGetElement() for FADF_RECORD arrays.

Alexandre Julliard julliard at winehq.org
Tue Feb 25 16:58:15 CST 2014


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue Feb 25 08:43:06 2014 +0400

oleaut32: Fix SafeArrayGetElement() for FADF_RECORD arrays.

---

 dlls/oleaut32/safearray.c       |   24 ++++++++++++++++--------
 dlls/oleaut32/tests/safearray.c |    6 ++++++
 2 files changed, 22 insertions(+), 8 deletions(-)

diff --git a/dlls/oleaut32/safearray.c b/dlls/oleaut32/safearray.c
index 080921e..99ffe27 100644
--- a/dlls/oleaut32/safearray.c
+++ b/dlls/oleaut32/safearray.c
@@ -990,18 +990,26 @@ HRESULT WINAPI SafeArrayGetElement(SAFEARRAY *psa, LONG *rgIndices, void *pvData
         else
           *lpDest = NULL;
       }
-      else
+      else if (psa->fFeatures & (FADF_UNKNOWN|FADF_DISPATCH))
       {
-        if (psa->fFeatures & (FADF_UNKNOWN|FADF_DISPATCH))
-        {
-          LPUNKNOWN *lpUnknown = lpvSrc;
+        IUnknown **src_unk = lpvSrc;
+        IUnknown **dest_unk = pvData;
 
-          if (*lpUnknown)
-            IUnknown_AddRef(*lpUnknown);
-        }
+        if (*src_unk)
+          IUnknown_AddRef(*src_unk);
+        *dest_unk = *src_unk;
+      }
+      else if (psa->fFeatures & FADF_RECORD)
+      {
+        IRecordInfo *record;
+
+        SafeArrayGetRecordInfo(psa, &record);
+        hRet = IRecordInfo_RecordCopy(record, lpvSrc, pvData);
+        IRecordInfo_Release(record);
+      }
+      else
         /* Copy the data over */
         memcpy(pvData, lpvSrc, psa->cbElements);
-      }
     }
     SafeArrayUnlock(psa);
   }
diff --git a/dlls/oleaut32/tests/safearray.c b/dlls/oleaut32/tests/safearray.c
index c28931c..cc6a62c 100644
--- a/dlls/oleaut32/tests/safearray.c
+++ b/dlls/oleaut32/tests/safearray.c
@@ -1203,6 +1203,12 @@ static void test_SafeArrayGetPutElement(void)
   ok(hres == S_OK, "got 0x%08x\n", hres);
   ok(irec->recordcopy == 1, "got %d\n", irec->recordcopy);
 
+  index = 0;
+  irec->recordcopy = 0;
+  hres = SafeArrayGetElement(sa, &index, (void*)0xdeadbeef);
+  ok(hres == S_OK, "got 0x%08x\n", hres);
+  ok(irec->recordcopy == 1, "got %d\n", irec->recordcopy);
+
   hres = SafeArrayDestroy(sa);
   ok(hres == S_OK, "got 0x%08x\n", hres);
   ok(irec->ref == 1, "got %d\n", irec->ref);




More information about the wine-cvs mailing list