diff --git a/dlls/ole2disp.dll16/ole2disp.c b/dlls/ole2disp.dll16/ole2disp.c index 539b515fc85..5831d8645e8 100644 --- a/dlls/ole2disp.dll16/ole2disp.c +++ b/dlls/ole2disp.dll16/ole2disp.c @@ -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] */ diff --git a/dlls/ole2disp.dll16/ole2disp.dll16.spec b/dlls/ole2disp.dll16/ole2disp.dll16.spec index 997de3171bd..919583da008 100644 --- a/dlls/ole2disp.dll16/ole2disp.dll16.spec +++ b/dlls/ole2disp.dll16/ole2disp.dll16.spec @@ -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