迅雷下载库的网址:http://thunderplatform.xunlei.com
// 下载队列的大小,决定同时开启下载线程的数量
const int LIMIT = 2;
struct Down
{
// 解析出来的下载地址
CString strDownURL;
// 保存的路径
CString strSavePath;
};
struct Flag
{
DWORD dwFlag; // 记录下载线程实时状态
LONG lTaskId; // 记录对应任务ID号
ULONGLONG ullFileSize; // 下载文件大小
ULONGLONG ullRecvSize; // 已下载大小
};
class CDownload
{
private:
// 保存下载的日志信息
std::vector<CString> strLogArr;
// 解析XML文件
//void Analysis (LPCTSTR lpPathXML, LPCTSTR lpBegin, LPCTSTR lpEnd);
void Analysis (LPCTSTR lpPathXML);
// 开始下载
void Start (void);
// 调用迅雷的下载接口
void CreateDownThread (int n);
// 下载任务查询监控线程
static void DownQury (LPVOID ptr);
// 保存日志
void SaveLog (LPCTSTR lpPathAndName);
public:
// 保存解析出来的下载队列
std::vector<Down> strDownArr;
// 记录最新的下载位置
int m_nIndex;
// 下载队列的大小,对应位为1时,该下载位为空,可以启动新的下载线程
struct Flag Flags[LIMIT];
// 总共的下载数
int m_nTotal;
// 失败的下载数
int m_nFail;
// 成功的下载数
int m_nSuccess;
CDownload();
~CDownload();
BOOL DownloadFilesByXML(LPCTSTR lpPahtXML);
};
</div>
// 包含XTP界面库头文件
#include "XTToolkitPro.h"
CDownload::CDownload()
{
// 初始化
m_nIndex = 0;
// 初始化为没有下载线程
for (int n=0; n<LIMIT; n++)
{
Flags[n].dwFlag = 1;
Flags[n].lTaskId = n;
}
m_nSuccess = 0;
m_nTotal = 0;
m_nFail = 0;
}
CDownload::~CDownload()
{
}
BOOL CDownload::DownloadFilesByXML(LPCTSTR lpPathXML)
{
DWORD dwRet = XL_SUCCESS;
// 检测XML文件是否存在
if (!PathFileExists(lpPathXML))
{
::MessageBox(NULL, _T("XML文件不存在!"), _T("友情提示"), MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
// 解析XML文件
Analysis(lpPathXML);
// 统计下载链接数
m_nTotal = strDownArr.size();
// 开始下载
Start();
return TRUE;
}
//void CDownload::Analysis(LPCTSTR lpPathXML, LPCTSTR lpBegin, LPCTSTR lpEnd)
void CDownload::Analysis(LPCTSTR lpPathXML)
{
// 读取XML文件
CXTPPropExchangeXMLNode px(TRUE, NULL, _T("DownLoadInfo"));
if (!px.LoadFromFile(lpPathXML))
{
::MessageBox(NULL, _T("打开XML文件出错!"), _T("友情提示"), MB_OK|MB_ICONEXCLAMATION);
return;
}
if (!px.OnBeforeExchange())
{
::MessageBox(NULL, _T("OnBeforeExchange false!"), _T("友情提示"), MB_OK|MB_ICONEXCLAMATION);
return;
}
px.SetCompactMode(TRUE);
CXTPPropExchangeEnumeratorPtr enumItem(px.GetEnumerator(_T("Item")));
POSITION posItem = enumItem->GetPosition();
CString strLocalName;
Down down;
// 遍历所有的结点
while (posItem)
{
CXTPPropExchangeSection sec(enumItem->GetNext(posItem));
if (sec->IsLoading())
{
PX_String(sec->GetSection(_T("URL")), NULL, down.strDownURL);
PX_String(sec->GetSection(_T("LocalPath")), NULL, down.strSavePath);
PX_String(sec->GetSection(_T("LocalName")), NULL, strLocalName);
down.strSavePath += strLocalName;
// 路径转换
down.strSavePath.Replace('/', '\\');
strDownArr.push_back(down);
}
}
}
// 下载任务查询
void CDownload::DownQury (LPVOID ptr)
{
CDownload* pDown = (CDownload*)ptr;
bool nSign = true;
DWORD dwRst;
TCHAR errorBuf[500];
DWORD dwSize = 500;
CString strLog;
// 如果没有下载完成一直下载
while ((pDown->m_nIndex < (pDown->strDownArr).size()) || nSign)
{
int n = 0;
LONG temp = -1;
nSign = false;
while (n<LIMIT)
{
switch(pDown->Flags[n].dwFlag)
{
// 没有下载,开始新的下载
&nb