Typelib marshalling BSTRs

Ove Kaaven ovek at arcticnet.no
Thu Jul 24 07:47:51 CDT 2003

ons, 23.07.2003 kl. 17.28 skrev Mike Hearn:
> So, moving on from that problem, I think my woes (currently) are caused
> by the NDR engine not handling VT_DISPATCH variants.

Hmm. Oh yeah, I guess that could be a problem.

> that causes VARIANT_UserMarshal to skip doing anything special for
> VT_DISPATCH variants, when I think in reality, it should call
> NdrInterfacePointerMarshall (btw, what's up with two spellings of
> "marshal"?) to get the IDispatch* into the stream.

You can't call NdrInterfacePointerMarshall, it's a NDR-engine function
that depends on marshalling state that isn't available at this point.
You have to use CoMarshalInterface, but of course you need an IStream
interface to do this, which is probably why I haven't bothered to
implement it yet. You can probably copy the IStream-related code from
ndr_ole.c and adapt it for this situation. It may cause some code
duplication to do that, but perhaps this undocumented
WdtpInterfacePointer_UserMarshal mentioned elsewhere in this thread is
actually a common CoMarshalInterface-wrapping back-end used by both
NdrInterfacePointerMarshall and VARIANT_UserMarshal? In that case the
IStream stuff would be implemented there, and there'd be no code

As for the two spellings of marshal, I think the original DCE RPC
reference code (that MS-RPC was designed as a clone of) was the original
culprit, using the "marshall" spelling everywhere, and since Microsoft
adopted (embraced and extended) their API, they adopted their spelling
too. I assume the original DCE engineers were exactly that, just
engineers, not English majors (perhaps they got confused by the
unrelated noun (and name) marshall or something). Microsoft's OLE
department knew how to spell, though, so that's why we have
CoMarshalInterface in OLE, and Ndr*Marshall in MS-RPC.

More information about the wine-devel mailing list