从示例代码的流程来看,示例文件的下载经历了以下几个步骤:初始化下载引擎(XL_Init(void))——>初始化下载参数(DownTaskParam)——>新建任务(XL_CreateTask(DownTaskParam &stParam))——>开始下载任务(XL_StartTask(HANDLE hTask))——>轮询任务信息(XL_QueryTaskInfoEx(HANDLE hTask, DownTaskInfo & stTaskInfo))——>删除任务(XL_DeleteTask(HANDLE hTask))——>:卸载下载引擎(XL_UnInit(void))。

初始化下载引擎会载入xldl.dll文件然后拉起MiniThunderPlatform.exe子进程,真正执行下载任务的是该子进程。注意:“初始化下载引擎”必须与“卸载下载引擎”成对出现。下载参数(DownTaskParam)是个结构体,包含了任务URL、下载保存文件名、文件保存目录等信息;新建任务用来创建任务,调用该方法后并不会马上开始下载,而是调用开始下载任务方法才会开始执行下载。开始下载任务,异步方法。轮询任务信息,查询任务当前的信息,包括下载文件总大小、下载进度、下载速度等信息。删除任务,销毁任务、释放资源。卸载下载引擎,通知MiniThunderPlatform.exe子进程退出。

如果直接复制粘贴下载的示例源码是无法正常运行的,编译会不通过,因为示例代码缺少DownWrapper类的定义。在源代码中,初始化、新建、开始等方法都是通过DownWrapper类对象来调用的,但是这个示例代码没有提供这个类的定义。从类名可以看出,这个类是个包装类,将xldl.dll中常用的操作都包装在里面方便调用。虽然示例代码无法运行,但是提供了一个思路。那么我可以用C#代码来创建一个类似的包装类,实现一样的功能。

想法是好的,但是操作起来却异常麻烦。在新建任务时需要传入DownTaskParam类型的对象作为实参,但是这个DownTaskParam只能在C#中自己构建一个对应的结构体。构建过程相当痛苦,折腾半天也没有实现匹配,各种异常。异常消息每个字我都认识,合在一起我就不知道是什么意思了。要么就是程序能跑,但是死活得不到结果,各种蛋疼,最后选择放弃,另择他路。

实在不行就自己写C++代码来构建一个模块,把xldl.dll里的方法塞进去,自己做个动态链接库把需要调用的方法导出来。这个想法好像也行,但是我的C++代码水平堪忧,写个Hello World还可以,写其他的嘛。。。。死马当活马医了,破罐子破摔,反正也没其他法子了 。首要问题是先把示例代码跑起来,再进行下一步操作。既然没有给DownWrapper类的定义,那就自己实现xldl.dll文件的导入、初始化引擎等方法的封装。网上查了点资料,然后写了一些代码测试,真被我捣鼓出来了。

  1 // TestThunderDownloading.cpp : 定义控制台应用程序的入口点。
  2 //
  3 #include"stdafx.h"
  4 #include<Windows.h>
  5 #include<Math.h>
  6 #include<iostream>
  7 #include<stdio.h>
  8 #include<tchar.h>
  9 #include<tchar.h>
 10 #include<Shlwapi.h>
 11 #include"assert.h"
 12 #pragma comment(lib,"shlwapi.lib")
 13 #include"xldl.h"
 14
 17 typedef BOOL (*Init)(void);
 18 typedef BOOL (*UnInit)(void);
 19 typedef HANDLE (*CreateTask)(DownTaskParam &stParam);
 20 typedef BOOL (*DeleteTask)(HANDLE);
 21 typedef BOOL (*StartTask)(HANDLE);
 22 typedef BOOL (*QueryTaskInfo)(HANDLE hTask, DownTaskInfo & stTaskInfo);
 23
 24 void DownloadFile(HMODULE &module, const std::wstring &wstrUrl,const std::wstring &wstrFilename,const std::wstring &wstrSavePath);
 25
 29 int _tmain(int argc,  _TCHAR* argv[])
 30 {
 31     assert(argc>= 3);
 42     HMODULE  hdll  = LoadLibraryA("xldl.dll");
 43     Init inital;
 44     if (hdll)
 45     {
 46         inital = (Init)GetProcAddress(hdll, "XL_Init");
 47         if (!inital())   //初始化下载引擎 2
 48         {
 49             std::cout<<"Error, Init Failed!"<<std::endl;
 50             return 1;
 51         }
 52     }
 53
 54     std::wstring wstrUrl(argv[1]);
 55     std::wstring wstrSavePath(argv[2]);
 56     std::wstring wstrFileName(argv[3]);
 57
 58     DownloadFile(hdll,wstrUrl, wstrFileName, wstrSavePath);
 59
 63     UnInit uninit = (UnInit)GetProcAddress(hdll, "XL_UnInit");
 64     uninit();   //卸载下载引擎 7
 65     return 0;
 66 }
 67 //
 68 void DownloadFile(HMODULE &hdll, const std::wstring &wstrUrl,const std::wstring &wstrFilename,const std::wstring &wstrSavePath)
 69 {
 70     //初始化新建任务参数
 71     DownTaskParam para;
 72     memcpy(para.szTaskUrl,wstrUrl.c_str(), wstrUrl.length()*sizeof(WCHAR));
 73     std::wstring wstrRefUrl = L"";
 74     memcpy(para.szRefUrl, wstrRefUrl.c_str(), wstrRefUrl.length()*sizeof(WCHAR));
 75     memcpy(para.szFilename, wstrFilename.c_str(), wstrFilename.length()*sizeof(WCHAR));
 76     memcpy(para.szSavePath, wstrSavePath.c_str(), wstrSavePath.length()*sizeof(WCHAR));
 77
 81     //新建任务
 82     CreateTask create = (CreateTask)(GetProcAddress(hdll, "XL_CreateTask"));
 83     HANDLE hTask = create(para);//3
 84     std::cout<<"Create New Task"<<std::endl;
 85     if (hTask)
 86     {
 87         std::cout<<"Now Start Task"<<std::endl;
 89
 90         StartTask startTask = (StartTask)(GetProcAddress(hdll, "XL_StartTask"));
 91
 92         startTask(hTask); //开始任务 4
 93     }
 94     else
 95     {
 96         std::cout<<"Create Task Filed!"<<std::endl;
 97         return ;
 98     }
106     DownTaskInfo info;
107     while(true)
108     {
109         Sleep(1000);
110
111         QueryTaskInfo taskInfo = (QueryTaskInfo)(GetProcAddress(hdll, "XL_QueryTaskInfo"));
114         taskInfo(hTask, info);    //轮询任务信息 5
115
116         std::cout<<"Size: "<<info.nTotalSize
117         <<", Percent: "<<info.fPercent
118         <<", Speed: "<<info.nSpeed<<std::endl;
129         if (info.stat == TSC_COMPLETE)
130         {
131             std::cout<<"Total File Size: "<<info.nTotalSize<<std::endl;
132             std::cout<<"Task Success!"<<std::endl;
133             break;
134         }
135         else if (info.stat == TSC_ERROR)
136         {
137             std::cout<<"Task Failed!"<<std::endl;
138             break;
139         }
140
141     }
142
148     DeleteTask deleteTask = (DeleteTask)(GetProcAddress(hdll, "XL_DeleteTask"));
149     deleteTask(hTask); //删除任务,释放任务占用内存 6
150 }

这是改造后的代码,使用LoadLibraryA()导入xldl.dll文件,定义了对应xldl.dll中对应方法的函数指针类型。将原示例代码中通过DownWrapper对象实现方法调用的代码改成了使用对应函数指针调用。运行这段代码可以在VS的项目配置里设置对应的命令行参数,指定下载的url、下载文件保存路径、下载保存的文件名。运行过程中可以看到类似下图的状态信息:

转载于:https://www.cnblogs.com/zhang-15-506/p/7814914.html

迅雷云加速开放平台学习笔记——实现相关推荐

  1. 迅雷云加速开放平台学习笔记——说明

    最近在研究软件的自动更新功能,手动更新太麻烦而且对电脑小白来说容易出错.之前对自动更新没什么概念,不知道如何实现.简单百度之后,原来"更新"功能是一个单独的模块,在需要更新的时候启 ...

  2. 迅雷云加速开放平台接口说明文档

    迅雷云加速开放平台接口说明文档 全局接口 任务接口 接口详细说明 XL_Init BOOLXL_Init(void) XL_UnInit BOOL XL_UnInit(void) XL_CreateT ...

  3. 迅雷云加速开放平台c#demo

    迅雷云加速开放平台c#demo.很多人很遇到下载文件的问题.这个例子是调用迅雷云加速开放平台的dll,进行下载,速度很快,下载过程中可以获取到很全的下载信息,比如下载速度,进度,完成状态等. 例子中带 ...

  4. 迅雷云加速开放平台接口说明

    全局接口 接口名称 功能说明 XL_Init 初始化SDK,并使其为处理后续操作做好准备. XL_UnInit 反初始化SDK,释放模块运行期间申请的资源. XL_DelTempFile 删除临时文件 ...

  5. 云平台学习笔记(三)-实践

    一.实验目的 本实验目的: 1.熟练克隆虚拟机: 2.熟练配置域名解析 3.学会配置 Chrony: 4.学会安装 OpenStack 基础框架: 5.学会安装 Mariadb 数据库 6.熟练为虚拟 ...

  6. 迅雷云加速服务的“社会化能力”

    在今年的政府工作报告中, "互联网+"新战略为传统企业转型升级指明了方向.事实上,这也为国内互联网企业指明了未来的道路--充分利用互联网技术.核心能力在社会发展中带来更多的转型与创 ...

  7. 重大升级!灵雀云发布全栈云原生开放平台ACP 3.0

    云原生技术的发展正在改变全球软件业的格局,随着云原生技术生态体系的日趋完善,灵雀云的云原生平台也进入了成熟阶段.近日,灵雀云发布重大产品升级,推出全栈云原生开放平台ACP 3.0.作为面向企业级用户的 ...

  8. 阿里云智能开放平台团队何登成:解码云计算的 2B 服务基因 | 问底中国 IT 技术演进...

    受访者 | 何登成(花名圭多) 记者 | 胡巍巍 出品 | CSDN(ID:CSDNnews) 前阵子,笔者参加杭州云栖大会之余,一时兴起,去良渚博物院转了一圈,没错,就是国庆马云去参观的那家博物院. ...

  9. 移动云API开放平台助力开发者驰骋云端

    作者:中国移动云能力中心  --王仁喜 概要:本篇文章带你深入了解移动云API开放平台如何助力开发者驰骋云端. 初识移动云API开放平台 随着移动云业务的不断发展,用户对移动云被集成能力的要求越来越高 ...

最新文章

  1. 数据结构与算法:算法简介
  2. 【ACL 2020】腾讯AI Lab解读三大前沿方向及入选的20篇论文
  3. golang select channel 多路复用
  4. Unity UI和引用的管理中心
  5. 产品研究:安装程序 或 移动端APP 为什么这么占用空间?
  6. wireshark抓包过滤指定的字节数据
  7. python join函数_一行 Python 代码能实现这么多丧心病狂的功能?
  8. R语言观察日志(part7)--RMarkdwon之代码块
  9. 跟我一起学.NetCore之熟悉的接口权限验证不能少(Jwt)
  10. ckati与ninja构建demo
  11. accumulate
  12. android 原理 组合控件_Android自定义控件之组合控件
  13. 量化交易之Dual Thrust策略
  14. 速卖通关键词挖掘工具_2020网站关键词挖掘工具有哪些
  15. PS 怎么去掉图片上的文字
  16. css强制一行显示超出的部分显示点点点
  17. Fedora 10安装Compiz-fusion 3D效果方法
  18. 成都拓嘉启远:多多进宝如何关
  19. 使用Webcam实现拍照功能
  20. HCL_H3CNE综合实验

热门文章

  1. LockSupport 中的 park 与 unpark
  2. Seeker的奇妙求职冒险(杰杰的字节笔试)
  3. 金融IC卡行业应用的发展--困境(2)
  4. 讲解高防服务器抵御CC攻击的相关配置
  5. Spring Data Redis简单使用
  6. 北京艾德思奇科技有限公司面试实录
  7. 人月神话札记:整体部分
  8. 中台的理解分析与建设
  9. js Date类型相关(一)——定义指定时间
  10. 大学生计算机专业知识体系中核心地位课程