MSXML中和DOM有关的事件有ondataavailable、onreadystatechange和ontransformnode,但是问题是在VC6中使用MFC、使用ATL和不使用MFC的分别应该怎么做?找了很多资料,都没有解决,特别是ontransformnode这个事件。哪位高手?感谢!ontransformnode最好有例子。

解决方案 »

  1.   

    class MyEventHandler :public IDispatch
    {
    HRESULT Invoke(...)
    {
    //dont check dispatch ID, just do what you need here, for convenience, some interfaces just call invoke
    }
    |};
    MyEventHandler my_handler;
    put_event(&my_handler);
      

  2.   

    这个只能对连接点有作用啊,但是ontransformnode却没有连接点。苦恼中~~~~~
      

  3.   

    哦,看错了,应该是这么用的,有没有完整的例子?使用连接点和非连接点事件的,MFC和控制台的。
      

  4.   

    http://www.fruitfruit.com/vc/ie/xmlhttpasync.cpp
      

  5.   

    不错,给分了,把代码贴在这里了,以便共享:#include "stdafx.h"
    #import "msxml4.dll"
    const char* testurl="http://expert.csdn.net/Expert/topic/1721/1721161.xml?temp=.3921778";
    #define ODS OutputDebugString
    #define WM_USER_STARTWALKING ((WM_USER) + 1)
    using namespace MSXML2;class CXMLSink : public IDispatch
    {
    public:
    CXMLSink() : m_dwRef(1),m_pEventSource(NULL){ }
    ~CXMLSink()
    {
    if(m_pEventSource)
    m_pEventSource->Release();
    m_pEventSource=NULL;
    }
    // IUnknown methods
    STDMETHOD(QueryInterface)(REFIID riid, LPVOID* ppv)
    {
    ODS("QueryInterface");
    *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;
    }
    // IDispatch method
    STDMETHOD(GetTypeInfoCount)(UINT* pctinfo)
    { ODS("GetTypeInfoCount\n"); return E_NOTIMPL; }
    STDMETHOD(GetTypeInfo)(UINT iTInfo,
    LCID lcid,
    ITypeInfo** ppTInfo)
    { ODS("GetTypeInfo\n"); return E_NOTIMPL; }
    STDMETHOD(GetIDsOfNames)(REFIID riid,
    LPOLESTR* rgszNames,
    UINT cNames,
    LCID lcid,
    DISPID* rgDispId)
    { ODS("GetIDsOfNames\n"); 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)
    {
    ODS("Invoke");
    MSXML2::IXMLHTTPRequestPtr xmldom(m_pEventSource);
    if(xmldom)
    {
    long lReadyState;
    xmldom->get_readyState(&lReadyState);
    char buf[256];
    wsprintf(buf,"get_readystate return %d",lReadyState);
    ODS(buf);
    if(lReadyState==4)
    {
    BOOL fRet = PostThreadMessage(GetCurrentThreadId(),
    WM_USER_STARTWALKING,
    (WPARAM)0,
    (LPARAM)0);
    OutputDebugString("DISPID_XMLDOMEVENT_ONREADYSTATECHANGE event fired");
    }
    }
    return NOERROR;
    }
    void SetEventSource(IUnknown* punk){ m_pEventSource=punk;if(punk) punk->AddRef();}
    protected:
    IUnknown* m_pEventSource;
    DWORD m_dwRef;
    };void test2()
    {
    CXMLSink xmlsink;
    IXMLHTTPRequestPtr xmlrequest;
    xmlrequest.CreateInstance("Msxml2.XMLHTTP.4.0");
    _variant_t varp(true);
    xmlrequest->put_onreadystatechange((IDispatch*)&xmlsink);
    xmlsink.SetEventSource(xmlrequest);
    xmlrequest->open(_bstr_t("GET"),_bstr_t(testurl),varp);
    xmlrequest->send();
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
    if (WM_USER_STARTWALKING == msg.message && NULL == msg.hwnd)
    {
    break;
    }
    else
    {
    DispatchMessage(&msg);
    }
    }
    BSTR bstrbody;
    xmlrequest->get_responseText(&bstrbody);
    if(bstrbody)
    {
    _bstr_t bstrtbody(bstrbody);
    printf("%s\n",(LPCTSTR)bstrtbody);
    }
    }
    int main(int argc, char* argv[])
    {
    printf("IXMLHTTPRequest asynchronous code snippet by masterz.\n");
    printf("build with VC.NET, WindowsXP, IE6.0+SP1, MSXML4.0SP2\n");
    CoInitialize(NULL);
    try
    {
    test2();
    }
    catch (_com_error &e)
    {
    printf("Description = '%s'\n", (char*) e.Description());
    }
    CoUninitialize();
    printf("program end\n");
    return 0;
    }