迅雷的可视化下载

来源:互联网 发布:矩阵论教程张绍飞答案 编辑:程序博客网 时间:2024/06/10 18:07

 

最近用迅雷,右键选择“使用迅雷下载全部链接”,会有一个可视化框方式进行下载的选择框:

点击“是”之后,就会进行像qq截图的区域选择。迅雷可以将这个区域里面的链接提取出来,然后全部下载下来。

这种方式确实比较有用,我比较关心这是如何实现的?

在注册表“HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer/MenuExt/使用迅雷下载全部链接”下面,显示处理“使用迅雷下载全部链接”,的url是e:/Program Files/Thunder Network/Thunder/Program/GetAllUrl.htm,文件内容如下:

<script language="VBScript">

Sub OnContextMenu()
    set ThunderAgent = CreateObject("ThunderAgent.Agent.1")

    If ThunderAgent.ConfirmRectMode = 0 Then
    set links = external.menuArguments.document.links
    set images = external.menuArguments.document.images

    link_count = links.length
    image_count = images.length

    strDownloadPage = external.menuArguments.document.url
    set theDownloadPage = external.menuArguments.document.getElementById("thunder_down_pageurl")
    if TypeName(theDownloadPage) <> "Nothing" then
        strDownloadPage = theDownloadPage.value
    end if

    strStatPage = ""
    set theStatPage = external.menuArguments.document.getElementById("thunder_stat_pageurl")
    if TypeName(theStatPage) <> "Nothing" then
        strStatPage = theStatPage.value
    end if

    if strStatPage <> "" then
        for i = 0 to link_count-1
            call ThunderAgent.AddTask4(links(i).href, "", "", links(i).innerText, strDownloadPage, -1, 0, -1, external.menuArguments.document.cookie, "", strStatPage)
        next
        for i = 0 to image_count-1
            call ThunderAgent.AddTask4(images(i).src, "", "", images(i).innerText, strDownloadPage, -1, 0, -1, external.menuArguments.document.cookie, "", strStatPage)
        next
    else
        for i = 0 to link_count-1
            call ThunderAgent.AddTask4(links(i).href, "", "", links(i).innerText, strDownloadPage, -1, 0, -1, external.menuArguments.document.cookie, "", "")
        next
        for i = 0 to image_count-1
            call ThunderAgent.AddTask4(images(i).src, "", "", images(i).innerText, strDownloadPage, -1, 0, -1, external.menuArguments.document.cookie, "", "")
        next
    end if

    call ThunderAgent.CommitTasks2(1)
    Else
        ThunderAgent.AddTaskInRect()
    End If

    set ThunderAgent = nothing
end sub

call OnContextMenu()

</script>

 

通过set ThunderAgent = CreateObject("ThunderAgent.Agent.1") ,我们知道这个脚本是调用activex控制来和迅雷主程序打交道的。ThunderAgent.Agent.1是ProgID,通过查注册表HKEY_CLASSES_ROOT/ThunderAgent.Agent.1可以知道其对应的CLSID为{485463B7-8FB2-4B3B-B29B-8B919B0EACCE}。然后到HKEY_CLASSES_ROOT/CLSID/{485463B7-8FB2-4B3B-B29B-8B919B0EACCE}/InprocServer32下面我们可以知道这个activex对应的dll为e:/Program Files/Thunder Network/Thunder/ComDlls/ThunderAgent5.9.23.1488.dll。然后我们通过vs提供的oleview.exe来查看这个dll的接口信息(typelib),其实就是解析dll的typelib资源段。

 

getAllurl.htm用到的方法有ConfirmRectMode,AddTask4,CommitTasks2和AddTaskInRect。ConfirmRectMode的作用就是弹出是否用可视化下载的对话框;AddTask4的作用是将链接加入列表(传入了cookie:external.menuArguments.document.cookie,这也是为什么迅雷可以下载需要登录的连接的原因);CommitTasks2的作用是让迅雷开始下载;AddTaskInRect的作用是进入可视化下载界面。

如果用户选择的是非可视化下载,通过external.menuArguments.document.links和external.menuArguments.document.images 就可以拿到当前页面的所有链接和图片地址。external的接口可以看http://msdn.microsoft.com/en-us/library/ms535246(v=VS.85).aspx。

那接下来的关键就是AddTaskInRect方法的实现了。vckbase上有一篇文章《采集网页选定部分全攻略》,介绍了如何获取选定部分文字和图片,我估计迅雷的实现跟这个差不多。

 

 

参考链接:

http://www.cnblogs.com/waxdoll/archive/2005/12/23/303470.html

http://blog.csdn.net/xushiweizh/archive/2007/04/26/1585137.aspx

http://topic.csdn.net/t/20060921/16/5038787.html

http://zhidao.baidu.com/question/11153472

http://www.vbaccelerator.com/progid.htm

http://forums.devx.com/archive/index.php/t-90027.html

http://www.codeproject.com/KB/aspnet/externalmenuArgument.aspx

 

原创粉丝点击