diff --git a/dlls/msxml3/Makefile.in b/dlls/msxml3/Makefile.in index ba4b68684db..acd571fdb74 100644 --- a/dlls/msxml3/Makefile.in +++ b/dlls/msxml3/Makefile.in @@ -35,7 +35,8 @@ C_SRCS = \ xdr.c \ xmldoc.c \ xmlelem.c \ - xmlparser.c + xmlparser.c \ + xmlview.c LEX_SRCS = xslpattern.l diff --git a/dlls/msxml3/factory.c b/dlls/msxml3/factory.c index 256bbbd877d..ba88910e657 100644 --- a/dlls/msxml3/factory.c +++ b/dlls/msxml3/factory.c @@ -91,7 +91,9 @@ static const struct clsid_version_t clsid_versions_table[] = { &CLSID_SAXAttributes, MSXML_DEFAULT }, { &CLSID_SAXAttributes30, MSXML3 }, { &CLSID_SAXAttributes40, MSXML4 }, - { &CLSID_SAXAttributes60, MSXML6 } + { &CLSID_SAXAttributes60, MSXML6 }, + + { &CLSID_XMLView, MSXML_DEFAULT } }; static MSXML_VERSION get_msxml_version(const GUID *clsid) @@ -281,6 +283,7 @@ static ClassFactory httpreqcf = { { &ClassFactoryVtbl }, XMLHTTPRequest_create } static ClassFactory xsltemplatecf = { { &ClassFactoryVtbl }, XSLTemplate_create }; static ClassFactory mxnsmanagercf = { {&ClassFactoryVtbl }, MXNamespaceManager_create }; static ClassFactory xmlparsercf = { { &ClassFactoryVtbl }, XMLParser_create }; +static ClassFactory xmlviewcf = { { &ClassFactoryVtbl }, XMLView_create }; /****************************************************************** * DllGetClassObject (MSXML3.@) @@ -371,6 +374,10 @@ HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, void **ppv ) { cf = &xmlparsercf.IClassFactory_iface; } + else if( IsEqualCLSID( rclsid, &CLSID_XMLView ) ) + { + cf = &xmlviewcf.IClassFactory_iface; + } if ( !cf ) return CLASS_E_CLASSNOTAVAILABLE; diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index 27c4d7f8221..2e647d07b25 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -459,6 +459,7 @@ extern HRESULT XSLTemplate_create(IUnknown*, void**) DECLSPEC_HIDDEN; extern HRESULT MXWriter_create(MSXML_VERSION, IUnknown*, void**) DECLSPEC_HIDDEN; extern HRESULT MXNamespaceManager_create(IUnknown*,void**) DECLSPEC_HIDDEN; extern HRESULT XMLParser_create(IUnknown*,void**) DECLSPEC_HIDDEN; +extern HRESULT XMLView_create(IUnknown*,void**) DECLSPEC_HIDDEN; static inline const CLSID* DOMDocument_version(MSXML_VERSION v) { diff --git a/dlls/msxml3/xmlparser.idl b/dlls/msxml3/xmlparser.idl index cff378bff69..a0ce97efd7a 100644 --- a/dlls/msxml3/xmlparser.idl +++ b/dlls/msxml3/xmlparser.idl @@ -364,3 +364,18 @@ coclass XMLParser30 { [default] interface IXMLParser; }; + +[ + helpstring("XML Document"), + threading(apartment), + uuid(48123bc4-99d9-11d1-a6b3-00c04fd91555), + progid("xmlfile"), + version(1.0) +] +coclass XMLView +{ + interface IPersistMoniker; + interface IPersistHistory; + interface IOleCommandTarget; + interface IOleObject; +} diff --git a/dlls/msxml3/xmlview.c b/dlls/msxml3/xmlview.c new file mode 100644 index 00000000000..1073450e46b --- /dev/null +++ b/dlls/msxml3/xmlview.c @@ -0,0 +1,535 @@ +/* + * Copyright 2012 Piotr Caban for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define COBJMACROS +#include "config.h" + +#include +#ifdef HAVE_LIBXML2 +#include +#endif + +#include "windef.h" +#include "winbase.h" +#include "ole2.h" +#include "msxml6.h" +#include "mshtml.h" +#include "perhist.h" +#include "docobj.h" + +#include "wine/debug.h" + +#include "msxml_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msxml); + +typedef struct +{ + IPersistMoniker IPersistMoniker_iface; + IPersistHistory IPersistHistory_iface; + IOleCommandTarget IOleCommandTarget_iface; + IOleObject IOleObject_iface; + + LONG ref; + + IUnknown *html_doc; +} XMLView; + +static inline XMLView* impl_from_IPersistMoniker(IPersistMoniker *iface) +{ + return CONTAINING_RECORD(iface, XMLView, IPersistMoniker_iface); +} + +static HRESULT WINAPI XMLView_PersistMoniker_QueryInterface( + IPersistMoniker *iface, REFIID riid, void **ppvObject) +{ + XMLView *This = impl_from_IPersistMoniker(iface); + + TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject); + + if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IPersistMoniker)) + *ppvObject = &This->IPersistMoniker_iface; + else if(IsEqualGUID(riid, &IID_IPersistHistory) || + IsEqualGUID(riid, &IID_IPersist)) + *ppvObject = &This->IPersistHistory_iface; + else if(IsEqualGUID(riid, &IID_IOleCommandTarget)) + *ppvObject = &This->IOleCommandTarget_iface; + else if(IsEqualGUID(riid, &IID_IOleObject)) + *ppvObject = &This->IOleObject_iface; + else + return IUnknown_QueryInterface(This->html_doc, riid, ppvObject); + + IPersistMoniker_AddRef(&This->IPersistMoniker_iface); + return S_OK; +} + +static ULONG WINAPI XMLView_PersistMoniker_AddRef(IPersistMoniker *iface) +{ + XMLView *This = impl_from_IPersistMoniker(iface); + LONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p)->(%d)\n", This, ref); + + return ref; +} + +static ULONG WINAPI XMLView_PersistMoniker_Release(IPersistMoniker *iface) +{ + XMLView *This = impl_from_IPersistMoniker(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p)->(%d)\n", This, ref); + + if(!ref) { + IUnknown_Release(This->html_doc); + heap_free(This); + } + return ref; +} + +static HRESULT WINAPI XMLView_PersistMoniker_GetClassID( + IPersistMoniker *iface, CLSID *pClassID) +{ + XMLView *This = impl_from_IPersistMoniker(iface); + FIXME("(%p)->(%p)\n", This, pClassID); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_PersistMoniker_IsDirty(IPersistMoniker *iface) +{ + XMLView *This = impl_from_IPersistMoniker(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_PersistMoniker_Load(IPersistMoniker *iface, + BOOL fFullyAvailable, IMoniker *pimkName, LPBC pibc, DWORD grfMode) +{ + XMLView *This = impl_from_IPersistMoniker(iface); + FIXME("(%p)->(%x %p %p %x)\n", This, fFullyAvailable, pimkName, pibc, grfMode); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_PersistMoniker_Save(IPersistMoniker *iface, + IMoniker *pimkName, LPBC pbc, BOOL fRemember) +{ + XMLView *This = impl_from_IPersistMoniker(iface); + FIXME("(%p)->(%p %p %x)\n", This, pimkName, pbc, fRemember); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_PersistMoniker_SaveCompleted( + IPersistMoniker *iface, IMoniker *pimkName, LPBC pibc) +{ + XMLView *This = impl_from_IPersistMoniker(iface); + FIXME("(%p)->(%p %p)\n", This, pimkName, pibc); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_PersistMoniker_GetCurMoniker( + IPersistMoniker *iface, IMoniker **ppimkName) +{ + XMLView *This = impl_from_IPersistMoniker(iface); + FIXME("(%p)->(%p)\n", This, ppimkName); + return E_NOTIMPL; +} + +static IPersistMonikerVtbl XMLView_PersistMonikerVtbl = { + XMLView_PersistMoniker_QueryInterface, + XMLView_PersistMoniker_AddRef, + XMLView_PersistMoniker_Release, + XMLView_PersistMoniker_GetClassID, + XMLView_PersistMoniker_IsDirty, + XMLView_PersistMoniker_Load, + XMLView_PersistMoniker_Save, + XMLView_PersistMoniker_SaveCompleted, + XMLView_PersistMoniker_GetCurMoniker +}; + +static inline XMLView* impl_from_IPersistHistory(IPersistHistory *iface) +{ + return CONTAINING_RECORD(iface, XMLView, IPersistHistory_iface); +} + +static HRESULT WINAPI XMLView_PersistHistory_QueryInterface( + IPersistHistory *iface, REFIID riid, void **ppvObject) +{ + XMLView *This = impl_from_IPersistHistory(iface); + return IPersistMoniker_QueryInterface(&This->IPersistMoniker_iface, riid, ppvObject); +} + +static ULONG WINAPI XMLView_PersistHistory_AddRef(IPersistHistory *iface) +{ + XMLView *This = impl_from_IPersistHistory(iface); + return IPersistMoniker_AddRef(&This->IPersistMoniker_iface); +} + +static ULONG WINAPI XMLView_PersistHistory_Release(IPersistHistory *iface) +{ + XMLView *This = impl_from_IPersistHistory(iface); + return IPersistMoniker_Release(&This->IPersistMoniker_iface); +} + +static HRESULT WINAPI XMLView_PersistHistory_GetClassID( + IPersistHistory *iface, CLSID *pClassID) +{ + XMLView *This = impl_from_IPersistHistory(iface); + FIXME("(%p)->(%p)\n", This, pClassID); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_PersistHistory_LoadHistory( + IPersistHistory *iface, IStream *pStream, IBindCtx *pbc) +{ + XMLView *This = impl_from_IPersistHistory(iface); + FIXME("(%p)->(%p %p)\n", This, pStream, pbc); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_PersistHistory_SaveHistory( + IPersistHistory *iface, IStream *pStream) +{ + XMLView *This = impl_from_IPersistHistory(iface); + FIXME("(%p)->(%p)\n", This, pStream); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_PersistHistory_SetPositionCookie( + IPersistHistory *iface, DWORD dwPositioncookie) +{ + XMLView *This = impl_from_IPersistHistory(iface); + FIXME("(%p)->(%d)\n", This, dwPositioncookie); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_PersistHistory_GetPositionCookie( + IPersistHistory *iface, DWORD *pdwPositioncookie) +{ + XMLView *This = impl_from_IPersistHistory(iface); + FIXME("(%p)->(%p)\n", This, pdwPositioncookie); + return E_NOTIMPL; +} + +static IPersistHistoryVtbl XMLView_PersistHistoryVtbl = { + XMLView_PersistHistory_QueryInterface, + XMLView_PersistHistory_AddRef, + XMLView_PersistHistory_Release, + XMLView_PersistHistory_GetClassID, + XMLView_PersistHistory_LoadHistory, + XMLView_PersistHistory_SaveHistory, + XMLView_PersistHistory_SetPositionCookie, + XMLView_PersistHistory_GetPositionCookie +}; + +static inline XMLView* impl_from_IOleCommandTarget(IOleCommandTarget *iface) +{ + return CONTAINING_RECORD(iface, XMLView, IOleCommandTarget_iface); +} + +static HRESULT WINAPI XMLView_OleCommandTarget_QueryInterface( + IOleCommandTarget *iface, REFIID riid, void **ppvObject) +{ + XMLView *This = impl_from_IOleCommandTarget(iface); + return IPersistMoniker_QueryInterface(&This->IPersistMoniker_iface, riid, ppvObject); +} + +static ULONG WINAPI XMLView_OleCommandTarget_AddRef(IOleCommandTarget *iface) +{ + XMLView *This = impl_from_IOleCommandTarget(iface); + return IPersistMoniker_AddRef(&This->IPersistMoniker_iface); +} + +static ULONG WINAPI XMLView_OleCommandTarget_Release(IOleCommandTarget *iface) +{ + XMLView *This = impl_from_IOleCommandTarget(iface); + return IPersistMoniker_Release(&This->IPersistMoniker_iface); +} + +static HRESULT WINAPI XMLView_OleCommandTarget_QueryStatus(IOleCommandTarget *iface, + const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText) +{ + XMLView *This = impl_from_IOleCommandTarget(iface); + FIXME("(%p)->(%p %x %p %p)\n", This, pguidCmdGroup, cCmds, prgCmds, pCmdText); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_OleCommandTarget_Exec(IOleCommandTarget *iface, + const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, + VARIANT *pvaIn, VARIANT *pvaOut) +{ + XMLView *This = impl_from_IOleCommandTarget(iface); + FIXME("(%p)->(%p %d %x %p %p)\n", This, pguidCmdGroup, + nCmdID, nCmdexecopt, pvaIn, pvaOut); + return E_NOTIMPL; +} + +static IOleCommandTargetVtbl XMLView_OleCommandTargetVtbl = { + XMLView_OleCommandTarget_QueryInterface, + XMLView_OleCommandTarget_AddRef, + XMLView_OleCommandTarget_Release, + XMLView_OleCommandTarget_QueryStatus, + XMLView_OleCommandTarget_Exec +}; + +static inline XMLView* impl_from_IOleObject(IOleObject *iface) +{ + return CONTAINING_RECORD(iface, XMLView, IOleObject_iface); +} + +static HRESULT WINAPI XMLView_OleObject_QueryInterface( + IOleObject *iface, REFIID riid, void **ppvObject) +{ + XMLView *This = impl_from_IOleObject(iface); + return IPersistMoniker_QueryInterface(&This->IPersistMoniker_iface, riid, ppvObject); +} + +static ULONG WINAPI XMLView_OleObject_AddRef(IOleObject *iface) +{ + XMLView *This = impl_from_IOleObject(iface); + return IPersistMoniker_AddRef(&This->IPersistMoniker_iface); +} + +static ULONG WINAPI XMLView_OleObject_Release(IOleObject *iface) +{ + XMLView *This = impl_from_IOleObject(iface); + return IPersistMoniker_Release(&This->IPersistMoniker_iface); +} + +static HRESULT WINAPI XMLView_OleObject_SetClientSite( + IOleObject *iface, IOleClientSite *pClientSite) +{ + XMLView *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p)\n", This, pClientSite); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_OleObject_GetClientSite( + IOleObject *iface, IOleClientSite **ppClientSite) +{ + XMLView *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p)\n", This, ppClientSite); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_OleObject_SetHostNames(IOleObject *iface, + LPCOLESTR szContainerApp, LPCOLESTR szContainerObj) +{ + XMLView *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%s %s)\n", This, debugstr_w(szContainerApp), debugstr_w(szContainerObj)); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_OleObject_Close(IOleObject *iface, DWORD dwSaveOption) +{ + XMLView *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%x)\n", This, dwSaveOption); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_OleObject_SetMoniker(IOleObject *iface, + DWORD dwWhichMoniker, IMoniker *pmk) +{ + XMLView *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%x %p)\n", This, dwWhichMoniker, pmk); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_OleObject_GetMoniker(IOleObject *iface, + DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk) +{ + XMLView *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%x %x %p)\n", This, dwAssign, dwWhichMoniker, ppmk); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_OleObject_InitFromData(IOleObject *iface, + IDataObject *pDataObject, BOOL fCreation, DWORD dwReserved) +{ + XMLView *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p %x %x)\n", This, pDataObject, fCreation, dwReserved); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_OleObject_GetClipboardData(IOleObject *iface, + DWORD dwReserved, IDataObject **ppDataObject) +{ + XMLView *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%x %p)\n", This, dwReserved, ppDataObject); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_OleObject_DoVerb(IOleObject *iface, + LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite, + LONG lindex, HWND hwndParent, LPCRECT lprcPosRect) +{ + XMLView *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%d %p %p %d %p %p)\n", This, iVerb, lpmsg, + pActiveSite, lindex, hwndParent, lprcPosRect); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_OleObject_EnumVerbs( + IOleObject *iface, IEnumOLEVERB **ppEnumOleVerb) +{ + XMLView *This = impl_from_IOleObject(iface); + FIXME("(%p)->{%p)\n", This, ppEnumOleVerb); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_OleObject_Update(IOleObject *iface) +{ + XMLView *This = impl_from_IOleObject(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_OleObject_IsUpToDate(IOleObject *iface) +{ + XMLView *This = impl_from_IOleObject(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_OleObject_GetUserClassID(IOleObject *iface, CLSID *pClsid) +{ + XMLView *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p)\n", This, pClsid); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_OleObject_GetUserType(IOleObject *iface, + DWORD dwFormOfType, LPOLESTR *pszUserType) +{ + XMLView *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%x %p)\n", This, dwFormOfType, pszUserType); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_OleObject_SetExtent(IOleObject *iface, + DWORD dwDrawAspect, SIZEL *psizel) +{ + XMLView *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%x %p)\n", This, dwDrawAspect, psizel); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_OleObject_GetExtent(IOleObject *iface, + DWORD dwDrawAspect, SIZEL *psizel) +{ + XMLView *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%x %p)\n", This, dwDrawAspect, psizel); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_OleObject_Advise(IOleObject *iface, + IAdviseSink *pAdvSink, DWORD *pdwConnection) +{ + XMLView *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p %p)\n", This, pAdvSink, pdwConnection); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_OleObject_Unadvise( + IOleObject *iface, DWORD dwConnection) +{ + XMLView *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%d)\n", This, dwConnection); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_OleObject_EnumAdvise( + IOleObject *iface, IEnumSTATDATA **ppenumAdvise) +{ + XMLView *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p)\n", This, ppenumAdvise); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_OleObject_GetMiscStatus( + IOleObject *iface, DWORD dwAspect, DWORD *pdwStatus) +{ + XMLView *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%d %p)\n", This, dwAspect, pdwStatus); + return E_NOTIMPL; +} + +static HRESULT WINAPI XMLView_OleObject_SetColorScheme( + IOleObject *iface, LOGPALETTE *pLogpal) +{ + XMLView *This = impl_from_IOleObject(iface); + FIXME("(%p)->(%p)\n", This, pLogpal); + return E_NOTIMPL; +} + +static IOleObjectVtbl XMLView_OleObjectVtbl = { + XMLView_OleObject_QueryInterface, + XMLView_OleObject_AddRef, + XMLView_OleObject_Release, + XMLView_OleObject_SetClientSite, + XMLView_OleObject_GetClientSite, + XMLView_OleObject_SetHostNames, + XMLView_OleObject_Close, + XMLView_OleObject_SetMoniker, + XMLView_OleObject_GetMoniker, + XMLView_OleObject_InitFromData, + XMLView_OleObject_GetClipboardData, + XMLView_OleObject_DoVerb, + XMLView_OleObject_EnumVerbs, + XMLView_OleObject_Update, + XMLView_OleObject_IsUpToDate, + XMLView_OleObject_GetUserClassID, + XMLView_OleObject_GetUserType, + XMLView_OleObject_SetExtent, + XMLView_OleObject_GetExtent, + XMLView_OleObject_Advise, + XMLView_OleObject_Unadvise, + XMLView_OleObject_EnumAdvise, + XMLView_OleObject_GetMiscStatus, + XMLView_OleObject_SetColorScheme +}; + +HRESULT XMLView_create(IUnknown *outer, void **ppObj) +{ + XMLView *This; + HRESULT hres; + + TRACE("(%p %p)\n", outer, ppObj); + + if(outer) + return E_FAIL; + + This = heap_alloc(sizeof(*This)); + if(!This) + return E_OUTOFMEMORY; + + This->IPersistMoniker_iface.lpVtbl = &XMLView_PersistMonikerVtbl; + This->IPersistHistory_iface.lpVtbl = &XMLView_PersistHistoryVtbl; + This->IOleCommandTarget_iface.lpVtbl = &XMLView_OleCommandTargetVtbl; + This->IOleObject_iface.lpVtbl = &XMLView_OleObjectVtbl; + This->ref = 1; + + hres = CoCreateInstance(&CLSID_HTMLDocument, (IUnknown*)&This->IPersistMoniker_iface, + CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&This->html_doc); + if(FAILED(hres)) { + heap_free(This); + return hres; + } + + *ppObj = &This->IPersistMoniker_iface; + return S_OK; +}