IXMLHTTPRequestPtr pReq;
如上,定义了pReq指针之后,CoCreateInstance参数要怎么设置啊这里我在网上摘抄了一个类加入了程序:代码如下:
class XMLHttpEventSink : public IDispatch
{
public:
XMLHttpEventSink(IXMLHttpRequest* request, HANDLE completedEvent) : _refCount(1), _request(request), _completedEvent(completedEvent)
{
// Don't increase the reference count to the request object; doing so would create a circular reference
// and thus a memory leak.
}
virtual ~XMLHttpEventSink() { } // IUnknown
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release(); // IDispatch
STDMETHODIMP GetTypeInfoCount(UINT *pctinfo);
STDMETHODIMP GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
STDMETHODIMP GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
STDMETHODIMP Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
private:
LONG _refCount;
IXMLHttpRequest* _request;
HANDLE _completedEvent;
}; #endif忘高手指点
如上,定义了pReq指针之后,CoCreateInstance参数要怎么设置啊这里我在网上摘抄了一个类加入了程序:代码如下:
class XMLHttpEventSink : public IDispatch
{
public:
XMLHttpEventSink(IXMLHttpRequest* request, HANDLE completedEvent) : _refCount(1), _request(request), _completedEvent(completedEvent)
{
// Don't increase the reference count to the request object; doing so would create a circular reference
// and thus a memory leak.
}
virtual ~XMLHttpEventSink() { } // IUnknown
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release(); // IDispatch
STDMETHODIMP GetTypeInfoCount(UINT *pctinfo);
STDMETHODIMP GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
STDMETHODIMP GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
STDMETHODIMP Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
private:
LONG _refCount;
IXMLHttpRequest* _request;
HANDLE _completedEvent;
}; #endif忘高手指点
解决方案 »
- IOCP shutdown 奇怪现象 找高人求解
- 求助,关于Combox的2个小问题
- 关于动态调整控件尺寸
- 如何从文件末倒数指定某行开始读取
- sniffer能嗅到所有的数据吗?
- 请问如何调用一幅加到resource中的bmp位图文件?
- 用webbrowser时lpDispatch = m_pWebBrowser->GetDocument();lpDispatch为何返回的是空,代码是。。。
- 急寻好书---------请大虾推荐几本有关Socket编程技术的书籍******!!!!!!!!
- 关于VirtualProtectEx修改跨两页面属性的疑问,高手请进!
- 请教高手,音乐左右声道问题
- 第四维是啥
- 网络高手指点,为什么无线传输时,数据会被自动拆分?而有线则不会!真是悲剧![问题点数:100分]
IXMLHttpRequest* pRequest = GetXMLHTTP(); pRequest->setRequestHeader(L"Content-Type", L"text/xml");
pRequest->setRequestHeader("SOAPAction","http://schemas.microsoft.com/exchange/services/2006/messages/FindItem");
WideString url = L"http://mail.pudong.sh/ews/exchange.asmx"; tagVARIANT account;
account.vt = VT_BSTR;
account.bstrVal = L"[email protected]"; tagVARIANT password;
password.vt = VT_BSTR; password.bstrVal = L"App1234";
tagVARIANT bAsync;
bAsync.vt = VT_BOOL;
bAsync.boolVal = FALSE; WideString dataStr = L"";
tagVARIANT data;
data.vt = VT_BSTR;
data.bstrVal = dataStr.c_bstr(); HANDLE completedEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
pRequest->open(L"POST", url.c_bstr(), bAsync, account, password); IDispatch *sink = new XMLHttpEventSink(pRequest, completedEvent);
pRequest->put_onreadystatechange(sink);
pRequest->send(data); sink->Release();
pRequest->Release(); WaitForSingleObject(completedEvent, INFINITE);
CloseHandle(completedEvent); CoUninitialize();
这是我在网上抄的调用代码,第2行IXMLHttpRequest* pRequest = GetXMLHTTP(); 编译的时候提示找不到GetXMLHTTP()标识符,不知道怎么回事
XMLHttpEventSink(IXMLHttpRequestPtr(这里把*去掉,换成我自己Ptr了) request, HANDLE completedEvent) : _refCount(1), _request(request), _completedEvent(completedEvent)编译之后程序运行之后没反映
它里面有个类成员函数,CreateInstance(),里面有两个参数,
IXMLHTTPRequestPtr 是只能指针,但是我想实现异步调用,我应该怎么做呢,弄了好几天了,始终都没明白,class XMLHttpEventSink : public IDispatch 这个类是我在网上摘抄的,可是加入程序之后,运行不起来
{
if( ppvObject == NULL )
return E_INVALIDARG; *ppvObject = NULL; if( riid == IID_IUnknown )
*ppvObject = static_cast<IUnknown*>(this);
else if( riid == IID_IDispatch )
*ppvObject = static_cast<IDispatch*>(this); if( *ppvObject == NULL )
return E_NOINTERFACE; AddRef(); return S_OK;
} STDMETHODIMP_(ULONG) XMLHttpEventSink::AddRef()
{
return InterlockedIncrement(&_refCount);
} STDMETHODIMP_(ULONG) XMLHttpEventSink::Release()
{
LONG refCount = InterlockedDecrement(&_refCount);
if( refCount == 0 )
{
delete this;
return 0;
}
else
return refCount;
} STDMETHODIMP XMLHttpEventSink::GetTypeInfoCount(UINT *pctinfo)
{
return E_NOTIMPL;
} STDMETHODIMP XMLHttpEventSink::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
{
return E_NOTIMPL;
} STDMETHODIMP XMLHttpEventSink::GetIDsOfNames(const IID &riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
{
return E_NOTIMPL;
} STDMETHODIMP XMLHttpEventSink::Invoke(DISPID dispIdMember, const IID &riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
// Since this class isn't used for anything else, Invoke will get called only for onreadystatechange, and
// dispIdMember will always be 0. long state;
// Retrieve the state
_request->get_readyState(&state);
if (state == 4)
{
// The request has completed.
// Get the request status.
long status;
_request->get_status(&status); if( status == 200 )
{
// Get the response body if we were successful.
BSTR body;
_request->get_responseText(&body);
MessageBox((HWND)AfxGetApp(),_T("返回成功"),_T("NC全功能查号器"),MB_OK);
} // Signal the main thread we're done.
SetEvent(_completedEvent);
}
return S_OK;
}这是我拆抄的那个类的实现,始终就执行不到Invoke函数,不知道怎么回事
IXMLHTTPRequestPtr pReq; if(FAILED(pReq->CreateInstance(_T("Msxml2.XMLHTTP"))))
return; pReq->open(_bstr_t(_T("POST")),_bstr_t(_T("网址")),false);
pReq->setRequestHeader(_bstr_t(_T("Accept")),_bstr_t(_T("*/*")));
pReq->setRequestHeader(_bstr_t(_T("Accept-Encoding")),_bstr_t(_T("gzip, deflate")));
pReq->setRequestHeader(_bstr_t(_T("Accept-Language")),_bstr_t(_T("ko")));
pReq->setRequestHeader(_bstr_t(_T("Host")),_bstr_t(_T("login.plaync.co.kr")));
pReq->setRequestHeader(_bstr_t(_T("Referer")),_bstr_t(_T("https://login.plaync.co.kr/login/loginform?return_url=http://csCenter.plaync.co.kr/main.asp")));
pReq->setRequestHeader(_bstr_t(_T("User-Agent")),_bstr_t(_T("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30")));
pReq->setRequestHeader(_bstr_t(_T("Cache-Control")),_bstr_t(_T("no-cache")));
pReq->setRequestHeader(_bstr_t(_T("Connection")),_bstr_t(_T("Keep-Alive")));
pReq->setRequestHeader(_bstr_t(_T("Content-Length")),_bstr_t(str4));
pReq->setRequestHeader(_bstr_t(_T("Content-Type")),_bstr_t(_T("application/x-www-form-urlencoded"))); //IDispatch *sink = new XMLHttpEventSink(pReq, completedEvent);
//pReq->put_onreadystatechange(sink);
BSTR bsData=_bstr_t(str);
pReq->send(_variant_t(bsData)); pReq->get_responseText(&bsData);
_bstr_t ddd(bsData);
str1=(LPCTSTR)ddd;
MessageBox(str1); //sink->Release();
//pReq.Release(); //WaitForSingleObject(completedEvent, INFINITE);
//CloseHandle(completedEvent); CoUninitialize();这是我自己的代码,同步调用成功了,但是异步调用始终就没成功过,希望高手指点