3,245
社区成员
发帖
与我相关
我的任务
分享
#include "stdafx.h"
#import "msxml4.dll"
const char* testurl="http://expert.csdn.net/Expert/topic/1721/1721161.xml?temp=.3921778";
#define ODS OutputDebugString
#define WM_USER_STARTWALKING ((WM_USER) + 1)
using namespace MSXML2;
class CXMLSink : public IDispatch
{
public:
CXMLSink() : m_dwRef(1),m_pEventSource(NULL){ }
~CXMLSink()
{
if(m_pEventSource)
m_pEventSource->Release();
m_pEventSource=NULL;
}
// IUnknown methods
STDMETHOD(QueryInterface)(REFIID riid, LPVOID* ppv)
{
ODS("QueryInterface");
*ppv = NULL;
if (IID_IUnknown == riid)
{
*ppv = (LPUNKNOWN)this;
AddRef();
return NOERROR;
}
else if (IID_IDispatch == riid)
{
*ppv = (IDispatch*)this;
AddRef();
return NOERROR;
}
else
return E_NOTIMPL;
}
STDMETHOD_(ULONG, AddRef)(){ return ++m_dwRef;}
STDMETHOD_(ULONG, Release)()
{
if (--m_dwRef == 0)
{
delete this;
return 0;
}
return m_dwRef;
}
// IDispatch method
STDMETHOD(GetTypeInfoCount)(UINT* pctinfo)
{ ODS("GetTypeInfoCount\n"); return E_NOTIMPL; }
STDMETHOD(GetTypeInfo)(UINT iTInfo,
LCID lcid,
ITypeInfo** ppTInfo)
{ ODS("GetTypeInfo\n"); return E_NOTIMPL; }
STDMETHOD(GetIDsOfNames)(REFIID riid,
LPOLESTR* rgszNames,
UINT cNames,
LCID lcid,
DISPID* rgDispId)
{ ODS("GetIDsOfNames\n"); return E_NOTIMPL; }
STDMETHOD(Invoke)(DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS __RPC_FAR *pDispParams,
VARIANT __RPC_FAR *pVarResult,
EXCEPINFO __RPC_FAR *pExcepInfo,
UINT __RPC_FAR *puArgErr)
{
ODS("Invoke");
MSXML2::IXMLHTTPRequestPtr xmldom(m_pEventSource);
if(xmldom)
{
long lReadyState;
xmldom->get_readyState(&lReadyState);
char buf[256];
wsprintf(buf,"get_readystate return %d",lReadyState);
ODS(buf);
if(lReadyState==4)
{
BOOL fRet = PostThreadMessage(GetCurrentThreadId(),
WM_USER_STARTWALKING,
(WPARAM)0,
(LPARAM)0);
OutputDebugString("DISPID_XMLDOMEVENT_ONREADYSTATECHANGE event fired");
}
}
return NOERROR;
}
void SetEventSource(IUnknown* punk){ m_pEventSource=punk;if(punk) punk->AddRef();}
protected:
IUnknown* m_pEventSource;
DWORD m_dwRef;
};
void test2()
{
CXMLSink xmlsink;
IXMLHTTPRequestPtr xmlrequest;
xmlrequest.CreateInstance("Msxml2.XMLHTTP.4.0");
_variant_t varp(true);
xmlrequest->put_onreadystatechange((IDispatch*)&xmlsink);
xmlsink.SetEventSource(xmlrequest);
xmlrequest->open(_bstr_t("GET"),_bstr_t(testurl),varp);
xmlrequest->send();
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
if (WM_USER_STARTWALKING == msg.message && NULL == msg.hwnd)
{
break;
}
else
{
DispatchMessage(&msg);
}
}
BSTR bstrbody;
xmlrequest->get_responseText(&bstrbody);
if(bstrbody)
{
_bstr_t bstrtbody(bstrbody);
printf("%s\n",(LPCTSTR)bstrtbody);
}
}
int main(int argc, char* argv[])
{
printf("IXMLHTTPRequest asynchronous code snippet by masterz.\n");
printf("build with VC.NET, WindowsXP, IE6.0+SP1, MSXML4.0SP2\n");
CoInitialize(NULL);
try
{
test2();
}
catch (_com_error &e)
{
printf("Description = '%s'\n", (char*) e.Description());
}
CoUninitialize();
printf("program end\n");
return 0;
}