CoCreateInstance 参数如何设置

我喝多了 2010-05-21 06:17:43
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

忘高手指点
...全文
183 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
我喝多了 2010-05-21
  • 打赏
  • 举报
回复
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();

这是我自己的代码,同步调用成功了,但是异步调用始终就没成功过,希望高手指点
我喝多了 2010-05-21
  • 打赏
  • 举报
回复
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函数,不知道怎么回事
我喝多了 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ljz888666555 的回复:]
IXMLHTTPRequestPtr 这个是智能指针类吧,是智能指针类,就不用调用CoCreateInstance了
它里面有个类成员函数,CreateInstance(),里面有两个参数,
[/Quote]

IXMLHTTPRequestPtr 是只能指针,但是我想实现异步调用,我应该怎么做呢,弄了好几天了,始终都没明白,class XMLHttpEventSink : public IDispatch 这个类是我在网上摘抄的,可是加入程序之后,运行不起来
ljz888666555 2010-05-21
  • 打赏
  • 举报
回复
IXMLHTTPRequestPtr 这个是智能指针类吧,是智能指针类,就不用调用CoCreateInstance了
它里面有个类成员函数,CreateInstance(),里面有两个参数,
我喝多了 2010-05-21
  • 打赏
  • 举报
回复
于是我把这里改成
XMLHttpEventSink(IXMLHttpRequestPtr(这里把*去掉,换成我自己Ptr了) request, HANDLE completedEvent) : _refCount(1), _request(request), _completedEvent(completedEvent)

编译之后程序运行之后没反映
我喝多了 2010-05-21
  • 打赏
  • 举报
回复
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"MailAdmin@pudong.sh";

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

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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