javascriptXMLHttpRequestc++で利用。
イベントハンドラである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();
}