banner
 




Callback pour URLOpenStream
Vous êtes: Accueil > Articles > 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