MSXML中和DOM有关的事件有ondataavailable、onreadystatechange和ontransformnode,但是问题是在VC6中使用MFC、使用ATL和不使用MFC的分别应该怎么做?找了很多资料,都没有解决,特别是ontransformnode这个事件。哪位高手?感谢!ontransformnode最好有例子。
解决方案 »
- idl文件中怎样定义一个输出参数为可变长度的数组啊??
- 如何将char*类型的字符串安全的全部转换为BSTR类型或是CComBSTR类型?
- vc++ &stl的问题 (急)
- 设置ClistCtrl 单元格字体颜色
- mfc项目中一个dll被载入后,如果不主动FreeLibrary ,会在什么时候自动释放?
- 请问如何用程序控制Volume Control面板选项?
- 什么错误提示?
- 关于OLE拖放:自定义Listbox中的条目既有文件信息也有自定义数据格式,begindrag事件的时候如何判断某个条目应添加到CF_HDROP格式(如果
- 问一个汇编的问题
- VC++ 连接 DB2 数据
- 菜鸟问题
- 谁能告诉我,屏幕对象捉图怎么实现????
{
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);
#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;
}