迅雷雲加速開放平台學習筆記——實現


      從示例代碼的流程來看,示例文件的下載經歷了以下幾個步驟:初始化下載引擎(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、下載文件保存路徑、下載保存的文件名。運行過程中可以看到類似下圖的狀態信息:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM