|
Callback pour URLOpenStream |
UrlOpenStream permet de charger une url. Si vous souhaitez controler de manière asynchrone
les données qui arrivent il faut l'utiliser avec une classe héritée de IBindStatusCallback
comme ci-dessous.
|
BSCallBackImpl.h
|
// BSCallbackImpl.h: interface for the CBSCallbackImpl class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_BSCALLBACKIMPL_H__942CAF0F_C403_11D5_8250_8BB0DBD66F01__INCLUDED_)
#define AFX_BSCALLBACKIMPL_H__942CAF0F_C403_11D5_8250_8BB0DBD66F01__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CBSCallbackImpl : public IBindStatusCallback
{
public:
CBSCallbackImpl();
~CBSCallbackImpl();
// IUnknown methods
STDMETHOD(QueryInterface)(REFIID riid, void **ppvObject);
STDMETHOD_(ULONG, AddRef)();
STDMETHOD_(ULONG, Release)();
// IBindStatusCallback methods
STDMETHOD(OnStartBinding)(DWORD, IBinding *);
STDMETHOD(GetPriority)(LONG *);
STDMETHOD(OnLowResource)(DWORD);
STDMETHOD(OnProgress)(ULONG ulProgress,
ULONG ulProgressMax,
ULONG ulStatusCode,
LPCWSTR szStatusText);
STDMETHOD(OnStopBinding)(HRESULT, LPCWSTR);
STDMETHOD(GetBindInfo)(DWORD *, BINDINFO *);
STDMETHOD(OnDataAvailable)(DWORD, DWORD, FORMATETC *, STGMEDIUM *);
STDMETHOD(OnObjectAvailable)(REFIID, IUnknown *);
protected:
ULONG m_ulObjRefCount;
};
#endif // !defined(AFX_BSCALLBACKIMPL_H__942CAF0F_C403_11D5_8250_8BB0DBD66F01__INCLUDED_)
|
|
BSCallBackImpl.cpp
|
// BSCallbackImpl.cpp: implementation of the CBSCallbackImpl class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "BSCallbackImpl.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//--------------------------------------------------------------------
CBSCallbackImpl::CBSCallbackImpl()
{
m_ulObjRefCount = 1;
}
//--------------------------------------------------------------------
CBSCallbackImpl::~CBSCallbackImpl()
{
}
//--------------------------------------------------------------------
// IUnknown
STDMETHODIMP CBSCallbackImpl::QueryInterface(REFIID riid, void **ppvObject)
{
TRACE(_T("IUnknown::QueryInterface\n"));
*ppvObject = NULL;
// IUnknown
if (::IsEqualIID(riid, __uuidof(IUnknown)))
{
TRACE(_T("IUnknown::QueryInterface(IUnknown)\n"));
*ppvObject = this;
}
// IBindStatusCallback
else if (::IsEqualIID(riid, __uuidof(IBindStatusCallback)))
{
TRACE(_T("IUnknown::QueryInterface(IBindStatusCallback)\n"));
*ppvObject = static_cast(this);
}
if (*ppvObject)
{
(*reinterpret_cast(ppvObject))->AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
//--------------------------------------------------------------------
STDMETHODIMP_(ULONG) CBSCallbackImpl::AddRef()
{
TRACE(_T("IUnknown::AddRef\n"));
return ++m_ulObjRefCount;
}
//--------------------------------------------------------------------
STDMETHODIMP_(ULONG) CBSCallbackImpl::Release()
{
TRACE(_T("IUnknown::Release\n"));
return --m_ulObjRefCount;
}
//--------------------------------------------------------------------
// IBindStatusCallback
STDMETHODIMP CBSCallbackImpl::OnStartBinding(DWORD, IBinding *)
{
TRACE(_T("IBindStatusCallback::OnStartBinding\n"));
return S_OK;
}
//--------------------------------------------------------------------
STDMETHODIMP CBSCallbackImpl::GetPriority(LONG *)
{
TRACE(_T("IBindStatusCallback::GetPriority\n"));
return E_NOTIMPL;
}
//--------------------------------------------------------------------
STDMETHODIMP CBSCallbackImpl::OnLowResource(DWORD)
{
TRACE(_T("IBindStatusCallback::OnLowResource\n"));
return S_OK;
}
//--------------------------------------------------------------------
STDMETHODIMP CBSCallbackImpl::OnProgress(ULONG ulProgress,
ULONG ulProgressMax,
ULONG ulStatusCode,
LPCWSTR szStatusText)
{
return S_OK;
}
//--------------------------------------------------------------------
STDMETHODIMP CBSCallbackImpl::OnStopBinding(HRESULT, LPCWSTR)
{
TRACE(_T("IBindStatusCallback::OnStopBinding\n"));
return S_OK;
}
//--------------------------------------------------------------------
STDMETHODIMP CBSCallbackImpl::GetBindInfo(DWORD *, BINDINFO *)
{
TRACE(_T("IBindStatusCallback::GetBindInfo\n"));
return S_OK;
}
//--------------------------------------------------------------------
STDMETHODIMP CBSCallbackImpl::OnDataAvailable(DWORD, DWORD dwSize,
FORMATETC *, STGMEDIUM *stgmed )
{
TRACE(_T("IBindStatusCallback::OnDataAvailable %ld\n"), dwSize );
if ( stgmed ) {
if ( stgmed->pstm ) {
ULONG bytesRead = 0;
BYTE *data = new BYTE[ dwSize ];
HRESULT hRes = stgmed->pstm->Read( data, dwSize, &bytesRead );
delete[] data;
return hRes;
}
}
return S_OK;
}
//--------------------------------------------------------------------
STDMETHODIMP CBSCallbackImpl::OnObjectAvailable(REFIID, IUnknown *)
{
TRACE(_T("IBindStatusCallback::OnObjectAvailable\n"));
return S_OK;
}
//--------------------------------------------------------------------
|
|
Fonction principale
|
HRESULT loadUrl( LPCTSTR url )
{
CBSCallbackImpl callback;
HRESULT hRes = ::URLOpenStream( NULL, url, 0, &callback );
callback.Release();
return hRes;
}
|
13/08/2008
|