[PATCH] rpcrt4: Fix getting underlying typeinfo of IDispatch.

Porot Mo porotmjp at gmail.com
Mon Jun 15 22:01:41 CDT 2020


Yes, You are correct. I mix up with old code base. There is no need to
check wTypeFlags here as non-dual IDispatch should never come to here

On Mon, 15 Jun 2020 at 22:52, Zebediah Figura <z.figura12 at gmail.com> wrote:
>
> On 6/14/20 10:14 PM, Porot Mo wrote:
> > From: Porot Mo <porotmjp at gmail.com>
> > Subject: [PATCH] rpcrt4: Fix getting underlying typeinfo of IDispatch.
> > Message-Id: <CANeTpuED1rz3tizQsZNvffGku-DoH_hKq0gjzbWyfGZpmVzgAg at mail.gmail.com>
> > Date: Mon, 15 Jun 2020 11:14:55 +0800
> >
> > Signed-off-by: Porot Mo <porotmjp at gmail.com>
> > ---
>
> The commit message here could be more specific (in general, "fix X" is
> never a great message).
>
> >  dlls/rpcrt4/ndr_typelib.c | 8 +++++++-
> >  1 file changed, 7 insertions(+), 1 deletion(-)
> >
> > <div dir="ltr">Signed-off-by: Porot Mo <<a href="mailto:porotmjp at gmail.com">porotmjp at gmail.com</a>><br>---<br> dlls/rpcrt4/ndr_typelib.c | 8 +++++++-<br> 1 file changed, 7 insertions(+), 1 deletion(-)<br></div>
> >
> > diff --git a/dlls/rpcrt4/ndr_typelib.c b/dlls/rpcrt4/ndr_typelib.c
> > index f1f2588..9365e0b 100644
> > --- a/dlls/rpcrt4/ndr_typelib.c
> > +++ b/dlls/rpcrt4/ndr_typelib.c
> > @@ -1229,6 +1229,7 @@ static HRESULT get_iface_info(ITypeInfo *typeinfo, WORD *funcs, WORD *parentfunc
> >      HREFTYPE reftype;
> >      SYSKIND syskind;
> >      HRESULT hr;
> > +    WORD typeflags;
> >
> >      /* Dual interfaces report their size to be sizeof(IDispatchVtbl) and their
> >       * implemented type to be IDispatch. We need to retrieve the underlying
> > @@ -1237,10 +1238,15 @@ static HRESULT get_iface_info(ITypeInfo *typeinfo, WORD *funcs, WORD *parentfunc
> >      if (FAILED(hr))
> >          return hr;
> >      typekind = typeattr->typekind;
> > +    typeflags = typeattr->wTypeFlags;
> >      ITypeInfo_ReleaseTypeAttr(typeinfo, typeattr);
> >      if (typekind == TKIND_DISPATCH)
> >      {
> > -        hr = ITypeInfo_GetRefTypeOfImplType(typeinfo, -1, &reftype);
> > +        if (typeflags & TYPEFLAG_FDUAL)
> > +            hr = ITypeInfo_GetRefTypeOfImplType(typeinfo, -1, &reftype);
> > +        else
> > +            hr = ITypeInfo_GetRefTypeOfImplType(typeinfo, 0, &reftype);
> > +
> >          if (FAILED(hr))
> >              return hr;
> >
> >
>
> How are you getting here? I don't think a non-dual dispinterface should
> go through the typelib marshaller in the first place; it should use the
> IDispatch proxy. See e.g. dispatch_typelib_ps_CreateProxy().
>



More information about the wine-devel mailing list