我应该使用 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)