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)
|
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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue