URLDownloadToFile всегда возвращает S_OK
Я новичок в C++ и пытаюсь написать функцию обновления.
Загрузка с URLDownloadToFile работает без проблем, но если я изменил URL-адрес на недействительный, он по-прежнему возвращает S_OK ... Как я могу проверить, удалась загрузка или нет?
#include <WinInet.h>
#include <iomanip>
int download_file (const TCHAR urldownload[],const TCHAR target[] )
{
DownloadProgress progress;
IBindStatusCallback* callback = (IBindStatusCallback*)&progress;
SCP(40, NULL); cout << target;
HRESULT status = URLDownloadToFile(NULL, urldownload, target, 0, static_cast<IBindStatusCallback*>(&progress));
Sleep(200);
DeleteUrlCacheEntry(urldownload);
wcout << status;
if (status == S_OK) cout << "yes";
else(cout << "Download failed");
Sleep(10000); return 1;
}
class DownloadProgress : public IBindStatusCallback {
public:
HRESULT __stdcall QueryInterface(const IID &, void **) {
return E_NOINTERFACE;
}
ULONG STDMETHODCALLTYPE AddRef(void) {
return 1;
}
ULONG STDMETHODCALLTYPE Release(void) {
return 1;
}
HRESULT STDMETHODCALLTYPE OnStartBinding(DWORD dwReserved, IBinding *pib) {
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE GetPriority(LONG *pnPriority) {
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE OnLowResource(DWORD reserved) {
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE OnStopBinding(HRESULT hresult, LPCWSTR szError) {
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE GetBindInfo(DWORD *grfBINDF, BINDINFO *pbindinfo) {
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE OnDataAvailable(DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed) {
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE OnObjectAvailable(REFIID riid, IUnknown *punk) {
return E_NOTIMPL;
}
virtual HRESULT __stdcall OnProgress(ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
{
//wcout << ulProgress << L" of " << ulProgressMax << endl; Sleep(200);
if (ulProgress != 0 && ulProgressMax != 0)
{
double output = (double(ulProgress) / ulProgressMax)*100;
cout << "\r" << "Downloading: " << fixed << setprecision(2) << output << " % " ; Sleep(20);
}
return S_OK;
}
};
2 ответа
В статье MSDN есть ответ для вас:
URLDownloadToFile
возвращаетсяS_OK
даже если файл не может быть создан и загрузка отменена. Если параметр szFileName содержит путь к файлу, убедитесь, что целевой каталог существует перед вызовомURLDownloadToFile
, Для лучшего контроля за загрузкой и ее прогрессом,IBindStatusCallback
интерфейс рекомендуется.
Вам необходимо предоставить обратный вызов состояния, чтобы получить статус асинхронной операции. Ваш фрагмент кода уже имеет базу. OnProgress
а также OnStopBinding
должен получить вам результат сбоя загрузки.
#include "wininet.h"
DeleteUrlCacheEntry((LPCSTR)url);
HRESULT response = URLDownloadToFile(NULL, (LPCSTR)url, (LPCSTR)default_path, 0, NULL);
надеюсь это сработает