[PATCH 2/2] ole2disp: Implement SafeArrayAllocData()
Nikolay Sivov
nsivov at codeweavers.com
Tue Jan 12 02:49:30 CST 2016
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
For https://bugs.winehq.org/show_bug.cgi?id=7938
dlls/ole2disp.dll16/ole2disp.c | 34 +++++++++++++++++++++++++++++++++
dlls/ole2disp.dll16/ole2disp.dll16.spec | 2 +-
2 files changed, 35 insertions(+), 1 deletion(-)
diff --git a/dlls/ole2disp.dll16/ole2disp.c b/dlls/ole2disp.dll16/ole2disp.c
index 539b515..5831d86 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]
*/
@@ -96,6 +113,23 @@ HRESULT WINAPI SafeArrayAllocDescriptor16(UINT16 dims, SEGPTR *ret)
}
/******************************************************************************
+ * 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]
*/
HRESULT WINAPI SafeArrayDestroyDescriptor16(SEGPTR s)
diff --git a/dlls/ole2disp.dll16/ole2disp.dll16.spec b/dlls/ole2disp.dll16/ole2disp.dll16.spec
index 997de31..919583d 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
--
2.6.4
More information about the wine-patches
mailing list