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就是超时,郁闷了,不知道为什么,大侠指点

解决方案 »

  1.   

    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;
    }异步接口函数
      

  2.   

    检查你的XMLHttpEventSink类中处理hEvent的代码
      

  3.   

    我回复贴的代码,不是处理hEvent的代码么?大侠
      

  4.   


    if(::WaitForSingleObject(hEvent,20000)==WAIT_TIMEOUT)
            {
                static_cast<CEdit*>(GetDlgItem(IDC_DANGQIAN))->SetWindowTextW(_T("网络不通"));
                pReq->abort();
                ::CloseHandle(hEvent);            return false;    //等待时间内,发送的数据没有返回
            }
            ::CloseHandle(hEvent);
    这个代码不就是处理事件的么
      

  5.   

    #include "StdAfx.h"
    #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类的实现,请大侠帮忙指正
      

  6.   

    代码贴全了?至少new XMLHttpEventSink(pReq, hEvent);对应的构造函数就没有贴嘛...
            sink->Release();        
    需要移到WaitForSingleObject执行后
      

  7.   

    本不该用new的,应该使用createinstance方法初始,然后通过queryinterface获取接口的标准作法的,感觉楼主new了好多对象都没清除的样子
      

  8.   

     pReq->open(bPost,Post,VARIANT_FALSE);尼玛,这不是同步么?pReq->open(bPost,Post,VARIANT_TRUE);这才是异步调用哇!!