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")); HANDLE hEvent=::CreateEvent(NULL,FALSE,FALSE,NULL); //异步事件
CXMLSink   xmlsink(hEvent); //异步类
pReq-> put_onreadystatechange((IDispatch*)&xmlsink); //异步调用 pReq->open(bPost,Post,VARIANT_TRUE);  
pReq->setRequestHeader(bContent_Type,Content_Type);
pReq->send(_variant_t(bsData));        //发送 ::SysFreeString(bsData);
::SysFreeString(bPost);
::SysFreeString(Post);
::SysFreeString(bContent_Type);
::SysFreeString(Content_Type); WaitForSingleObject(hEvent,30000);
用同步的时候,网站抓包,完成值是4,状态返回200没问题。
改成异步的时候,抓包查看,状态一直都是0,数据是发出去了,可是不返回, 异步类也确实调用了。
 好像是调用WaitForSingleObject函数的时候就阻塞住了,pReq不读取数据了似的。这个函数是用是用MFC的AfxBeginThread函数创建的线程,不能用while(GetMessage(..))缓冲,会异常的。不知道改怎么办了,大侠们来给指点指点该如何弄它。 

解决方案 »

  1.   

    你的xmlsink里有收到回调的通知吗?既然用了WaitForSingleObject,就需要在回调通知里对hEvent使用SetEvent。这样WaitForSingleObject收到信号量通知就可以继续下去了。
      

  2.   


    异步类收到通知了,肯定执行了。
    可是状态码始终都是0,抓包查看的时候,只要不调用WaitForSingleObject,状态码就能 返回200,调用等待函数,状态码一直都是0
      

  3.   

    class CXMLSink : public IDispatch

    public: 
    CXMLSink(DWORD dwRet,MSXML2::IXMLHTTPRequestPtr m_pEvent,HANDLE hEvent) : m_dwRef(1),m_pEventSource(m_pEvent),m_hEvent(hEvent)
    { }  ~CXMLSink() 

    if(m_pEventSource) 
    m_pEventSource-> Release(); 
    m_pEventSource=NULL; 
    }  STDMETHOD(QueryInterface)(REFIID   riid,   LPVOID*   ppv) 

    *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; 
    }  STDMETHOD(GetTypeInfoCount)(UINT*   pctinfo) 
    {
    return   E_NOTIMPL;  
    }  STDMETHOD(GetTypeInfo)(UINT iTInfo,LCID lcid,ITypeInfo** ppTInfo) 

    return   E_NOTIMPL;   
    }  STDMETHOD(GetIDsOfNames)(REFIID riid,LPOLESTR* rgszNames,UINT cNames,LCID lcid,DISPID* rgDispId) 
    {
    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) 

    //MSXML2::IXMLHTTPRequestPtr   xmlreq(m_pEventSource); 
    if(m_pEventSource) 

    long   lReadyState; 
    m_pEventSource-> get_readyState(&lReadyState);  MessageBox(NULL,L"111",NULL,MB_OK);
    if(lReadyState==4) 
    {
    //MessageBox(NULL,L"111",NULL,MB_OK);
    ::SetEvent(m_hEvent);


    return   NOERROR; 

    void   SetEventSource(MSXML2::IXMLHTTPRequestPtr   punk)
    {   
    m_pEventSource=punk;
    if(punk)   punk-> AddRef();
    } protected: 
    MSXML2::IXMLHTTPRequestPtr   m_pEventSource; 
    DWORD   m_dwRef; 
    HANDLE m_hEvent;
    }; 以上是异步类实现。