msxml3: Don't preallocate root element, return new instance on each call.
diff --git a/dlls/msxml3/xmldoc.c b/dlls/msxml3/xmldoc.c
index cf39cc5..af67d4e 100644
--- a/dlls/msxml3/xmldoc.c
+++ b/dlls/msxml3/xmldoc.c
@@ -54,7 +54,6 @@
HRESULT error;
/* IXMLDocument */
- IXMLElement *root;
xmlDocPtr xmldoc;
/* IPersistStream */
@@ -198,17 +197,19 @@
static HRESULT WINAPI xmldoc_get_root(IXMLDocument *iface, IXMLElement **p)
{
xmldoc *This = impl_from_IXMLDocument(iface);
+ xmlNodePtr root;
TRACE("(%p, %p)\n", iface, p);
if (!p)
return E_INVALIDARG;
- *p = This->root;
- if (!*p)
+ *p = NULL;
+
+ if (!(root = xmlDocGetRootElement(This->xmldoc)))
return E_FAIL;
- return S_OK;
+ return XMLElement_create((IUnknown *)This, root, (LPVOID *)p);
}
static HRESULT WINAPI xmldoc_get_fileSize(IXMLDocument *iface, BSTR *p)
@@ -604,7 +605,6 @@
IPersistStreamInit *iface, LPSTREAM pStm)
{
xmldoc *This = impl_from_IPersistStreamInit(iface);
- xmlNodePtr xmlnode;
HRESULT hr;
HGLOBAL hglobal;
DWORD read, written, len;
@@ -653,9 +653,7 @@
return E_FAIL;
}
- if (This->root) IXMLElement_Release(This->root);
- xmlnode = xmlDocGetRootElement(This->xmldoc);
- return XMLElement_create((IUnknown *)This, xmlnode, (LPVOID *)&This->root);
+ return S_OK;
}
static HRESULT WINAPI xmldoc_IPersistStreamInit_Save(
@@ -708,7 +706,6 @@
doc->lpvtblIPersistStreamInit = &xmldoc_IPersistStreamInit_VTable;
doc->ref = 1;
doc->error = S_OK;
- doc->root = NULL;
doc->xmldoc = NULL;
doc->stream = NULL;