oleaut32: Fix SafeArrayPutElement() for FADF_RECORD arrays.

This commit is contained in:
Nikolay Sivov 2014-02-24 08:15:21 +04:00 committed by Alexandre Julliard
parent 2ba5cdd3f6
commit a4e0fc95a9
2 changed files with 42 additions and 15 deletions

View File

@ -898,23 +898,27 @@ HRESULT WINAPI SafeArrayPutElement(SAFEARRAY *psa, LONG *rgIndices, void *pvData
if (!*lpDest) if (!*lpDest)
hRet = E_OUTOFMEMORY; hRet = E_OUTOFMEMORY;
} }
else else if (psa->fFeatures & (FADF_UNKNOWN|FADF_DISPATCH))
{ {
if (psa->fFeatures & (FADF_UNKNOWN|FADF_DISPATCH)) IUnknown *lpUnknown = pvData;
{ IUnknown **lpDest = lpvDest;
LPUNKNOWN lpUnknown = pvData;
LPUNKNOWN *lpDest = lpvDest;
if (lpUnknown) if (lpUnknown)
IUnknown_AddRef(lpUnknown); IUnknown_AddRef(lpUnknown);
if (*lpDest) if (*lpDest)
IUnknown_Release(*lpDest); IUnknown_Release(*lpDest);
*lpDest = lpUnknown; *lpDest = lpUnknown;
} else {
/* Copy the data over */
memcpy(lpvDest, pvData, psa->cbElements);
}
} }
else if (psa->fFeatures & FADF_RECORD)
{
IRecordInfo *record;
SafeArrayGetRecordInfo(psa, &record);
hRet = IRecordInfo_RecordCopy(record, pvData, lpvDest);
IRecordInfo_Release(record);
} else
/* Copy the data over */
memcpy(lpvDest, pvData, psa->cbElements);
} }
SafeArrayUnlock(psa); SafeArrayUnlock(psa);
} }

View File

@ -1062,10 +1062,11 @@ test_LockUnlock_Vector:
static void test_SafeArrayGetPutElement(void) static void test_SafeArrayGetPutElement(void)
{ {
SAFEARRAYBOUND sab[4]; SAFEARRAYBOUND sab[4];
LONG indices[NUM_DIMENSIONS]; LONG indices[NUM_DIMENSIONS], index;
SAFEARRAY *sa; SAFEARRAY *sa;
HRESULT hres; HRESULT hres;
int value = 0, gotvalue, dimension; int value = 0, gotvalue, dimension;
IRecordInfoImpl *irec;
unsigned int x,y,z,a; unsigned int x,y,z,a;
for (dimension = 0; dimension < NUM_DIMENSIONS; dimension++) for (dimension = 0; dimension < NUM_DIMENSIONS; dimension++)
@ -1184,6 +1185,28 @@ static void test_SafeArrayGetPutElement(void)
} }
hres = SafeArrayDestroy(sa); hres = SafeArrayDestroy(sa);
ok(hres == S_OK, "got 0x%08x\n", hres); ok(hres == S_OK, "got 0x%08x\n", hres);
/* VT_RECORD array */
irec = IRecordInfoImpl_Construct();
irec->ref = 1;
sab[0].lLbound = 0;
sab[0].cElements = 8;
sa = pSafeArrayCreateEx(VT_RECORD, 1, sab, &irec->IRecordInfo_iface);
ok(sa != NULL, "failed to create array\n");
ok(irec->ref == 2, "got %d\n", irec->ref);
index = 0;
irec->recordcopy = 0;
hres = SafeArrayPutElement(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);
IRecordInfo_Release(&irec->IRecordInfo_iface);
} }
static void test_SafeArrayGetPutElement_BSTR(void) static void test_SafeArrayGetPutElement_BSTR(void)