>From 5f8b1eb5cc43e4310f5d19ed979c01d6e11ad0d7 Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes Date: Wed, 12 Aug 2009 10:52:46 +1000 Subject: [PATCH] Add IDispatchEx support to IXMLDOMElement To: wine-patches --- dlls/msxml3/element.c | 23 +++++++++++++++++++++++ dlls/msxml3/tests/domdoc.c | 10 ++++++++++ 2 files changed, 33 insertions(+), 0 deletions(-) diff --git a/dlls/msxml3/element.c b/dlls/msxml3/element.c index 4f0bce9..8a24033 100644 --- a/dlls/msxml3/element.c +++ b/dlls/msxml3/element.c @@ -29,6 +29,7 @@ #include "winnls.h" #include "ole2.h" #include "msxml2.h" +#include "dispex.h" #include "msxml_private.h" @@ -46,6 +47,9 @@ typedef struct _domelem LONG ref; IUnknown *node_unk; IXMLDOMNode *node; + + /* IDispatchEx */ + DispatchEx dispex; } domelem; static inline domelem *impl_from_IXMLDOMElement( IXMLDOMElement *iface ) @@ -746,6 +750,10 @@ static HRESULT WINAPI Internal_QueryInterface( { return IUnknown_QueryInterface(This->node_unk, riid, ppvObject); } + else if(dispex_query_interface(&This->dispex, riid, ppvObject)) + { + return *ppvObject ? S_OK : E_NOINTERFACE; + } else { FIXME("interface %s not implemented\n", debugstr_guid(riid)); @@ -787,6 +795,18 @@ static const struct IUnknownVtbl internal_unk_vtbl = Internal_Release }; +static const tid_t domelem_iface_tids[] = { + IXMLDOMNode_tid, + IXMLDOMElement_tid, + 0 +}; +static dispex_static_data_t domelem_dispex = { + NULL, + IXMLDOMElement_tid, + NULL, + domelem_iface_tids +}; + IUnknown* create_element( xmlNodePtr element, IUnknown *pUnkOuter ) { domelem *This; @@ -819,6 +839,9 @@ IUnknown* create_element( xmlNodePtr element, IUnknown *pUnkOuter ) HeapFree( GetProcessHeap(), 0, This ); return NULL; } + + init_dispex(&This->dispex, (IUnknown*)&This->lpVtbl, &domelem_dispex); + /* The ref on This->node is actually looped back into this object, so release it */ IXMLDOMNode_Release(This->node); diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index c69825c..3bed9c3 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -1974,6 +1974,16 @@ static void test_removeChild(void) r = IXMLDOMElement_QueryInterface( lc_node, &IID_IXMLDOMElement, (LPVOID*)&lc_element ); ok( r == S_OK, "ret %08x\n", r); + if(r == S_OK) + { + IDispatchEx *dispex; + r = IXMLDOMElement_QueryInterface( lc_element, &IID_IDispatchEx, (LPVOID*)&dispex ); + ok( r == S_OK, "ret %08x\n", r); + if(r == S_OK) + { + IDispatchEx_Release(dispex); + } + } /* MS quirk: passing wrong interface pointer works, too */ r = IXMLDOMElement_removeChild( element, (IXMLDOMNode*)lc_element, NULL ); -- 1.6.2.5