class XMLHttpEventSink : public IDispatch //异步类定义
{
}#include "StdAfx.h"
#include "XMLHttpEventSink.h"
.... //异步类实现short CPLAYNCDlg::MiMaJiaoYan(...)
{
CString strGeshu;
strGeshu.Format(_T("%d"),iZhangMi+1);
static_cast<CEdit*>(GetDlgItem(IDC_DANGQIAN))->SetWindowTextW(zhanghao+L" "+mima);
static_cast<CStatic*>(GetDlgItem(IDC_GESHU))->SetWindowTextW(strGeshu); BSTR bPost=::SysAllocString(_T("POST"));
BSTR Post=::SysAllocString(_T("https://login.plaync.co.kr/login/login"));
BSTR bContent_Type=::SysAllocString(_T("Content-Type"));
BSTR Content_Type=::SysAllocString(_T("application/x-www-form-urlencoded"));///////初始化
BSTR bsData=::SysAllocString(_T("save=on&id=")+zhanghao+_T("&pwd=")+mima); pReq->open(bPost,Post,VARIANT_FALSE);
pReq->setRequestHeader(bContent_Type,Content_Type); HANDLE hEvent=::CreateEvent(NULL, FALSE, FALSE, NULL);
IDispatch *sink = new XMLHttpEventSink(pReq, hEvent); //创建IDispatch接口
pReq->put_onreadystatechange(sink); //异步调用 pReq->send(_variant_t(bsData)); //发送 ::SysFreeString(bsData);
::SysFreeString(bPost);
::SysFreeString(Post);
::SysFreeString(bContent_Type);
::SysFreeString(Content_Type); sink->Release(); if(::WaitForSingleObject(hEvent,17000)==WAIT_TIMEOUT)
{
static_cast<CEdit*>(GetDlgItem(IDC_DANGQIAN))->SetWindowTextW(_T("网络不通"));
pReq->abort();
::CloseHandle(hEvent);
return 0; //等待时间内,发送的数据没有返回
}
::CloseHandle(hEvent);
}bool CPLAYNCDlg::ShenFenZheng(...)
{
BSTR bPost=::SysAllocString(_T("POST"));
BSTR Post=::SysAllocString(_T("http://lineage.plaync.co.kr/service/sealing/sealingConfigCertify")); pReq->open(bPost,Post,VARIANT_TRUE); HANDLE hEvent=::CreateEvent(NULL, FALSE, FALSE, NULL);
IDispatch *sink = new XMLHttpEventSink(pReq, hEvent);//创建IDispatch接口
pReq->put_onreadystatechange(sink); //异步调用 pReq->send(); //发送 ::SysFreeString(bPost);
::SysFreeString(Post); sink->Release(); if(::WaitForSingleObject(hEvent,20000)==WAIT_TIMEOUT)
{
static_cast<CEdit*>(GetDlgItem(IDC_DANGQIAN))->SetWindowTextW(_T("网络不通"));
pReq->abort();
::CloseHandle(hEvent); return false; //等待时间内,发送的数据没有返回
}
::CloseHandle(hEvent);
}.....CWinThread* pThread=AfxBeginThread(KaiShi,this,0,0,CREATE_SUSPENDED,0); //创建换代理线程
pThread->m_bAutoDelete=true;
pThread->ResumeThread();UINT KaiShi(LPVOID lParam)
{
CPLAYNCDlg *pDLG=(CPLAYNCDlg*)lParam;
pDLG->MiMaJiaoYan(); //此函数的异步调用成功,SetEvent()执行成功,WaitForSingleObject返回
pDLG->ShenFenZheng(); //接着调用此函数,数据发送成功,抓包查看数据返回正常,网站状态也是200,但是XMLHTTPRequest异步类没有执行setevent设置对象受信,为什么呢.
}
每次执行都是第一个函数执行成功,第2个函数里的WaitForSingleObject就是超时,郁闷了,不知道为什么,大侠指点
{
}#include "StdAfx.h"
#include "XMLHttpEventSink.h"
.... //异步类实现short CPLAYNCDlg::MiMaJiaoYan(...)
{
CString strGeshu;
strGeshu.Format(_T("%d"),iZhangMi+1);
static_cast<CEdit*>(GetDlgItem(IDC_DANGQIAN))->SetWindowTextW(zhanghao+L" "+mima);
static_cast<CStatic*>(GetDlgItem(IDC_GESHU))->SetWindowTextW(strGeshu); BSTR bPost=::SysAllocString(_T("POST"));
BSTR Post=::SysAllocString(_T("https://login.plaync.co.kr/login/login"));
BSTR bContent_Type=::SysAllocString(_T("Content-Type"));
BSTR Content_Type=::SysAllocString(_T("application/x-www-form-urlencoded"));///////初始化
BSTR bsData=::SysAllocString(_T("save=on&id=")+zhanghao+_T("&pwd=")+mima); pReq->open(bPost,Post,VARIANT_FALSE);
pReq->setRequestHeader(bContent_Type,Content_Type); HANDLE hEvent=::CreateEvent(NULL, FALSE, FALSE, NULL);
IDispatch *sink = new XMLHttpEventSink(pReq, hEvent); //创建IDispatch接口
pReq->put_onreadystatechange(sink); //异步调用 pReq->send(_variant_t(bsData)); //发送 ::SysFreeString(bsData);
::SysFreeString(bPost);
::SysFreeString(Post);
::SysFreeString(bContent_Type);
::SysFreeString(Content_Type); sink->Release(); if(::WaitForSingleObject(hEvent,17000)==WAIT_TIMEOUT)
{
static_cast<CEdit*>(GetDlgItem(IDC_DANGQIAN))->SetWindowTextW(_T("网络不通"));
pReq->abort();
::CloseHandle(hEvent);
return 0; //等待时间内,发送的数据没有返回
}
::CloseHandle(hEvent);
}bool CPLAYNCDlg::ShenFenZheng(...)
{
BSTR bPost=::SysAllocString(_T("POST"));
BSTR Post=::SysAllocString(_T("http://lineage.plaync.co.kr/service/sealing/sealingConfigCertify")); pReq->open(bPost,Post,VARIANT_TRUE); HANDLE hEvent=::CreateEvent(NULL, FALSE, FALSE, NULL);
IDispatch *sink = new XMLHttpEventSink(pReq, hEvent);//创建IDispatch接口
pReq->put_onreadystatechange(sink); //异步调用 pReq->send(); //发送 ::SysFreeString(bPost);
::SysFreeString(Post); sink->Release(); if(::WaitForSingleObject(hEvent,20000)==WAIT_TIMEOUT)
{
static_cast<CEdit*>(GetDlgItem(IDC_DANGQIAN))->SetWindowTextW(_T("网络不通"));
pReq->abort();
::CloseHandle(hEvent); return false; //等待时间内,发送的数据没有返回
}
::CloseHandle(hEvent);
}.....CWinThread* pThread=AfxBeginThread(KaiShi,this,0,0,CREATE_SUSPENDED,0); //创建换代理线程
pThread->m_bAutoDelete=true;
pThread->ResumeThread();UINT KaiShi(LPVOID lParam)
{
CPLAYNCDlg *pDLG=(CPLAYNCDlg*)lParam;
pDLG->MiMaJiaoYan(); //此函数的异步调用成功,SetEvent()执行成功,WaitForSingleObject返回
pDLG->ShenFenZheng(); //接着调用此函数,数据发送成功,抓包查看数据返回正常,网站状态也是200,但是XMLHTTPRequest异步类没有执行setevent设置对象受信,为什么呢.
}
每次执行都是第一个函数执行成功,第2个函数里的WaitForSingleObject就是超时,郁闷了,不知道为什么,大侠指点
{
long state; _request->get_readyState(&state);
if (state == 4)
{
long status;
_request->get_status(&status); if( status == 200 )
{
::SetEvent(_completedEvent);
}
}
return S_OK;
}异步接口函数
if(::WaitForSingleObject(hEvent,20000)==WAIT_TIMEOUT)
{
static_cast<CEdit*>(GetDlgItem(IDC_DANGQIAN))->SetWindowTextW(_T("网络不通"));
pReq->abort();
::CloseHandle(hEvent); return false; //等待时间内,发送的数据没有返回
}
::CloseHandle(hEvent);
这个代码不就是处理事件的么
#include "XMLHttpEventSink.h" STDMETHODIMP XMLHttpEventSink::QueryInterface(const IID &riid, void **ppvObject)
{
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)
{
long state; _request->get_readyState(&state);
if (state == 4)
{
long status;
_request->get_status(&status); if( status == 200 )
{
::SetEvent(_completedEvent);
}
}
return S_OK;
}这是整个XMLHttpEventSink类的实现,请大侠帮忙指正
sink->Release();
需要移到WaitForSingleObject执行后