C语言实现 IBindStatusCallBack接口, 实现带进度下载
#include <stdio.h> #include <urlmon.h> #pragma comment (lib, "urlmon.lib") HRESULT ( STDMETHODCALLTYPE QueryInterface )( IBindStatusCallback * This, /* [in] */ REFIID riid, /* [iid_is][out] */ void **ppvObject) { return E_NOTIMPL; } ULONG ( STDMETHODCALLTYPE AddRef )( IBindStatusCallback * This) { return E_NOTIMPL; } ULONG ( STDMETHODCALLTYPE Release )( IBindStatusCallback * This) { return E_NOTIMPL; } HRESULT ( STDMETHODCALLTYPE OnStartBinding )( IBindStatusCallback * This, /* [in] */ DWORD dwReserved, /* [in] */ IBinding *pib) { return E_NOTIMPL; } HRESULT ( STDMETHODCALLTYPE GetPriority )( IBindStatusCallback * This, /* [out] */ LONG *pnPriority) { return E_NOTIMPL; } HRESULT ( STDMETHODCALLTYPE OnLowResource )( IBindStatusCallback * This, /* [in] */ DWORD reserved) { return E_NOTIMPL; } HRESULT ( STDMETHODCALLTYPE OnProgress )( IBindStatusCallback * This, /* [in] */ ULONG ulProgress, /* [in] */ ULONG ulProgressMax, /* [in] */ ULONG ulStatusCode, /* [in] */ LPCWSTR szStatusText) { if (ulProgress > 0) { printf("Downloaded %d of %d bytes\n", ulProgress, ulProgressMax); fflush(stdout); } return S_OK; } HRESULT ( STDMETHODCALLTYPE OnStopBinding )( IBindStatusCallback * This, /* [in] */ HRESULT hresult, /* [unique][in] */ LPCWSTR szError) { return E_NOTIMPL; } HRESULT ( STDMETHODCALLTYPE GetBindInfo )( IBindStatusCallback * This, /* [out] */ DWORD *grfBINDF, /* [unique][out][in] */ BINDINFO *pbindinfo) { return E_NOTIMPL; } HRESULT ( STDMETHODCALLTYPE OnDataAvailable )( IBindStatusCallback * This, /* [in] */ DWORD grfBSCF, /* [in] */ DWORD dwSize, /* [in] */ FORMATETC *pformatetc, /* [in] */ STGMEDIUM *pstgmed) { return E_NOTIMPL; } HRESULT ( STDMETHODCALLTYPE OnObjectAvailable )( IBindStatusCallback * This, /* [in] */ REFIID riid, /* [iid_is][in] */ IUnknown *punk) { return E_NOTIMPL; } static const IBindStatusCallbackVtbl IBindStatusCallback_Vtbl = { QueryInterface, AddRef, Release, OnStartBinding, GetPriority, OnLowResource, OnProgress, OnStopBinding, GetBindInfo, OnDataAvailable, OnObjectAvailable }; int main(int argc, char *argv[]) { HRESULT hr; IBindStatusCallback MyCallback; MyCallback.lpVtbl = (IBindStatusCallbackVtbl *)&IBindStatusCallback_Vtbl; hr = URLDownloadToFile(NULL, "http://www.baidu.com/index.php", "index.php", 0, &MyCallback); if (hr != S_OK) { printf("Error: %X\n", hr); } return 0; }
女孩不哭(QQ:191035066)@2012-05-02 16:05:03 @ http://www.cnblogs.com/nbsofer