100分,请教个c++调用xmlhttprequest object问题

ayw215 2009-06-17 04:22:53
最近需要用c++对xmlhttprequest object的属性和方法进行简单的封装
但是不知道怎么下手。。。
xmlhttprequest 是不是一个com对象?
有做过相关东西的xd可以给点代码框架做做示例么?
谢谢~~
...全文
227 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
norsd 2009-06-22
  • 打赏
  • 举报
回复
我自己就做了一个xmlhttprequest封装,因为是一个本地xmlhttprequest 所以可以跨域,然后做一个接口给js用,很爽。
wwwhhb4001 2009-06-19
  • 打赏
  • 举报
回复

mark
ZOthello 2009-06-19
  • 打赏
  • 举报
回复
是来学习的,帮顶~~
eagerle01 2009-06-18
  • 打赏
  • 举报
回复
帮顶
skyxie 2009-06-17
  • 打赏
  • 举报
回复
呵呵,其实MSDN中有很多 IXMLHTTPRequest 例子的 ~
MSDN中基本每个方法/属性都有例子, 比如下面这个.

你要封装的话,肯定每一个方法/属性都要覆盖倒~ 只有翻MSDN (或者MSXML SDK)

#import "msxml3.dll"
using namespace MSXML2;

void XMLHttpRequestSample()
{
IXMLHTTPRequestPtr pIXMLHTTPRequest = NULL;
BSTR bstrString = NULL;
HRESULT hr;

try {
hr=pIXMLHTTPRequest.CreateInstance("Msxml2.XMLHTTP.3.0");
SUCCEEDED(hr) ? 0 : throw hr;

hr=pIXMLHTTPRequest->open("GET", "http://localhost/books.xml ", false);
SUCCEEDED(hr) ? 0 : throw hr;

hr=pIXMLHTTPRequest->send();
SUCCEEDED(hr) ? 0 : throw hr;

bstrString=pIXMLHTTPRequest->responseText;

MessageBox(NULL, _bstr_t(bstrString), _T("Results"), MB_OK);

if(bstrString)
{
::SysFreeString(bstrString);
bstrString = NULL;
}

} catch (...) {
MessageBox(NULL, _T("Exception occurred"), _T("Error"), MB_OK);
if(bstrString)
::SysFreeString(bstrString);
}

}

oyljerry 2009-06-17
  • 打赏
  • 举报
回复
#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;
}

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧