Invoke with IDispatch* params
Mike Hearn
mike at theoretic.com
Wed Jul 23 08:49:55 CDT 2003
On Wed, 2003-07-23 at 12:11, Ove Kaaven wrote:
> ons, 23.07.2003 kl. 12.02 skrev Mike Hearn:
> > Hi, more questions (i'll master COM yet :)
> >
> > HRESULT IWebBrowser2::get_Document(IDispatch **ppDisp);
>
> Hmm. I assume this is an argument marked [out].
I don't have the IDL unfortunately, but I think that must be correct.
It's access via IDispatch as a property at any rate.
> OLE Automation isn't going to provide a ppDisp. When it's [out], it's
> the IWebBrowser2 object implementation (not OLE Automation) that's
> supposed to write a valid interface pointer (or maybe NULL) to *ppDisp,
> after which the typelib marshaller will marshal the interface back to
> the caller. (And of course, when it's [in], it's the caller that's
> supposed to provide a valid interface pointer.)
Yes, I see now, that makes sense.
> If the IWebBrowser2 method that's invoked doesn't return an interface,
> it's either a bug in the IWebBrowser2 implementation, it failed for some
> reason, or perhaps the wrong method was invoked. Or something, I don't
> know the exact situation you have.
This comment in the code concerns me:
/*FIXME: give pointers for the rest, so propertyget works*/
well, this is indeed a property get, so the result should be made
available in pVarResult.
This code looked promising:
/* If pointer to variant, pass reference it. */
if ((tdesc->vt == VT_PTR) && (tdesc->u.lptdesc->vt == VT_VARIANT) &&
pVarResult) {
args[argspos] = (DWORD)pVarResult;
}
so I copied it for the VT_DISPATCH case, but no cigar, it crashes later
on in the marshalling code (in VariantClear). Am I at least on the right
track? It seems not everything for property gets is implemented yet.
thanks -mike (i owe you about a million beers already :)
More information about the wine-devel
mailing list