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