■
javascriptのXMLHttpRequestをc++で利用。
イベントハンドラであるonreadystatechangeの扱いがscript向けになっていた。
javascript内でxmlHttpRequest.onreadystatechange = function(){ ... の場合、
この無名関数はIDispatchのDISPID=0になるようだ。
/////////////////////////////////////////////////////////////////////////////// CComPtr<IXMLHttpRequest> greq; CComPtr<IDispatch> gHandler; // class CMFCApplication1View : public CFormView // { ... }; void CMFCApplication1View::OnBnClickedBtn1() { greq.Release(); gHandler.Release(); CLSID clsid; HRESULT hr; hr = CLSIDFromProgID( L"MSXML2.XMLHTTP", &clsid ); hr = greq.CoCreateInstance( clsid,NULL ); // equal to "var req = new XMLHttpRequest();" CComVariant vnull; CComVariant IsAsync = TRUE; // TRUE is Async. //not support //CComPtr<IConnectionPointContainer> cp; //hr = req->QueryInterface(IID_IConnectionPointContainer, (void**)&cp); // CHelper is IDispatch class. // 0 is 'no name event handler'. // [id(0)] HRESULT Handler(); CHelper::CreateInstance( &gHandler ); hr = greq->open( CComBSTR(L"GET"), CComBSTR(L"http://www.yahoo.com"),IsAsync, vnull,vnull ); hr = greq->put_onreadystatechange( gHandler ); hr = greq->send( vnull ); } STDMETHODIMP CHelper::Handler() { // This function DISPID must be zero. long state, status; greq->get_readyState(&state); if ( state == 4 ) { greq->get_status(&status); // status == 200 CString s; s.Format( L"state=%ld status=%ld", state, status ); ::MessageBox( NULL, s, L"msgbox", MB_OK ); } return S_OK; } void CMFCApplication1View::OnDestroy() { CFormView::OnDestroy(); greq.Release(); gHandler.Release(); }