oleaut32: Fix SafeArrayPutElement() for FADF_RECORD arrays.
This commit is contained in:
parent
2ba5cdd3f6
commit
a4e0fc95a9
|
@ -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;
|
||||
IUnknown *lpUnknown = pvData;
|
||||
IUnknown **lpDest = lpvDest;
|
||||
|
||||
if (lpUnknown)
|
||||
IUnknown_AddRef(lpUnknown);
|
||||
if (*lpDest)
|
||||
IUnknown_Release(*lpDest);
|
||||
*lpDest = lpUnknown;
|
||||
} else {
|
||||
/* Copy the data over */
|
||||
memcpy(lpvDest, pvData, psa->cbElements);
|
||||
}
|
||||
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)
|
||||
|
|
Loading…
Reference in New Issue