您的位置:首页 > 其它

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:

[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; 
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: