windows下使用libcurl的整理

最近需要在项目中使用c++的下载,挑选了curl这个开源的库来处理下载的,本人英语是相当的差,使用的平台又是windows下面的,所以记录一下,也为其他需要的朋友避免走弯路。

1.库的编译问题,如果你选择官网下载最新的版本,那么你编译的时候还需要去下载openssl的源码,还有zlib,ssh2等一些东西,这些网上都有很多的方法解决,我去下载过最新的,折腾了一天,勉强算成功了。最后我在另外一个朋友的博客上面下载了一个curl-7.26.0的版本,这个版本可以直接编译,省去了很多麻烦和时间。(如果你有时间,你可以去下载最新的版本,然后好好编译,这对你自己还是很有帮助的)

2.官网确实有文档和例子,但是我英语比较差,所以看起来很吃力,基本都是在调试摸索的,还有例子基本是基于c的,我需要整理成c++的。(英文真的很重要)

3.多线程的问题还有就是暂停和停止下载的问题,网上很多源码都有下载的例子,但是关于暂停和取消下载的比较少,可能这个太容易了吧,但是对我来说不容易,我折腾了几天。

下面是我简单封装好的c++的使用curl下载的类,代码不是很复杂,直接添加到项目再把库文件设置好就可以直接使用,为了调用方便,使用的FastDelegate这个来替代回调函数。(公司有加密,使用代码只能以文本添加)

接下来是源码  curlFactory.h 头文件   这个类主要是提供构造和销毁下载类,并且初始化全局curl。

#pragma once

#ifdef WIN32
#include<iostream>
#include<windows.h>
#endif

#define CURL_STATICLIB
#include "curl/curl.h"
#ifdef _DEBUG 
#pragma comment(lib, "./curlExtend/curl/libcurld.lib") 
#else 
#pragma comment(lib, "./curlExtend/curl/libcurl.lib") 
#endif
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "wldap32.lib")

#include "curlDownload.h"

class locker
{
public:
 inline locker() { m_hMutex=CreateMutex(NULL,FALSE,NULL); printf("Locker::Locker() ") ;}
 inline ~locker() { CloseHandle(m_hMutex); }
 inline void lock() { WaitForSingleObject(m_hMutex, INFINITE); }
 inline void unlock() { ReleaseMutex(m_hMutex); }
private:
 HANDLE m_hMutex;
};

class curlFactory
{
public:
 static curlFactory* getInstance();
 static void destroyInstance();
 curlDownload *newcurlDownload(std::string url,std::string savepath);
 curlDownload *newcurlDownload();
 void delcurlDownload(curlDownload *& pObj);
protected:
 curlFactory(void);
 ~curlFactory(void);
private:
 static curlFactory* m_instance;
};

//

下面是curlFactory.cpp

#include "curlFactory.h"

locker llock;
curlFactory* curlFactory::m_instance = NULL

curlFactory::curlFactory(void)
{
}

curlFactory::~curlFactory(void)
{
}

curlFactory* curlFactory::getInstance()
 {
  if(NULL == m_instance)
  {
   llock.lock();
   if(NULL == m_instance)
   {
    m_instance = new curlFactory();
    curl_global_init(CURL_GLOBAL_ALL); // 避免多线程的时候出错
   }
   llock.unlock();
  }
  return m_instance;
 }

void curlFactory::destroyInstance()
{
 if (m_instance)
 {
  curl_global_cleanup();
  delete m_instance;
  m_instance = NULL;
 }
}

curlDownload * curlFactory::newcurlDownload(std::string url,std::string savepath)
{
 curl

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值