Module: wine Branch: master Commit: 2ce06e57278ae749dc14400f7788f7438ef9f60a URL: http://source.winehq.org/git/wine.git/?a=commit;h=2ce06e57278ae749dc14400f77...
Author: Nikolay Sivov nsivov@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);