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(a)gmail.com> wrote:
On 6/14/20 10:14 PM, Porot Mo wrote:
From: Porot Mo <porotmjp(a)gmail.com> Subject: [PATCH] rpcrt4: Fix getting underlying typeinfo of IDispatch. Message-Id: <CANeTpuED1rz3tizQsZNvffGku-DoH_hKq0gjzbWyfGZpmVzgAg(a)mail.gmail.com> Date: Mon, 15 Jun 2020 11:14:55 +0800
Signed-off-by: Porot Mo <porotmjp(a)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(a)gmail.com">porotmjp(a)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().