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