需要使用到URLDownloadToFile()函数,该函数在头文件<urlmon.h>中声明。

URLDownloadToFile()函数的定义如下:

 HRESULT URLDownloadToFile(
LPUNKNOWN pCaller,
LPCTSTR szURL,
LPCTSTR szFileName,
DWORD dwReserved,
LPBINDSTATUSCALLBACK lpfnCB
);

Parameters(参数含义):


pCaller

Pointer to the controlling IUnknown interface of the calling Microsoft ActiveX component (if the caller is an ActiveX component).

Microsoft ActiveX控件的接口的指针,如果不是控件,则为NULL

szURL

Pointer to a string value containing the URL to be downloaded. Cannot be set to NULL

要下载的url地址,不能为空

szFileName

Pointer to a string value containing the name of the file to create for bits that come from the download.

下载后保存的文件名

dwReserved

Reserved. Must be set to 0.

保留字段,必须为0

lpfnCB

Pointer to the caller's IBindStatusCallback interface. URLDownloadToFile calls this interface's IBindStatusCallback::OnProgress method on a connection activity, including the arrival of data. IBindStatusCallback::OnDataAvailable is never called.

下载进度状态回调

Return Value
Returns one of the following values.
S_OK : The download started successfully.
E_OUTOFMEMORY: The buffer length is invalid, or there is insufficient memory to complete the operation.
INET_E_DOWNLOAD_FAILURE:The specified resource or callback interface was invalid.

 
由于函数的参数使用的是LPWSTR,而我们常用的是string,所以用到了MultiByteToWideChar()函数将string转为LPWSTR
 
代码如下

 /*
@author:CodingMengmeng
@theme:C++根据图片url下载图片
@time:2017-1-6 22:58:00
@blog:http://www.cnblogs.com/codingmengmeng/
*/
#include <tchar.h>
#include <iostream>
#include <urlmon.h>
/*
#pragma comment(lib,"urlmon.lib")作用:
连接静态库到项目中,效果等同于:
项目属性——链接器——输入——附加依赖项中加入这个lib
(头文件<urlmon.h>中只是包含了数据结构和函数声明,是编译阶段;
链接阶段将从静态库中恢复这些函数和数据并把他们和应用程序中的其它模块组合在一起生成可执行文件,
该过程称为“静态链接”)
*/
#pragma comment(lib,"urlmon.lib")
using namespace std; int _tmain(int argc, char* argv[])
{
string url = "http://pic104.nipic.com/file/20160715/6171480_185807154956_2.jpg";
size_t len = url.length();//获取字符串长度
int nmlen = MultiByteToWideChar(CP_ACP, , url.c_str(), len + , NULL, );//如果函数运行成功,并且cchWideChar为零,
//返回值是接收到待转换字符串的缓冲区所需求的宽字符数大小。
wchar_t* buffer = new wchar_t[nmlen];
MultiByteToWideChar(CP_ACP, , url.c_str(), len + , buffer, nmlen);
HRESULT hr = URLDownloadToFile(NULL, buffer,_T("E:\\C++lianxi\\Blog\\urlDownload2File\\urlDownload2File\\sky.jpg"), , NULL);
if (hr == S_OK)
{
cout << "ok" << endl;
}
return ;
}

运行结果

程序输出ok,且在指定目录中也保存了下载到的图片。

以上。

C++根据图片url下载图片的更多相关文章

  1. java通过图片URL下载图片

    public InputStream getInputStream(String imgUrl) { InputStream inputStream = null; try{ HttpURLConne ...

  2. 从url下载图片--java与python实现方式比较

    从url下载图片--java与python实现方式比较 博客分类: 技术笔记小点滴 javapython图片下载  一.java的实现方式 首先读取图片 //方式一:直接根据url读取图片 priva ...

  3. JAVA 通过url下载图片保存到本地

    //java 通过url下载图片保存到本地 public static void download(String urlString, int i) throws Exception { // 构造U ...

  4. Java学习笔记——IO操作之以图片地址下载图片

    以图片地址下载图片 读取给定图片文件的内容,用FileInputStream public static byte[] mReaderPicture(String filePath) { byte[] ...

  5. IOS开发-UI学习-根据URL显示图片,下载图片的练习(button,textfield,image view,url,data)

    编写一个如下界面,实现: 1.在文本输入框中输入一个网址,然后点击显示图片,图片显示到UIImageView中. 2.点击下载,这张显示的图片被下载到手机的Documents文件夹下的Dowmload ...

  6. QT通过url下载图片到本地

    /* strUrl:下载图片时需要的url strFilePath:下载图片的位置(/home/XXX/YYY.png) */ void ThorPromote::downloadFileFromUr ...

  7. 根据URL地址获取对应的HTML,根据对应的URL下载图片

    核心代码(获取HTML): #region 根据URL地址获取信息GET public static String GetResult(string url) { return GetResult(u ...

  8. js 根据url 下载图片

    downloadIamge(imgsrc, name) {//下载图片地址和图片名 let image = new Image(); // 解决跨域 Canvas 污染问题 image.setAttr ...

  9. vue.js如何根据后台返回来的图片url进行图片下载

    最近在做一个前端vue.js对接的功能模块时,需要实现一个下载图片的功能,后台返回来的是一串图片url,试了很多种方法,发现点击下载时出来的效果都是跳着到一个新的图片网页,后来经过一番琢磨,终于解决了 ...

随机推荐

  1. POJ2175 Evacuation Plan

    Evacuation Plan Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4617   Accepted: 1218   ...

  2. Java学习笔记之方法重载

    被重载的方法必须具有不同的参数列表.不能基于不同修饰符或返回值类型来重载方法. package welcome; public class TestMethodOverloading { public ...

  3. Canvas绘制时钟

    ①首先在HTML的body标签中添加一个canvas标签,用于绘制时钟. <canvas id="myCanvas" width="600" height ...

  4. easyui如何动态改变列的编辑属性

    动态改变列的编辑属性 var tt=$('#dg').datagrid('getColumnOption', 'yearContent'); //通过列名获得此列 tt.editor={type:'t ...

  5. svn: E200007: Runner for 'org.tmatesoft.svn.core.wc2.SvnMerge' command have not been found; probably not yet implement in this API.

    myeclipse分支合并主干(分支->team->合并->选择主干)的时候出现这个错误: svn: E200007: Runner for 'org.tmatesoft.svn.c ...

  6. 【原创】CSS高效开发实战:CSS 3、LESS、SASS、Bootstrap、Foundation --读书笔记(5)使用放射渐变制作光影效果

    阴影效果通常用来表现光线投射在物体上的感觉,如果想制作一个如图5.19所示的文字光影效果,就可以使用背景的线性渐变进行构建. 图5.19可以看到有类似光束照射文字的效果,很好地突出了文字.这实现起来很 ...

  7. MAC下Homebrew的安装

    1.Homebrew是啥东东? Homebrew的官方网站http://brew.sh/index.html上有这么一句“Homebrew installs the stuffyouneed that ...

  8. MySQL自增ID 起始值 修改方法

    在mysql中很多朋友都认为字段为AUTO_INCREMENT类型自增ID值是无法修改,其实这样理解是错误的,下面介绍mysql自增ID的起始值修改与设置方法. 通常的设置自增字段的方法: 创建表格时 ...

  9. C和指针 第十六章 标准函数库 信号

    信号名<signal.h> 程序中大多数错误都是程序本身导致的,但是,有些程序遇到的事件却不是程序本身所引发的.比如用户终止程序,程序无法预知此类事件发生的情况,信号就是为了对此类事件做出 ...

  10. web.xml添加编码过滤器

    解决前后台交互汉字乱码 在项目中的web.xml中添加如下代码: <filter> <filter-name>CharacterEncodingFilter</filte ...