Huw Davies : oleaut32: Support VT_SAFEARRAY in the typelib marshaler.

Alexandre Julliard julliard at wine.codeweavers.com
Wed May 10 12:56:47 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 86d9457cdc0307e0594cd352c6c57c091e40d084
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=86d9457cdc0307e0594cd352c6c57c091e40d084

Author: Huw Davies <huw at codeweavers.com>
Date:   Wed May 10 12:11:22 2006 +0100

oleaut32: Support VT_SAFEARRAY in the typelib marshaler.

Based on a patch by Rob Shearman.

---

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

diff --git a/dlls/oleaut32/tmarshal.c b/dlls/oleaut32/tmarshal.c
index 0a6e939..139662d 100644
--- a/dlls/oleaut32/tmarshal.c
+++ b/dlls/oleaut32/tmarshal.c
@@ -42,6 +42,7 @@ #include "winreg.h"
 #include "winuser.h"
 
 #include "ole2.h"
+#include "propidl.h" /* for LPSAFEARRAY_User* functions */
 #include "typelib.h"
 #include "variant.h"
 #include "wine/debug.h"
@@ -802,6 +803,17 @@ serialize_param(
 	if (debugout) TRACE_(olerelay)("]");
 	return S_OK;
     }
+    case VT_SAFEARRAY: {
+        if (writeit)
+        {
+            unsigned long flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION);
+            unsigned long size = LPSAFEARRAY_UserSize(&flags, buf->curoff, (LPSAFEARRAY *)arg);
+            xbuf_resize(buf, size);
+            LPSAFEARRAY_UserMarshal(&flags, buf->base + buf->curoff, (LPSAFEARRAY *)arg);
+            buf->curoff = size;
+        }
+        return S_OK;
+    }
     default:
 	ERR("Unhandled marshal type %d.\n",tdesc->vt);
 	return S_OK;
@@ -1131,6 +1143,16 @@ deserialize_param(
 		);
 	    return S_OK;
 	}
+    case VT_SAFEARRAY: {
+	    if (readit)
+	    {
+		unsigned long flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION);
+		unsigned char *buffer;
+		buffer = LPSAFEARRAY_UserUnmarshal(&flags, buf->base + buf->curoff, (LPSAFEARRAY *)arg);
+		buf->curoff = buffer - buf->base;
+	    }
+	    return S_OK;
+	}
 	default:
 	    ERR("No handler for VT type %d!\n",tdesc->vt);
 	    return S_OK;




More information about the wine-cvs mailing list