XLSdk基础教程修改
2015-07-24 16:53
911 查看
简单教程
环境介绍
在开始之前,我们需要搭建开发环境。先下载试用版的SDK(点击下载)。
SDK中提供的示例程序,大致的文件结构如下:
├─ClientDemo.exe
├─xldl.dll
└─download
├──……
└──MiniThunderPlatform.exe
下载引擎的主要逻辑运行在独立进程MiniThunderPlatform.exe中,这样可以减少因为下载引擎运行异常而造成调用者崩溃的风险。
ClientDemo.exe(示例程序主进程)和MiniThunderPlatfrom.exe进程间通信的层次的示意图如下:
ClientDemo.exe使用下载引擎需要加载xldl.dll。然后由xldl.dll与MiniThunderPlatform.exe通信,最终在MiniThunderPlatfrom.exe实现任务的下载。
基本流程
现在就从一个简单的下载程序开始介绍迅雷云加速SDK的基本流程。这个下载程序的要求比较简单, 不考虑各种异常情况。
通过这个例子,就可以知道使用下载引擎创建一个任务的基本流程。下面就是一个简单的下载程序的主要流程:
1.查找xldl.dll,并加载该dll
2.初始化下载引擎
3.创建任务
4.开始下载
5.定时查询任务信息,直到任务下载完成
6.删除任务,释放任务占用内存
7.反初始化下载引擎
示例源码中加入了libcurl库,调用curl_easy_unescape()函数进行解码url,自动获取文件名。方便测试起见,可以去掉这一部分,自己命名一个文件名,后缀要与下载文件的类型一致。
示例源码.cpp:
环境介绍
在开始之前,我们需要搭建开发环境。先下载试用版的SDK(点击下载)。
SDK中提供的示例程序,大致的文件结构如下:
├─ClientDemo.exe
├─xldl.dll
└─download
├──……
└──MiniThunderPlatform.exe
下载引擎的主要逻辑运行在独立进程MiniThunderPlatform.exe中,这样可以减少因为下载引擎运行异常而造成调用者崩溃的风险。
ClientDemo.exe(示例程序主进程)和MiniThunderPlatfrom.exe进程间通信的层次的示意图如下:
ClientDemo.exe使用下载引擎需要加载xldl.dll。然后由xldl.dll与MiniThunderPlatform.exe通信,最终在MiniThunderPlatfrom.exe实现任务的下载。
基本流程
现在就从一个简单的下载程序开始介绍迅雷云加速SDK的基本流程。这个下载程序的要求比较简单, 不考虑各种异常情况。
通过这个例子,就可以知道使用下载引擎创建一个任务的基本流程。下面就是一个简单的下载程序的主要流程:
1.查找xldl.dll,并加载该dll
2.初始化下载引擎
3.创建任务
4.开始下载
5.定时查询任务信息,直到任务下载完成
6.删除任务,释放任务占用内存
7.反初始化下载引擎
示例源码中加入了libcurl库,调用curl_easy_unescape()函数进行解码url,自动获取文件名。方便测试起见,可以去掉这一部分,自己命名一个文件名,后缀要与下载文件的类型一致。
示例源码.cpp:
[code]#include "stdafx.h" #include <Shlwapi.h> #pragma comment(lib,"shlwapi.lib") #include <cstring> #include "iostream" #include <iomanip> #include <stdio.h> #include <tchar.h> #include <windows.h> #include <atlbase.h> #include <atlwin.h> #include <atltypes.h> #include <atlstr.h> #include "xldl.h" #include "DownWrapper.h" #include <curl/curl.h>//可注释 using namespace std; #pragma comment( lib, "libcurl.lib" ) #pragma comment ( lib, "ws2_32.lib" ) #pragma comment ( lib, "winmm.lib" ) #pragma comment (lib, "wldap32.lib") //wstring转string std::wstring s2ws(const std::string& s) { setlocale(LC_ALL, "chs"); const char* _Source = s.c_str(); size_t _Dsize = s.size() + 1; wchar_t *_Dest = new wchar_t[_Dsize]; wmemset(_Dest, 0, _Dsize); mbstowcs(_Dest,_Source,_Dsize); std::wstring result = _Dest; delete []_Dest; setlocale(LC_ALL, "C"); return result; } //string转wstring std::string ws2s(const std::wstring& ws) { std::string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C"; setlocale(LC_ALL, "chs"); const wchar_t* _Source = ws.c_str(); size_t _Dsize = 2 * ws.size() + 1; char *_Dest = new char[_Dsize]; memset(_Dest,0,_Dsize); wcstombs(_Dest,_Source,_Dsize); std::string result = _Dest; delete []_Dest; setlocale(LC_ALL, curLocale.c_str()); return result; } CStringW U2W(const char* utf8) { int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0); CStringW tmp; MultiByteToWideChar(CP_UTF8, 0, utf8, -1, tmp.GetBufferSetLength(len), len); return tmp; } DownWrapper* LoadDll(); void DownloadFile(DownWrapper *pWapper, const std::wstring &wstrUrl, const std::wstring &wstrFilename, const std::wstring &wstrSavePath); int _tmain(int argc, _TCHAR* argv[]) { DownWrapper* pWapper = LoadDll(); if (!pWapper->Init()) //初始化下载引擎 2 { std::cout<<"Error, Init Failed!"<<std::endl; return 1; } //std::wstring urlname = L"http://softdown.hao123.com/soft/H/2015-07-20_hao123_%5Bc=1111%5D__90539569_o2_hao_.exe"; std::wstring urlname = L"ftp://121.17.126.74/data1/ts01/computer/%E5%AD%99%E9%91%ABC++%E6%95%99%E7%A8%8B01.rar"; std::wstring wstrUrl(urlname); std::wstring wstrSavePath(L"E:\\");//保存路径 //若不引用libcurl库,一下代码只需要保留 //std::wstring wstrFileName(wstringurl); //DownloadFile(pWapper, wstrUrl, wstrFileName, wstrSavePath); //-------------------------------------------------------- CURLcode return_code; return_code = curl_global_init(CURL_GLOBAL_WIN32); if (CURLE_OK != return_code) { cerr << "init libcurl failed." << endl; } int pos = urlname.find_last_of('/'); std::wstring str(urlname.substr(pos+1));//获取文件名 std::string stringurl = ws2s(str);//将wstring转为string //使用libcurl转义url为中文,以此为文件名 CURL *curl = curl_easy_init(); if(curl) { int data2len; char *output = curl_easy_unescape( curl,stringurl.c_str(), 0,&data2len); if(output) { std::string str1= (CStringA)U2W(output);//乱码转换 std::string stringurl2(str1); std::wstring wstringurl(s2ws(stringurl2)); std::wstring wstrFileName(wstringurl);//可命名一个文件名.rar DownloadFile(pWapper, wstrUrl, wstrFileName, wstrSavePath); curl_free(output); } } //--------------------------------------------------------- Sleep(600000); pWapper->UnInit(); //卸载下载引擎 7 return 0; } void DownloadFile( DownWrapper* pWapper, const std::wstring &wstrUrl, const std::wstring &wstrFilename, const std::wstring &wstrSavePath) { //初始化新建任务参数 DownTaskParam para; memcpy(para.szTaskUrl, wstrUrl.c_str(), wstrUrl.length()*sizeof(WCHAR)); std::wstring wstrRefUrl = L""; memcpy(para.szRefUrl, wstrRefUrl.c_str(), wstrRefUrl.length()*sizeof(WCHAR)); memcpy(para.szFilename, wstrFilename.c_str(), wstrFilename.length()*sizeof(WCHAR)); memcpy(para.szSavePath, wstrSavePath.c_str(), wstrSavePath.length()*sizeof(WCHAR)); //新建任务 HANDLE hTask = pWapper->TaskCreate(para);//3 std::cout<<"Create New Task"<<std::endl; if (hTask) { std::cout<<"Now Start Task"<<std::endl; pWapper->TaskStart(hTask); //开始任务 4 } else { std::cout<<"Create Task Filed!"<<std::endl; return ; } DownTaskInfo info; while(true) { Sleep(1000); pWapper->TaskQuery(hTask, info); //轮询任务信息 5 float percentTask = 100*info.fPercent; __int64 sizeTask = info.nTotalSize/1048576; int speedTask = info.nSpeed/1024; if(info.nTotalSize!=0) { char currentPercentValue[8]=""; sprintf_s(currentPercentValue,"%-3.2f%%",percentTask); std::cout<<"Size: "<<sizeTask<<"MB" <<", Percent: "<<currentPercentValue <<", Speed: "<<speedTask<<"KB/S"<<std::endl; } if (info.stat == TSC_COMPLETE) { std::cout<<"Total File Size: "<<sizeTask<<"MB"<<std::endl; std::cout<<"Task Success!"<<std::endl; break; } if (info.stat == TSC_ERROR) { std::cout<<"Task Failed!"<<std::endl; break; } } pWapper->TaskDelete(hTask); //删除任务,释放任务占用内存 6 } DownWrapper* LoadDll() { WCHAR szModulePath[MAX_PATH] = {0}; ::GetModuleFileName(NULL, szModulePath, MAX_PATH); ::PathRemoveFileSpec(szModulePath); WCHAR szDllpath[MAX_PATH] = {0}; ::PathCombine(szDllpath, szModulePath, L"xldl.dll"); OutputDebugString(szDllpath); DownWrapper* pWapper = new DownWrapper(szDllpath); return pWapper; }
相关文章推荐
- 关于BufferedReader readline 阻塞的问题
- 【iOS开发系列】九宫格布局
- 发现被蹭网
- 持续集成工具 jenkins是什么
- 最新图解电信欢go的4G+技术,比快更快
- Exchange2010配置-实现邮箱服务器高可用
- 刚学jquery,记下知识点
- poj3373--Changing Digits(DFS+剪枝///记忆化)
- python 打日志学习
- HTTP协议详解
- Android PropertyAnimation官网文档翻译
- Android Adapter推荐写法
- 注意 ExecuteNonQuery() 返回值 问题
- Share folder between windows and ubuntu linux vm from Virtual Box
- 控制别人的程序的按钮和编辑控件等
- 【VBA研究】用SQL语句读取EXCEL数据例程
- 最近微信上很火的小游戏【壹秒】android版——开发分享
- __devexit_p的功能
- dispatch_once认识分析
- Windows Server 2012 R2 Standard序列号