URLDownloadToFile 总是返回 S_OK

Posted

技术标签:

【中文标题】URLDownloadToFile 总是返回 S_OK【英文标题】:URLDownloadToFile always return S_OK 【发布时间】:2015-08-29 16:17:42 【问题描述】:

我是 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;

;

【问题讨论】:

这不是标准的 C++。您使用的是哪个框架/库? 我正在使用 【参考方案1】:

MSDN article has the answer给你:

URLDownloadToFile 会返回S_OK,即使无法创建文件并取消下载。如果szFileName参数中包含文件路径,调用URLDownloadToFile前确保目标目录存在。为了更好地控制下载及其进度,推荐使用IBindStatusCallback 界面

您需要提供一个状态回调来接收异步操作的状态。您的代码 sn-p 已经有了基础。 OnProgressOnStopBinding 应该会给你下载失败的结果。

【讨论】:

哦,好吧,谢谢我之前没有读过那行-.-...我正在使用 IBindStatusCallback,为此使用了一个代码,因为我不明白该类是如何工作的...所以我仍然卡住了,那一点..有没有简单的方法可以将调用发送回我的 void update() 函数? 追踪每次调用状态回调到cout,你就会明白了。 你能给我一个例子吗?我想不通:/ 你已经有了它的代码。你到底有什么问题?请更新您的问题并提供更多详细信息。 @Zerray:您可能认为您正在使用IBindStatusCallback 接口。但是,您对QueryInterface 的实现会返回E_NOINTERFACE。因此,URLDownloadToFile 可能不同意您传入的实际上是所需的IBindStatusCallback。您可能想阅读Introduction to COM and ATL。

以上是关于URLDownloadToFile 总是返回 S_OK的主要内容,如果未能解决你的问题,请参考以下文章

我应该使用 URLDownloadToFile 吗?

Windows函数 URLDownloadToFile

URLDownloadToFile 生成编译错误:未定义子或函数

C ++ WinAPI URLDownloadToFile(urlmon)错误[重复]

URLDownloadToFile 失败,代码为 0x800c0008 (INET_E_DOWNLOAD_FAILURE)

如何下载规范修订版?