libcurl开源库在Win32程序中使用下载文件显示进度条实例
一、配置工程引用libcurl库
#define CURL_STATICLIB #include "curl/curl.h" #ifdef _DEBUG
#pragma comment(lib,"lib\\Debug\\libcurld.lib")
#else
#pragma comment(lib,"lib\\Release\\libcurl.lib")
#endif
头文件文件夹放到工程目录下
二、初始化函数
1.CURLcode curl_global_init(long flags);
这个函数只能用一次。(其实在调用curl_global_cleanup
函数后仍然可再用)
如果这个函数在curl_easy_init函数调用时还没调用,它讲由libcurl库自动调用,所以多线程下最好主动调用该函数以防止在线程中curl_easy_init时多次调用。
参数:flags
CURL_GLOBAL_ALL
//初始化所有的可能的调用。
CURL_GLOBAL_SSL
//初始化支持 安全套接字层。
CURL_GLOBAL_WIN32
//初始化win32套接字库。
CURL_GLOBAL_NOTHING
//没有额外的初始化。
描述:在结束libcurl使用的时候,用来对curl_global_init做的工作清理。类似于close的函数。
描述:
curl_easy_init用来初始化一个CURL的指针(有些像返回FILE类型的指针一样).
相应的在调用结束时要用curl_easy_cleanup函数清理.
一般curl_easy_init意味着一个会话的开始.
它会返回一个easy_handle(CURL*对象), 一般都用在easy系列的函数中
描述:
这个调用用来结束一个会话.与curl_easy_init配合着用.
参数:CURL类型的指针
CURL *curl;
CURLcode res;
FILE *outfile;
char *progress_data = "*";//给回调函数传参数
curl = curl_easy_init();
if(curl)
{
outfile = fopen("test.txt", "wb");
curl_easy_setopt(curl, CURLOPT_URL,"http://10.10.1.4/d/c00000000000039/2017-4-22/test.txt");
curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_write_func);
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE);
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, my_progress_func);
curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, (LPTSTR)CommonUtils::UnicodeToANSI(m_strPiID.GetBuffer()).c_str());
res = curl_easy_perform(curl);
fclose(outfile);
/* always cleanup */
curl_easy_cleanup(curl);
}
//这个函数是为了符合CURLOPT_WRITEFUNCTION而构造的
//完成数据保存功能
static size_t my_write_func(void *ptr, size_t size, size_t nmemb, FILE *stream);
//这个函数是为了符合CURLOPT_PROGRESSFUNCTION而构造的
//显示文件传输进度,t代表文件大小,d代表传 输已经完成部分
static int my_progress_func(void *ptr,double t, /* dltotal */double d, /* dlnow */double ultotal,double ulnow);
size_t CDownloadFileThread::my_write_func(void *ptr, size_t size, size_t nmemb, FILE *stream)
{
return fwrite(ptr, size, nmemb, stream);
}
int CDownloadFileThread::my_progress_func(char *progress_data,
double t, /* dltotal */
double d, /* dlnow */
double ultotal,
double ulnow)
{
//printf("%s %g / %g (%g %%)\n", progress_data, d, t, d*100.0/t);
//SendMessage 发送显示
return 0;
}
libcurl开源库在Win32程序中使用下载文件显示进度条实例的更多相关文章
- 【转】C#中使用aria2c进行下载并显示进度条
[转自] C#中使用aria2c进行下载并显示进度条 - 云平台知识库 - 博客园https://www.cnblogs.com/littlehb/p/5782714.html 正则表达式的生成网站: ...
- C#中使用aria2c进行下载并显示进度条
正则表达式的生成网站: http://www.txt2re.com/index-csharp.php3 Aria2c下载地址: https://github.com/aria2/aria2/relea ...
- libcurl开源库在Win7 + VS2012环境下编译、配置详解 以及下载文件并显示下载进度 demo(转载)
转载:http://blog.csdn.net/fengshuiyue/article/details/39530093(基本教程) 转载:https://my.oschina.net/u/14207 ...
- libCURL开源库在VS2010环境下编译安装,配置详解
libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...
- CURL库在C++程序中的运用浅析
最近由于要做一个爬虫项目,要对很多网站进行爬取,所以一直都在看这方面的文章.在翻阅了很多资料后,下载了一个curl库,着实对项目有了很大的帮助. 一.LibCurl基本编程框架 二.一些基本的函数 三 ...
- win32程序中简单应用mfc
今日写程序在win32中用CRect发现报错,突然想起来.要引入mfc库.想重新建立一个工程添加对mfc的支持.发现选项不能选.查资料后发现. 在win32程序中简单应用mfc库,只需要简单的引入&l ...
- WinForm程序中两份mdf文件问题的解决
在项目中用程序中嵌入mdf文件的方式来进行SQLServer数据库开发非常方便,用来发布开源项目等很方便,点击就可以运行,免部署,特别是在教学中用起来更加方便,老师不用先将数据库文件detach再发给 ...
- 程序中的.htaccess文件是做什么的
程序中的.htaccess文件是做什么的 一.总结 一句话总结: htaccess=ht(Hypertext)+access=超文本入口 覆盖Apache服务器的默认配置 .htaccess(超文本访 ...
- ASP程序中调用Now()总显示“上午”和“下午”,如何解决?
ASP程序中调用Now()总显示这样的格式:“2007-4-20 下午 06:06:38”,我要的正确格式为“2007-4-20 18:06:38”,我已经通过控制面板==>区域和语言选项==& ...
随机推荐
- c# listView中列宽随列中的内容自动调整
1.创建一个类 ListViewAutoChange 作用:自动调整ListView的列宽 代码如下:(内容很容易理解,没加注释) using System; using System.Collec ...
- 建立一个更高级别的查询 API:正确使用Django ORM 的方式(转)
add by zhj: 本文作者是DabApps公司的技术主管,作者认为在view中直接使用Django提供的ORM查询方法是不好的,我对此并不赞同,可能作者 写这篇文章是给Django的初学者看,所 ...
- /etc/rc.d/rc.local 自定义开机启动程序
/etc/rc.d/rc.local 用于用户自定义开机启动程序,可以往里写开机要执行的命令或脚本,线上的配置如下: [root@localhost ~]$ cat /etc/rc.d/rc.loca ...
- 2F+1模式才是高可用 途牛旅游网 还是通过proxy层
2F+1模式才是高可用 途牛旅游网 还是通过proxy层 f f f f f f f f f
- 测试Celery 在Windows中搭建和使用的版本
官网:http://docs.celeryproject.org/en/latest/faq.html#does-celery-support-windows 描述如下:表示Celery 4.0版本以 ...
- vue-router中参数传递 && 编程式导航 && 坑 && beforeRouteEnter
第一部分: vue-router参数传递 通过router-link我们可以向路由到的组件传递参数,这在我们实际使用中时非常重要的. 路由: { path:"/DetailPage" ...
- ElasticSearch排序Java api简单Demo
代码: String time1 = ConstValue.GetCurrentDate(); SortBuilder sortBuilder = SortBuilders.fieldSort(&qu ...
- 多张图片合成一个tif
可以利用ACDSEE6.0打开你要合成的多张图片,CTRL全部选中,打开工具--转化文件格式-选择格式tif---所有页----合并---
- mysql的转储SQL文件
1.转储数据库的SQL文件,有两个选择,一是转储结构:另一种是转储数据与结构: 2.以上两种转储都不会将事件(定时器)转储,所以特别注意这个,否则以为将数据库备份完了,其实漏掉了所有的事件代码,所以需 ...
- ARM中的汇编指令
Arm指令,32位的指令集,一共有16条的基本指令,每条指令都可以按条件执行, 指令都是32bit的,高四位是条件码[31:28], Thumb指令,16位的指令集,执行效率比arm指令集要低,但是节 ...