Commit a4e0fc95 authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

oleaut32: Fix SafeArrayPutElement() for FADF_RECORD arrays.

parent 2ba5cdd3
......@@ -898,23 +898,27 @@ HRESULT WINAPI SafeArrayPutElement(SAFEARRAY *psa, LONG *rgIndices, void *pvData
if (!*lpDest)
hRet = E_OUTOFMEMORY;
}
else
else if (psa->fFeatures & (FADF_UNKNOWN|FADF_DISPATCH))
{
if (psa->fFeatures & (FADF_UNKNOWN|FADF_DISPATCH))
{
LPUNKNOWN lpUnknown = pvData;
LPUNKNOWN *lpDest = lpvDest;
if (lpUnknown)
IUnknown_AddRef(lpUnknown);
if (*lpDest)
IUnknown_Release(*lpDest);
*lpDest = lpUnknown;
} else {
/* Copy the data over */
memcpy(lpvDest, pvData, psa->cbElements);
}
IUnknown *lpUnknown = pvData;
IUnknown **lpDest = lpvDest;
if (lpUnknown)
IUnknown_AddRef(lpUnknown);
if (*lpDest)
IUnknown_Release(*lpDest);
*lpDest = lpUnknown;
}
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);
}
......
......@@ -1062,10 +1062,11 @@ test_LockUnlock_Vector:
static void test_SafeArrayGetPutElement(void)
{
SAFEARRAYBOUND sab[4];
LONG indices[NUM_DIMENSIONS];
LONG indices[NUM_DIMENSIONS], index;
SAFEARRAY *sa;
HRESULT hres;
int value = 0, gotvalue, dimension;
IRecordInfoImpl *irec;
unsigned int x,y,z,a;
for (dimension = 0; dimension < NUM_DIMENSIONS; dimension++)
......@@ -1184,6 +1185,28 @@ static void test_SafeArrayGetPutElement(void)
}
hres = SafeArrayDestroy(sa);
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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment