Huw Davies : oleaut32:
Handle marshaling of VARTYPE-less FADF_VARIANT safearrays.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Jun 25 07:28:02 CDT 2007
Module: wine
Branch: master
Commit: da98b1cb61fac63b5c1c088443264e8350738bd5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=da98b1cb61fac63b5c1c088443264e8350738bd5
Author: Huw Davies <huw at codeweavers.com>
Date: Fri Jun 22 15:10:04 2007 +0100
oleaut32: Handle marshaling of VARTYPE-less FADF_VARIANT safearrays.
---
dlls/oleaut32/tests/usrmarshal.c | 25 +++++++++++++++++++++++++
dlls/oleaut32/usrmarshal.c | 2 ++
2 files changed, 27 insertions(+), 0 deletions(-)
diff --git a/dlls/oleaut32/tests/usrmarshal.c b/dlls/oleaut32/tests/usrmarshal.c
index 5989c1d..21714c4 100644
--- a/dlls/oleaut32/tests/usrmarshal.c
+++ b/dlls/oleaut32/tests/usrmarshal.c
@@ -49,6 +49,8 @@ static inline SF_TYPE get_union_type(SAFEARRAY *psa)
hr = SafeArrayGetVartype(psa, &vt);
if (FAILED(hr))
{
+ if(psa->fFeatures & FADF_VARIANT) return SF_VARIANT;
+
switch(psa->cbElements)
{
case 1: vt = VT_I1; break;
@@ -264,6 +266,29 @@ static void test_marshal_LPSAFEARRAY(void)
HeapFree(GetProcessHeap(), 0, buffer);
SafeArrayDestroyData(lpsa);
SafeArrayDestroyDescriptor(lpsa);
+
+ /* VARTYPE-less arrays with FADF_VARIANT */
+ hr = SafeArrayAllocDescriptor(1, &lpsa);
+ ok(hr == S_OK, "saad failed %08x\n", hr);
+ lpsa->cbElements = 16;
+ lpsa->fFeatures = FADF_VARIANT;
+ lpsa->rgsabound[0].lLbound = 2;
+ lpsa->rgsabound[0].cElements = 48;
+ hr = SafeArrayAllocData(lpsa);
+ ok(hr == S_OK, "saad failed %08x\n", hr);
+
+ hr = SafeArrayGetVartype(lpsa, &vt);
+ ok(hr == E_INVALIDARG, "ret %08x\n", hr);
+
+ size = LPSAFEARRAY_UserSize(&umcb.Flags, 0, &lpsa);
+ todo_wine
+ ok(size == 1388, "size %ld\n", size);
+ buffer = (unsigned char *)HeapAlloc(GetProcessHeap(), 0, size);
+ LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa);
+ check_safearray(buffer, lpsa);
+ HeapFree(GetProcessHeap(), 0, buffer);
+ SafeArrayDestroyData(lpsa);
+ SafeArrayDestroyDescriptor(lpsa);
}
static void check_bstr(void *buffer, BSTR b)
diff --git a/dlls/oleaut32/usrmarshal.c b/dlls/oleaut32/usrmarshal.c
index 25f831a..67faf20 100644
--- a/dlls/oleaut32/usrmarshal.c
+++ b/dlls/oleaut32/usrmarshal.c
@@ -711,6 +711,8 @@ static inline SF_TYPE SAFEARRAY_GetUnionType(SAFEARRAY *psa)
hr = SafeArrayGetVartype(psa, &vt);
if (FAILED(hr))
{
+ if(psa->fFeatures & FADF_VARIANT) return SF_VARIANT;
+
switch(psa->cbElements)
{
case 1: vt = VT_I1; break;
More information about the wine-cvs
mailing list