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忘高手指点

解决方案 »

  1.   

    CoInitialize(NULL); 
    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()标识符,不知道怎么回事
      

  2.   

    于是我把这里改成
    XMLHttpEventSink(IXMLHttpRequestPtr(这里把*去掉,换成我自己Ptr了) request, HANDLE completedEvent) : _refCount(1), _request(request), _completedEvent(completedEvent)编译之后程序运行之后没反映
      

  3.   

    IXMLHTTPRequestPtr 这个是智能指针类吧,是智能指针类,就不用调用CoCreateInstance了
    它里面有个类成员函数,CreateInstance(),里面有两个参数,
      

  4.   


    IXMLHTTPRequestPtr 是只能指针,但是我想实现异步调用,我应该怎么做呢,弄了好几天了,始终都没明白,class XMLHttpEventSink : public IDispatch 这个类是我在网上摘抄的,可是加入程序之后,运行不起来
      

  5.   

    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)
    {
    // 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函数,不知道怎么回事
      

  6.   

    CoInitialize(NULL);
    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();这是我自己的代码,同步调用成功了,但是异步调用始终就没成功过,希望高手指点