我应该使用 URLDownloadToFile 吗?

Posted

技术标签:

【中文标题】我应该使用 URLDownloadToFile 吗?【英文标题】:Should I use URLDownloadToFile? 【发布时间】:2011-03-03 18:36:25 【问题描述】:

我正在寻找用 C++(在 Windows 上)下载文件的最简单方法。 URLDownloadToFile 听起来很棒,并且不需要我使用 curl 或其他我不需要的胖库 - 这个功能有什么要求?它将在哪个 Windows 上运行?

谢谢!

【问题讨论】:

【参考方案1】:

http://msdn.microsoft.com/en-us/library/ms775123%28VS.85%29.aspx

文档的存在是有原因的。

E:看一下文档,它至少需要 Internet Explorer 3.0 和 Windows 95。很少有计算机不满足这些要求。

E:这里是如何使用此功能的示例。还需要链接Urlmon.lib进行编译:

#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>

#include <windows.h>
#include <Urlmon.h>

int _tmain(int argc, _TCHAR* argv[])

    printf("URLDownloadToFile test function.\n");

    TCHAR url[] = TEXT("http://google.com");

    printf("Url: %S\n", url);

    TCHAR path[MAX_PATH];

    GetCurrentDirectory(MAX_PATH, path);

    wsprintf(path, TEXT("%s\\index.html"), path);

    printf("Path: %S\n", path);

    HRESULT res = URLDownloadToFile(NULL, url, path, 0, NULL);

    if(res == S_OK) 
        printf("Ok\n");
     else if(res == E_OUTOFMEMORY) 
        printf("Buffer length invalid, or insufficient memory\n");
     else if(res == INET_E_DOWNLOAD_FAILURE) 
        printf("URL is invalid\n");
     else 
        printf("Other error: %d\n", res);
    

    return 0;

【讨论】:

我完全同意,但是这个函数位于 MSDN 的 .NET Framework 3.0 部分下,这让我感到困惑(因为这个函数是一个原生的 win32api 函数)。你能告诉我具体的要求吗?感谢您的帮助! 这……不是,不过。它位于 Web 开发 > Internet Explorer 开发 > URL Monikers > URL Monikers > 参考 > 功能下。根本没有.NET。如果你想要一个示例,那可能需要我一点时间,因为我以前从未使用过这个 api。 我添加了一个示例,说明如何使用相关功能。如果你使用COM,你可以得到下载进度,但我不是很熟悉。但是,作为一个简单的下载器,您不需要任何花哨的东西。【参考方案2】:

我在 WTL C++ 应用程序中使用此功能,但尚未遇到任何不支持它的 PC(相关应用程序已安装在数千个客户端上,包括 Windows 2000、XP、Vista 和 Windows 7)。顺便说一句,也没有 .NET 依赖项 - 它隐藏在旧的 Internet Explorer Win32 DLL 中。它使用起来非常简单,可以接受任何 URL,甚至可以使用普通的 DOS 样式文件名(我们有时会使用它从网络共享中获取文件。)

【讨论】:

Rob,这种方法可靠吗?有时当我尝试下载 5MB png 图像时,第一次尝试失败。但奇怪的是,第二次尝试下载文件没有任何问题。请问有什么推荐的吗?【参考方案3】:

您希望如何下载此文件,以及从什么来源下载?如果它来自您自己的来源,我可以想到很多更好的方法,更便携的方法。

如果您希望从自己的源下载,只需在任一侧设置一个套接字,发送文件大小,然后从 fstream 发送一个字符数组,接收字符数组并写入目标 fstream。

【讨论】:

我需要通过 HTTP 下载文件。不提是我的错! 没问题,伙计!希望我能帮上忙。

以上是关于我应该使用 URLDownloadToFile 吗?的主要内容,如果未能解决你的问题,请参考以下文章

IDownloadManager::Download 中的 URLDownloadToFile 错误 (0x80004004)

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

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

获取bing图片并自动设置为电脑桌面背景(使用 URLDownloadToFile API函数)

Windows函数 URLDownloadToFile

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