[PATCH 1/2] oleaut32: Implement LPSAFEARRAY user marshal interface marshaling.
Nikolay Sivov
nsivov at codeweavers.com
Tue Nov 23 13:43:41 CST 2021
On 11/23/21 10:16 PM, Connor McAdams wrote:
> +static ULONG interface_safearray_size(ULONG *pFlags, ULONG Start, REFIID riid, IUnknown *punk)
> +{
> + TRACE("(%x,%d,%p)\n", *pFlags, Start, punk);
> + return Start + interface_variant_size(pFlags, riid, punk);
> +}
You might as well add "Start" parameter to interface_variant_size(), and
possibly rename it too, since it's no longer used only for variants.
> @@ -916,8 +956,21 @@ unsigned char * WINAPI LPSAFEARRAY_UserMarshal(ULONG *pFlags, unsigned char *Buf
> case SF_DISPATCH:
> case SF_UNKNOWN:
> case SF_HAVEIID:
> - FIXME("marshal interfaces\n");
> + {
> + IUnknown **lpUnk;
> +
> + for (lpUnk = psa->pvData; ulCellCount; ulCellCount--, lpUnk++)
> + {
> + if (sftype == SF_HAVEIID)
> + Buffer = interface_variant_marshal(pFlags, Buffer, &guid, *lpUnk);
> + else if (sftype == SF_UNKNOWN)
> + Buffer = interface_variant_marshal(pFlags, Buffer, &IID_IUnknown, *lpUnk);
> + else
> + Buffer = interface_variant_marshal(pFlags, Buffer, &IID_IDispatch, *lpUnk);
> + }
> +
> break;
> + }
sftype won't change between iterations, so you only need to set some
"GUID *" once, and use a single helper call.
> + {
> + IUnknown **lpUnk;
> +
> + for (lpUnk = (*ppsa)->pvData; cell_count; cell_count--, lpUnk++)
> + {
> + if (sftype == SF_HAVEIID)
> + Buffer = interface_variant_unmarshal(pFlags, Buffer, &guid, lpUnk);
> + else if (sftype == SF_UNKNOWN)
> + Buffer = interface_variant_unmarshal(pFlags, Buffer, &IID_IUnknown, lpUnk);
> + else
> + Buffer = interface_variant_unmarshal(pFlags, Buffer, &IID_IDispatch, lpUnk);
> + }
> +
> break;
> + }
Same.
> @@ -795,6 +819,22 @@ ULONG WINAPI LPSAFEARRAY_UserSize(ULONG *pFlags, ULONG StartingSize, LPSAFEARRAY
> case SF_DISPATCH:
> case SF_UNKNOWN:
> case SF_HAVEIID:
> + {
> + IUnknown **lpUnk;
> + GUID guid;
> +
> + if (sftype == SF_HAVEIID)
> + SafeArrayGetIID(psa, &guid);
> + else if (sftype == SF_UNKNOWN)
> + memcpy(&guid, &IID_IUnknown, sizeof(guid));
> + else
> + memcpy(&guid, &IID_IDispatch, sizeof(guid));
> +
> + for (lpUnk = psa->pvData; ulCellCount; ulCellCount--, lpUnk++)
> + size = interface_safearray_size(pFlags, size, &guid, *lpUnk);
> +
> + break;
> + }
> FIXME("size interfaces\n");
> break;
FIXME should be removed now that you implement this part.
More information about the wine-devel
mailing list