ole2disp: Implement SafeArrayAllocData().

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2016-01-12 11:49:30 +03:00 committed by Alexandre Julliard
parent 1529f082e6
commit beceaa82ca
2 changed files with 35 additions and 1 deletions

View File

@ -72,6 +72,23 @@ static void safearray_free(SEGPTR ptr)
WOWGlobalUnlockFree16(ptr);
}
static ULONG safearray_getcellcount(const SAFEARRAY16 *sa)
{
const SAFEARRAYBOUND16 *sab = sa->rgsabound;
USHORT count = sa->cDims;
ULONG cells = 1;
while (count--)
{
if (!sab->cElements)
return 0;
cells *= sab->cElements;
sab++;
}
return cells;
}
/******************************************************************************
* SafeArrayAllocDescriptor [OLE2DISP.38]
*/
@ -95,6 +112,23 @@ HRESULT WINAPI SafeArrayAllocDescriptor16(UINT16 dims, SEGPTR *ret)
return S_OK;
}
/******************************************************************************
* SafeArrayAllocData [OLE2DISP.39]
*/
HRESULT WINAPI SafeArrayAllocData16(SAFEARRAY16 *sa)
{
ULONG size;
TRACE("%p\n", sa);
if (!sa)
return E_INVALIDARG16;
size = safearray_getcellcount(sa);
sa->pvData = safearray_alloc(size * sa->cbElements);
return sa->pvData ? S_OK : E_OUTOFMEMORY16;
}
/******************************************************************************
* SafeArrayDestroyDescriptor [OLE2DISP.40]
*/

View File

@ -36,7 +36,7 @@
36 stub REVOKEACTIVEOBJECT
37 stub GETACTIVEOBJECT
38 pascal SafeArrayAllocDescriptor(word ptr) SafeArrayAllocDescriptor16
39 stub SAFEARRAYALLOCDATA
39 pascal SafeArrayAllocData(ptr) SafeArrayAllocData16
40 pascal SafeArrayDestroyDescriptor(segptr) SafeArrayDestroyDescriptor16
41 stub SAFEARRAYDESTROYDATA
42 stub SAFEARRAYREDIM