From 6ae3418aaf873b85f4508a8920e565d039e7b817 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Mon, 8 Oct 2012 15:00:50 +0200 Subject: [PATCH] mshtml: Return dispinterface from PHEventSink::QueryInterface. --- dlls/mshtml/pluginhost.c | 14 ++++++++++++++ dlls/mshtml/tests/activex.c | 5 +++++ 2 files changed, 19 insertions(+) diff --git a/dlls/mshtml/pluginhost.c b/dlls/mshtml/pluginhost.c index 0f68c25972b..4f088add084 100644 --- a/dlls/mshtml/pluginhost.c +++ b/dlls/mshtml/pluginhost.c @@ -485,6 +485,7 @@ struct PHEventSink { ITypeInfo *typeinfo; GUID iid; DWORD cookie; + BOOL is_dispiface; sink_entry_t *handlers; DWORD handlers_cnt; @@ -548,6 +549,9 @@ static HRESULT WINAPI PHEventSink_QueryInterface(IDispatch *iface, REFIID riid, }else if(IsEqualGUID(riid, &IID_IDispatch)) { TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); *ppv = &This->IDispatch_iface; + }else if(This->is_dispiface && IsEqualGUID(riid, &This->iid)) { + TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); + *ppv = &This->IDispatch_iface; }else { WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); *ppv = NULL; @@ -670,6 +674,7 @@ static PHEventSink *create_event_sink(PluginHost *plugin_host, ITypeInfo *typein PHEventSink *ret; IConnectionPoint *cp; TYPEATTR *typeattr; + TYPEKIND typekind; GUID guid; HRESULT hres; @@ -677,9 +682,17 @@ static PHEventSink *create_event_sink(PluginHost *plugin_host, ITypeInfo *typein if(FAILED(hres)) return NULL; + typekind = typeattr->typekind; guid = typeattr->guid; ITypeInfo_ReleaseTypeAttr(typeinfo, typeattr); + TRACE("guid %s typekind %d\n", debugstr_guid(&guid), typekind); + + if(typekind != TKIND_INTERFACE && typekind != TKIND_DISPATCH) { + WARN("invalid typekind %d\n", typekind); + return NULL; + } + hres = IUnknown_QueryInterface(plugin_host->plugin_unk, &IID_IConnectionPointContainer, (void**)&cp_container); if(FAILED(hres)) { WARN("Could not get IConnectionPointContainer iface: %08x\n", hres); @@ -699,6 +712,7 @@ static PHEventSink *create_event_sink(PluginHost *plugin_host, ITypeInfo *typein ret->ref = 1; ret->host = plugin_host; ret->iid = guid; + ret->is_dispiface = typekind == TKIND_DISPATCH; ITypeInfo_AddRef(typeinfo); ret->typeinfo = typeinfo; diff --git a/dlls/mshtml/tests/activex.c b/dlls/mshtml/tests/activex.c index e861d37548e..0bb2837491e 100644 --- a/dlls/mshtml/tests/activex.c +++ b/dlls/mshtml/tests/activex.c @@ -331,6 +331,7 @@ static HRESULT WINAPI ConnectionPoint_GetConnectionPointContainer(IConnectionPoi static HRESULT WINAPI ConnectionPoint_Advise(IConnectionPoint *iface, IUnknown *pUnkSink, DWORD *pdwCookie) { + DispActiveXTest *ax_test; IDispatchEx *dispex; HRESULT hres; @@ -342,6 +343,10 @@ static HRESULT WINAPI ConnectionPoint_Advise(IConnectionPoint *iface, IUnknown * hres = IUnknown_QueryInterface(pUnkSink, &IID_IDispatchEx, (void**)&dispex); ok(hres == E_NOINTERFACE, "QueryInterface(IID_IDispatchEx) returned: %08x\n", hres); + hres = IUnknown_QueryInterface(pUnkSink, &DIID_DispActiveXTest, (void**)&ax_test); + ok(hres == S_OK, "Could not get DispActiveXTest iface: %08x\n", hres); + DispActiveXTest_Release(ax_test); + *pdwCookie = 0xdeadbeef; return S_OK; }