Module: wine Branch: refs/heads/master Commit: 86d9457cdc0307e0594cd352c6c57c091e40d084 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=86d9457cdc0307e0594cd352...
Author: Huw Davies huw@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;