從示例代碼的流程來看,示例文件的下載經歷瞭如下幾個步驟:初始化下載引擎(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))。ios
初始化下載引擎會載入xldl.dll文件而後拉起MiniThunderPlatform.exe子進程,真正執行下載任務的是該子進程。注意:「初始化下載引擎」必須與「卸載下載引擎」成對出現。下載參數(DownTaskParam)是個結構體,包含了任務URL、下載保存文件名、文件保存目錄等信息;新建任務用來建立任務,調用該方法後並不會立刻開始下載,而是調用開始下載任務方法纔會開始執行下載。開始下載任務,異步方法。輪詢任務信息,查詢任務當前的信息,包括下載文件總大小、下載進度、下載速度等信息。刪除任務,銷燬任務、釋放資源。卸載下載引擎,通知MiniThunderPlatform.exe子進程退出。api
若是直接複製粘貼下載的示例源碼是沒法正常運行的,編譯會不經過,由於示例代碼缺乏DownWrapper類的定義。在源代碼中,初始化、新建、開始等方法都是經過DownWrapper類對象來調用的,可是這個示例代碼沒有提供這個類的定義。從類名能夠看出,這個類是個包裝類,將xldl.dll中經常使用的操做都包裝在裏面方便調用。雖然示例代碼沒法運行,可是提供了一個思路。那麼我能夠用C#代碼來建立一個相似的包裝類,實現同樣的功能。app
想法是好的,可是操做起來卻異常麻煩。在新建任務時須要傳入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、下載文件保存路徑、下載保存的文件名。運行過程當中能夠看到相似下圖的狀態信息:測試