Runs when the readyState method changes.
HRESULT onreadystatechange(void);
Returns S_OK if successful, or an error code otherwise.
The event handler can be set by explicitly setting the onreadystatechange method.
This member is an extension of the W3C DOM.
The following Visual Basic example shows how to use the onreadystatechange event in an application:
Dim WithEvents xmldoc As DOMDocument Private Sub Form_Load() Set xmldoc = New DOMDocument xmldoc.Load ("http://xmlweb/msxml/jscript/error.xml") End Sub Private Sub xmldoc_onreadystatechange() If (xmldoc.readyState = 4) Then msg = "Load is finished" & Chr(13) If (xmldoc.parseError.errorCode <> 0) Then msg = msg + "Error: " & xmldoc.parseError.reason End If MsgBox msg End If End Sub
BEGIN_DISPATCH_MAP(CXMLDOMSamples, CCmdTarget) DISP_FUNCTION_ID(CXMLDOMSamples, "Ready State Event Handler", DISPID_XMLDOMEVENT_ONREADYSTATECHANGE, DOMDocCheckState, VT_EMPTY, 0) END_DISPATCH_MAP() class CXMLDOMSamples : public CCmdTarget { private: HRESULT m_hr; IXMLDOMDocument* m_pIXMLDOMDocument; BSTR m_bstrXMLDocName; DWORD m_pdwCookie; public: BOOL AdviseConnectionPoint(BOOL bAdvise = TRUE); void Caller(); BOOL DOMDocLoadLocation(); BOOL DOMDocStateChangeSetup(); void DOMDocCheckState(); }; // Assumptions // m_pIXMLDOMDocument has already been initialized (a DOMDocument // object has been created). // Automation is enabled for the class to enable it to connect // to the Connection point (DIID_XMLDOMDocumentEvents). void CXMLDOMSamples::Caller() { try { m_bstrXMLDocName = ::SysAllocString(_T("http://MyServer/sample.xml")); DOMDocStateChangeSetup(); DOMDocLoadLocation(); ::SysFreeString(m_bstrXMLDocName); m_bstrXMLDocName = NULL; } catch(...) { if(m_bstrXMLDocName) ::SysFreeString(m_bstrXMLDocName); DisplayErrorToUser(); } } BOOL CXMLDOMSamples::AdviseConnectionPoint(BOOL bAdvise) { BOOL bResult = FALSE; try { IConnectionPointContainer *pIConnectionPointContainer = NULL; IConnectionPoint *pCP = NULL; m_hr = m_pIXMLDOMDocument->QueryInterface (IID_IConnectionPointContainer,(void**)&pIConnectionPointContainer); SUCCEEDED(m_hr) ? 0 : throw m_hr; If(pIConnectionPointContainer) { m_hr = pIConnectionPointContainer->FindConnectionPoint (DIID_XMLDOMDocumentEvents, &pCP); SUCCEEDED(m_hr) ? 0 : throw m_hr; if(SUCCEEDED(m_hr) && pCP) { if(bAdvise) m_hr = pCP->Advise(GetIDispatch(TRUE), &m_pdwCookie); else m_hr = pCP->Unadvise(m_pdwCookie); bResult = SUCCEEDED(m_hr) ? TRUE : FALSE; pCP->Release(); pCP = NULL; } pIConnectionPointContainer->Release(); pIConnectionPointContainer = NULL; } } catch(...) { if(pIConnectionPointContainer) pIConnectionPointContainer->Release(); if(pCP) pCP->Release(); DisplayErrorToUser(); } return bResult; } BOOL CXMLDOMSamples::DOMDocStateChangeSetup() { BOOL bResult = FALSE; try { m_hr = m_pIXMLDOMDocument->put_async(VARIANT_TRUE); SUCCEEDED(m_hr) ? 0 : throw m_hr; bResult = AdviseConnectionPoint(); } catch(...) { DisplayErrorToUser(); } return bResult; } BOOL CXMLDOMSamples::DOMDocLoadLocation() { short sResult = FALSE; BOOL bResult = FALSE; try { _variant_t varString = m_bstrXMLDocName; m_hr = m_pIXMLDOMDocument->load(varString, &sResult); bResult = SUCCEEDED(m_hr) ? TRUE : FALSE; } catch(...) { DisplayErrorToUser(); } return bResult; } void CXMLDOMSamples::DOMDocCheckState() { IXMLDOMParseError *pIParseError = NULL; long value; try { m_hr = m_pIXMLDOMDocument->get_readyState(&value); SUCCEEDED(m_hr) ? 0 : throw m_hr; if(value == 4 ) { m_hr = m_pIXMLDOMDocument->get_parseError(&pIParseError); SUCCEEDED(m_hr) ? 0 : throw m_hr; m_hr = pIParseError->get_errorCode(&value); pIParseError->Release(); pIParseError=NULL; if(!SUCCEEDED(m_hr)) { throw m_hr; } m_strOutput = (value != 0) ? _T("Load Error") : _T("Load Succeeded"); } } catch(...) { if(pIParseError) pIParseError->Release(); DisplayErrorToUser(); } }