zoukankan      html  css  js  c++  java
  • 迅雷云加速开放平台学习笔记——实现

          从示例代码的流程来看,示例文件的下载经历了以下几个步骤:初始化下载引擎(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、下载文件保存路径、下载保存的文件名。运行过程中可以看到类似下图的状态信息:

  • 相关阅读:
    nyoj 420
    nyoj 46 最少乘法次数
    ACM退役贴
    nyoj 187 快速查找素数
    多校4题目之Trouble
    nyoj 56 阶乘因式分解(一)
    nyoj 70 阶乘因式分解(二)
    nyoj 151 Biorhythms
    nyoj 97 兄弟郊游问题
    多校十 hdoj4393 Throw nails
  • 原文地址:https://www.cnblogs.com/zhang-15-506/p/7814914.html
Copyright © 2011-2022 走看看