Hi, Was there anything wrong with this patch? Dont commit this patch if nothing is wrong. I will submit a series of patches, that will include these changes.
Best Regards Alistair Leslie-Hughes "Alistair Leslie-Hughes" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED] > Hi, > > Fixes bug http://bugs.winehq.org/show_bug.cgi?id=11257 > > Changelog: > msxml3: Implement IXMLDOMDocument IDispatch interface > > Best Regards > Alistair Leslie-Hughes > -------------------------------------------------------------------------------- > From 7cc5228684ed6d9aaace829cc1b8ebb43e5f4325 Mon Sep 17 00:00:00 2001 > From: Alistair Leslie-Hughes <[EMAIL PROTECTED]> > Date: Fri, 25 Jan 2008 22:34:36 +1100 > Subject: [PATCH] Implement IXMLDOMDocument IDispatch interface > To: wine-patches <[EMAIL PROTECTED]> > > --- > dlls/msxml3/domdoc.c | 53 +++++++++++++++++++++++++++++++++------ > dlls/msxml3/main.c | 58 > +++++++++++++++++++++++++++++++++++++++++++ > dlls/msxml3/msxml_private.h | 8 ++++++ > 3 files changed, 111 insertions(+), 8 deletions(-) > > diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c > index 06388c8..9d6b94b 100644 > --- a/dlls/msxml3/domdoc.c > +++ b/dlls/msxml3/domdoc.c > @@ -416,16 +416,29 @@ static ULONG WINAPI domdoc_Release( > > static HRESULT WINAPI domdoc_GetTypeInfoCount( IXMLDOMDocument2 *iface, > UINT* pctinfo ) > { > - FIXME("\n"); > - return E_NOTIMPL; > + domdoc *This = impl_from_IXMLDOMDocument2( iface ); > + > + TRACE("(%p)->(%p)\n", This, pctinfo); > + > + *pctinfo = 1; > + > + return S_OK; > } > > static HRESULT WINAPI domdoc_GetTypeInfo( > IXMLDOMDocument2 *iface, > UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo ) > { > - FIXME("\n"); > - return E_NOTIMPL; > + domdoc *This = impl_from_IXMLDOMDocument2( iface ); > + HRESULT hr; > + > + TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo); > + > + hr = get_typeinfo(IXMLDOMDocument2_tid, ppTInfo); > + if(SUCCEEDED(hr)) > + ITypeInfo_AddRef(*ppTInfo); > + > + return hr; > } > > static HRESULT WINAPI domdoc_GetIDsOfNames( > @@ -436,8 +449,21 @@ static HRESULT WINAPI domdoc_GetIDsOfNames( > LCID lcid, > DISPID* rgDispId) > { > - FIXME("\n"); > - return E_NOTIMPL; > + domdoc *This = impl_from_IXMLDOMDocument2( iface ); > + ITypeInfo *typeinfo; > + HRESULT hr; > + > + TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), > rgszNames, cNames, > + lcid, rgDispId); > + > + if(!rgszNames || cNames == 0 || !rgDispId) > + return E_INVALIDARG; > + > + hr = get_typeinfo(IXMLDOMDocument2_tid, &typeinfo); > + if(SUCCEEDED(hr)) > + hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, > rgDispId); > + > + return hr; > } > > > @@ -452,8 +478,19 @@ static HRESULT WINAPI domdoc_Invoke( > EXCEPINFO* pExcepInfo, > UINT* puArgErr) > { > - FIXME("\n"); > - return E_NOTIMPL; > + domdoc *This = impl_from_IXMLDOMDocument2( iface ); > + ITypeInfo *typeinfo; > + HRESULT hr; > + > + TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, > debugstr_guid(riid), > + lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); > + > + hr = get_typeinfo(IXMLDOMDocument2_tid, &typeinfo); > + if(SUCCEEDED(hr)) > + hr = ITypeInfo_Invoke(typeinfo, &(This->lpVtbl), dispIdMember, > wFlags, pDispParams, > + pVarResult, pExcepInfo, puArgErr); > + > + return hr; > } > > > diff --git a/dlls/msxml3/main.c b/dlls/msxml3/main.c > index 62bf2b5..41afbe6 100644 > --- a/dlls/msxml3/main.c > +++ b/dlls/msxml3/main.c > @@ -21,6 +21,8 @@ > > #include "config.h" > > +#define COBJMACROS > + > #include <stdarg.h> > #include "windef.h" > #include "winbase.h" > @@ -34,6 +36,61 @@ > > WINE_DEFAULT_DEBUG_CHANNEL(msxml); > > + > +static ITypeLib *typelib; > +static ITypeInfo *typeinfos[LAST_tid]; > + > +static REFIID tid_ids[] = { > + &IID_IXMLDOMDocument2 > +}; > + > +HRESULT get_typeinfo(enum tid_t tid, ITypeInfo **typeinfo) > +{ > + HRESULT hres; > + > + if(!typelib) { > + ITypeLib *tl; > + > + hres = LoadRegTypeLib(&LIBID_MSXML2, 3, 0, LOCALE_SYSTEM_DEFAULT, > &tl); > + if(FAILED(hres)) { > + ERR("LoadRegTypeLib failed: %08x\n", hres); > + return hres; > + } > + > + if(InterlockedCompareExchangePointer((void**)&typelib, tl, NULL)) > + ITypeLib_Release(tl); > + } > + > + if(!typeinfos[tid]) { > + ITypeInfo *typeinfo; > + > + hres = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], > &typeinfo); > + if(FAILED(hres)) { > + ERR("GetTypeInfoOfGuid failed: %08x\n", hres); > + return hres; > + } > + > + if(InterlockedCompareExchangePointer((void**)(typeinfos+tid), > typeinfo, NULL)) > + ITypeInfo_Release(typeinfo); > + } > + > + *typeinfo = typeinfos[tid]; > + return S_OK; > +} > + > +static void process_detach(void) > +{ > + if(typelib) { > + unsigned i; > + > + for(i=0; i < sizeof(typeinfos)/sizeof(*typeinfos); i++) > + if(typeinfos[i]) > + ITypeInfo_Release(typeinfos[i]); > + > + ITypeLib_Release(typelib); > + } > +} > + > HRESULT WINAPI DllCanUnloadNow(void) > { > FIXME("\n"); > @@ -53,6 +110,7 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD > fdwReason, LPVOID lpv) > case DLL_PROCESS_DETACH: > #ifdef HAVE_LIBXML2 > xmlCleanupParser(); > + process_detach(); > #endif > break; > } > diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h > index 8d79d2e..c7d97a1 100644 > --- a/dlls/msxml3/msxml_private.h > +++ b/dlls/msxml3/msxml_private.h > @@ -91,4 +91,12 @@ extern HRESULT DOMDocument_create( IUnknown *pUnkOuter, > LPVOID *ppObj ); > extern HRESULT SchemaCache_create( IUnknown *pUnkOuter, LPVOID *ppObj ); > extern HRESULT XMLDocument_create( IUnknown *pUnkOuter, LPVOID *ppObj ); > > +/* typelibs */ > +enum tid_t { > + IXMLDOMDocument2_tid, > + LAST_tid > +}; > + > +extern HRESULT get_typeinfo(enum tid_t tid, ITypeInfo **typeinfo); > + > #endif /* __MSXML_PRIVATE__ */ > -- > 1.5.3.7 > > -------------------------------------------------------------------------------- > >