Alexandre Julliard : oleaut32: Fix safe array marshalling on 64-bit.

Alexandre Julliard julliard at winehq.org
Mon Jul 13 07:54:49 CDT 2009


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Jul 10 19:13:27 2009 +0200

oleaut32: Fix safe array marshalling on 64-bit.

---

 dlls/oleaut32/usrmarshal.c |   22 +++++++++++-----------
 1 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/dlls/oleaut32/usrmarshal.c b/dlls/oleaut32/usrmarshal.c
index 1e20c3c..3172eba 100644
--- a/dlls/oleaut32/usrmarshal.c
+++ b/dlls/oleaut32/usrmarshal.c
@@ -232,7 +232,7 @@ static unsigned int get_type_size(ULONG *pFlags, VARTYPE vt)
     case VT_DECIMAL:
         return sizeof(DECIMAL);
     case VT_BSTR:
-        return sizeof(BSTR);
+        return sizeof(ULONG);
     case VT_VARIANT:
         return sizeof(VARIANT);
     case VT_UNKNOWN:
@@ -764,7 +764,7 @@ ULONG WINAPI LPSAFEARRAY_UserSize(ULONG *pFlags, ULONG StartingSize, LPSAFEARRAY
         HRESULT hr;
 
         size += sizeof(ULONG);
-        size += FIELD_OFFSET(struct _wireSAFEARRAY, uArrayStructs);
+        size += 2 * sizeof(USHORT) + 2 * sizeof(ULONG);
 
         sftype = SAFEARRAY_GetUnionType(psa);
         size += sizeof(ULONG);
@@ -850,23 +850,23 @@ unsigned char * WINAPI LPSAFEARRAY_UserMarshal(ULONG *pFlags, unsigned char *Buf
         VARTYPE vt;
         SAFEARRAY *psa = *ppsa;
         ULONG ulCellCount = SAFEARRAY_GetCellCount(psa);
-        wireSAFEARRAY wiresa;
         SF_TYPE sftype;
         GUID guid;
 
         *(ULONG *)Buffer = psa->cDims;
         Buffer += sizeof(ULONG);
-        wiresa = (wireSAFEARRAY)Buffer;
-        wiresa->cDims = psa->cDims;
-        wiresa->fFeatures = psa->fFeatures;
-        wiresa->cbElements = psa->cbElements;
+        *(USHORT *)Buffer = psa->cDims;
+        Buffer += sizeof(USHORT);
+        *(USHORT *)Buffer = psa->fFeatures;
+        Buffer += sizeof(USHORT);
+        *(ULONG *)Buffer = psa->cbElements;
+        Buffer += sizeof(ULONG);
 
         hr = SafeArrayGetVartype(psa, &vt);
         if (FAILED(hr)) vt = 0;
 
-        wiresa->cLocks = (USHORT)psa->cLocks | (vt << 16);
-
-        Buffer += FIELD_OFFSET(struct _wireSAFEARRAY, uArrayStructs);
+        *(ULONG *)Buffer = (USHORT)psa->cLocks | (vt << 16);
+        Buffer += sizeof(ULONG);
 
         sftype = SAFEARRAY_GetUnionType(psa);
         *(ULONG *)Buffer = sftype;
@@ -987,7 +987,7 @@ unsigned char * WINAPI LPSAFEARRAY_UserUnmarshal(ULONG *pFlags, unsigned char *B
     Buffer += sizeof(ULONG);
 
     wiresa = (wireSAFEARRAY)Buffer;
-    Buffer += FIELD_OFFSET(struct _wireSAFEARRAY, uArrayStructs);
+    Buffer += 2 * sizeof(USHORT) + 2 * sizeof(ULONG);
 
     if (cDims != wiresa->cDims)
         RpcRaiseException(RPC_S_INVALID_BOUND);




More information about the wine-cvs mailing list