Which msxml version should be used to avoid memory leak ? As report indicates that MSXML has memory leakage.
Vikrant Khandare - India
I have my own Activex Control in which I’m parsing xml file using MSXML 3.0.I'm testing this control using MFC Dialog Application.
Main Dialog -> On click Handler -> Creates XMLDialog object & display's it(DoModal()).
XMLDialog has this Activex Control. In OnCreate() of active control I’m parsing XML file by calling ReadXML().
If I open & close XMLDialog 15-20 times or more & observe the Process memory it starts increasing. Below is my code.
#define CHECKHR(x) {hr = x; if (FAILED(hr)) goto CleanUp;} #define SAFERELEASE(p) {if (p) {(p)->Release(); p = NULL;}} CString CXML::ReadXML(int RunningMode,CString CurProjectPath) { HRESULT hr; VARIANT vURL; _bstr_t bstrName; VARIANT_BOOL vb; hr = S_OK; //E_NOTIMPL; ::CoInitialize(NULL); CString ProjectXmlPath; if(RunningMode==rmOnline) { ProjectXmlPath = getenv("_HOME_CEPATH"); } else { ProjectXmlPath = CurProjectPath; } ProjectXmlPath+="\\Project.xml"; MSXML::IXMLDOMDocument *pXMLDocument = NULL; MSXML::IXMLDOMNode *pParentNode = NULL; CHECKHR(CoCreateInstance(MSXML::CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, MSXML::IID_IXMLDOMDocument, (void**)&pXMLDocument)); if(SUCCEEDED(hr)) { VariantInit(&vURL); vURL.vt = VT_BSTR; V_BSTR(&vURL) = ProjectXmlPath.AllocSysString(); CHECKHR(pXMLDocument->load(vURL, &vb)); VariantClear(&vURL); ProjectInfoMap.clear(); if(vb != VARIANT_FALSE) { if(pXMLDocument) { // Get connections element MSXML::IXMLDOMElement* pElement = NULL; MSXML::IXMLDOMNode* pNode = NULL; MSXML::IXMLDOMNodeList* pFieldList = NULL; _bstr_t bstrNoteElem("Application"); // get a list of all the note-elements CHECKHR(pXMLDocument->getElementsByTagName(bstrNoteElem, &pFieldList)); if (pFieldList) { unsigned long length = 0; CHECKHR(pFieldList->get_length((long*)&length)); unsigned long index = 0; while (index < length) { // find the next field-object in the collection CHECKHR(pFieldList->get_item(index, &pNode)); CHECKHR(pNode->QueryInterface(MSXML::IID_IXMLDOMElement,(void**)&pElement)); _bstr_t bstrNote; _bstr_t Id; _bstr_t SWId; _bstr_t DefaultEffectStyle; _bstr_t Rev; _bstr_t Guid; _bstr_t Apptype; VARIANT varVal; VariantInit(&varVal); pElement->getAttribute(L"Id",&varVal); Id = (LPCTSTR)varVal.bstrVal; VariantClear(&varVal); pElement->getAttribute(L"SWId",&varVal); SWId = (LPCTSTR)varVal.bstrVal; VariantClear(&varVal); pElement->getAttribute(L"DefaultEffectStyle",&varVal); DefaultEffectStyle = (LPCTSTR)varVal.bstrVal; VariantClear(&varVal); pElement->getAttribute(L"Rev",&varVal); Rev = (LPCTSTR)varVal.bstrVal; VariantClear(&varVal); pElement->getAttribute(L"Guid",&varVal); Guid = (LPCTSTR)varVal.bstrVal; VariantClear(&varVal); pElement->getAttribute(L"Apptype",&varVal); Apptype = (LPCTSTR)varVal.bstrVal; VariantClear(&varVal); ReadLevelNode(pElement,Id,SWId,DefaultEffectStyle,Rev,Guid,Apptype); SAFERELEASE(pElement); SAFERELEASE(pNode); index++; } SAFERELEASE(pFieldList); } } } } else { // Error in parsing hr = GetXMLErrorCode(pXMLDocument); } CleanUp: if (FAILED(hr)) { } pXMLDocument = NULL; SAFERELEASE(pXMLDocument); ::CoUninitialize(); return ""; }