//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 2000 // // File: cbsc.h // //-------------------------------------------------------------------------- #ifndef __TASKUI_CBSC_H #define __TASKUI_CBSC_H template class ATL_NO_VTABLE CBindStatusCallback : public CComObjectRoot, public IBindStatusCallback { private: BEGIN_COM_MAP(CBindStatusCallback) COM_INTERFACE_ENTRY(IBindStatusCallback) END_COM_MAP() STDMETHOD(OnStartBinding)(DWORD dwReserved, IBinding *pBinding) { return S_OK; } STDMETHOD(GetPriority)(LONG *pnPriority) { if (NULL == pnPriority) return E_POINTER; *pnPriority = THREAD_PRIORITY_NORMAL; return S_OK; } STDMETHOD(OnLowResource)(DWORD reserved) { return S_OK; } STDMETHOD(OnProgress)(ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText) { return S_OK; } STDMETHOD(OnStopBinding)(HRESULT hresult, LPCWSTR szError) { return S_OK; } STDMETHOD(GetBindInfo)(DWORD *pgrfBINDF, BINDINFO *pbindInfo) { if (pbindInfo==NULL || pbindInfo->cbSize==0 || pgrfBINDF==NULL) return E_INVALIDARG; *pgrfBINDF = dwBindFlags; //BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA; ULONG cbSize = pbindInfo->cbSize; // remember incoming cbSize memset(pbindInfo, 0, cbSize); // zero out structure pbindInfo->cbSize = cbSize; // restore cbSize pbindInfo->dwBindVerb = BINDVERB_GET; // set verb return S_OK; } STDMETHOD(OnDataAvailable)(DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed) { return S_OK; } STDMETHOD(OnObjectAvailable)(REFIID riid, IUnknown *punk) { return S_OK; } public: static HRESULT Download(BSTR bstrURL, IStream** ppStream) { CComObject > *pbsc; HRESULT hr = CComObject >::CreateInstance(&pbsc); if (SUCCEEDED(hr)) { CComPtr spMoniker; hr = CreateURLMoniker(NULL, bstrURL, &spMoniker); if (SUCCEEDED(hr)) { CComPtr spBindCtx; hr = CreateBindCtx(0, &spBindCtx); if (SUCCEEDED(hr)) { hr = RegisterBindStatusCallback(spBindCtx, static_cast(pbsc), 0, 0L); if (SUCCEEDED(hr)) hr = spMoniker->BindToStorage(spBindCtx, 0, IID_IStream, (void**)ppStream); } } } return hr; } }; HRESULT BindToURL(BSTR bstrURL, IStream** ppStream) { return CBindStatusCallback<>::Download(bstrURL, ppStream); } #endif // __TASKUI_CBSC_H