2015-08-29 4 views
0

Iam new to C++ и попытайтесь написать функцию обновления.URLDownloadToFile allways return S_OK

Загрузка с помощью URLDownloadToFile работает без проблем, но если я изменил URL-адрес на недействительный, он по-прежнему возвращал S_OK ... Как проверить, поддерживает ли загрузка succede или нет?

#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; 
} 
}; 
+0

Это не стандарт C++. Какую структуру/библиотеку вы используете? –

+0

И использование Zerray

ответ

2

MSDN article has the answer для вас:

URLDownloadToFile возвращает S_OK, даже если файл не может быть создан, и загрузка будет отменена. Если параметр szFileName содержит путь к файлу, убедитесь, что каталог назначения существует до вызова URLDownloadToFile. Для лучшего контроля над загрузкой и ее прогрессом рекомендуется a IBindStatusCallback..

Чтобы получить статус асинхронной операции, вам необходимо выполнить обратный вызов состояния. У вашего фрагмента кода уже есть база. OnProgress и OnStopBinding должны получить результат загрузки.

+0

да ладно, ТНХ я не читал эту строку перед -.-... Иам с помощью IBindStatusCallback, используется код съязвил по этой причине я не понимаю, как работает этот класс ... так Iam еще застрял и эта точка .. нет ли простого способа отправить вызов обратно моей функции void update()? – Zerray

+0

Отслеживайте каждый вызов обратного вызова статуса 'cout', и вы получите эту идею. –

+0

Не могли бы вы дать мне пример? Я не могу понять:/ – Zerray

 Смежные вопросы

  • Нет связанных вопросов^_^