Jeremy White : oleaut32: Implement the ability to marshall VT_CARRAY' s of user defined types.

Alexandre Julliard julliard at winehq.org
Mon Oct 26 10:08:32 CDT 2009


Module: wine
Branch: master
Commit: b8d7088e88d7c077c0c4ad1b2c4d7f3503e2806a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b8d7088e88d7c077c0c4ad1b2c4d7f3503e2806a

Author: Jeremy White <jwhite at codeweavers.com>
Date:   Sat Oct 24 17:29:02 2009 -0500

oleaut32: Implement the ability to marshall VT_CARRAY's of user defined types.

---

 dlls/oleaut32/tests/tmarshal.c |    2 --
 dlls/oleaut32/tmarshal.c       |    5 +++--
 dlls/oleaut32/typelib.c        |    2 +-
 3 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/dlls/oleaut32/tests/tmarshal.c b/dlls/oleaut32/tests/tmarshal.c
index 9b14613..c9ea77d 100644
--- a/dlls/oleaut32/tests/tmarshal.c
+++ b/dlls/oleaut32/tests/tmarshal.c
@@ -1078,9 +1078,7 @@ static void test_typelibmarshal(void)
     mystruct = MYSTRUCT_BYPTR;
     memcpy(mystructArray, MYSTRUCT_ARRAY, sizeof(mystructArray));
     hr = IWidget_StructArgs(pWidget, MYSTRUCT_BYVAL, &mystruct, mystructArray);
-    todo_wine {
     ok_ole_success(hr, IWidget_StructArgs);
-    }
 
     /* call Clone */
     dispparams.cNamedArgs = 0;
diff --git a/dlls/oleaut32/tmarshal.c b/dlls/oleaut32/tmarshal.c
index e7d7b89..b3d1734 100644
--- a/dlls/oleaut32/tmarshal.c
+++ b/dlls/oleaut32/tmarshal.c
@@ -888,7 +888,7 @@ serialize_param(
 	if (debugout) TRACE_(olerelay)("(vt %s)",debugstr_vt(adesc->tdescElem.vt));
 	if (debugout) TRACE_(olerelay)("[");
 	for (i=0;i<arrsize;i++) {
-	    hres = serialize_param(tinfo, writeit, debugout, dealloc, &adesc->tdescElem, (DWORD*)((LPBYTE)arg+i*_xsize(&adesc->tdescElem, tinfo)), buf);
+	    hres = serialize_param(tinfo, writeit, debugout, dealloc, &adesc->tdescElem, (DWORD*)((LPBYTE)(*arg)+i*_xsize(&adesc->tdescElem, tinfo)), buf);
 	    if (hres)
 		return hres;
 	    if (debugout && (i<arrsize-1)) TRACE_(olerelay)(",");
@@ -1247,6 +1247,7 @@ deserialize_param(
 	    if (adesc->cDims > 1) FIXME("cDims > 1 in VT_CARRAY. Does it work?\n");
 	    for (i=0;i<adesc->cDims;i++)
 		arrsize *= adesc->rgbounds[i].cElements;
+	    *arg=(DWORD)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,_xsize(tdesc->u.lptdesc, tinfo) * arrsize);
 	    for (i=0;i<arrsize;i++)
 		deserialize_param(
 		    tinfo,
@@ -1254,7 +1255,7 @@ deserialize_param(
 		    debugout,
 		    alloc,
 		    &adesc->tdescElem,
-		    (DWORD*)((LPBYTE)(arg)+i*_xsize(&adesc->tdescElem, tinfo)),
+		    (DWORD*)((LPBYTE)(*arg)+i*_xsize(&adesc->tdescElem, tinfo)),
 		    buf
 		);
 	    return S_OK;
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 0bd9b19..9e25e77 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -2947,7 +2947,7 @@ static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength)
                 if(td[1]<0)
                     pTypeLibImpl->pTypeDesc[i].u.lpadesc->tdescElem.vt = td[0] & VT_TYPEMASK;
                 else
-                    pTypeLibImpl->pTypeDesc[i].u.lpadesc->tdescElem = stndTypeDesc[td[0]/8];
+                    pTypeLibImpl->pTypeDesc[i].u.lpadesc->tdescElem = cx.pLibInfo->pTypeDesc[td[0]/(2*sizeof(INT))];
 
                 pTypeLibImpl->pTypeDesc[i].u.lpadesc->cDims = td[2];
 




More information about the wine-cvs mailing list