公司java开发人员开发了一个下载器,主要是针对android手机软件的下载现在前端要实现下载功能的扩充就是增加一个调用下载器的方法我看到一般的方法就是私有协议判断但是不明白迅雷,QQ旋风这些是怎么做到的

补充一下:主要想让没有安装下载器的用户能先安装下载器,然后通过下载器去下载网站的软件,我的问题在判断用户是否有无下载器的判断上出现了问题

2011-01-15 03:02:59

3 Answers

你的问题简单地说,就是注册一个协议,你可以看看注册表里HKEY_CLASSES_ROOT
下面已经注册的协议是什么格式。然后编写一个实现了IObjectSafety接口的ActiveX组件。

具体的可以去网上找参考资料

2011-01-15 05:18:22

下载基本原理:
我们知道好多下载软件为了更好的和浏览器整合,都实现了通过浏览器直接通用下载软件下载的功能,通常是的方式是托管了了浏览器的Download事件,在浏览器的Download事件中调用自己的程序来完成下载,所有要实现浏览器调用自己的下载程序,就需要根据浏览器提供的API接口协议开发对应的插件,浏览器的基本实现框架都是一套基于DCOM的接口名字都很类似,所以基本理解IE的接口机制,基本上就了解Firefox、Chrome等其他浏览器的实现了,IE下这个功能的实现依赖IDownloadManager接口,详细查看MSDN就可以了。

基于私有协议的高级应用:
好多下载软件,下载站都提供专有的链接,而这个链接并不是一个正常的链接,只有调用专有的下载软件才可以下载,例如迅雷、快车和QQ旋风等,这种功能的实现和下载基本类似,只是私有协议托管的不是Download事件,而是鼠标消息,鼠标的所有消息都可以托管起来处理,IE下通过IDispatchImpl接口的STDMETHOD(Invoke)方法来截获这些消息,DISPID_HTMLDOCUMENTEVENTS2_ONCLICK消息就是鼠标的点击消息,我可以定义一个特殊的URL例如:MyDownload://XXXXXXXXXXXXXX.exe?mydownload,当我们从截获的鼠标点击消息中获取到这个URL时,我们就知道这个链接是需要调用自己下载软件下载的,如果本地已经安装了下载软件,这个过程是很正常的调用下载软件下载了,还有一种情况是在本地没有安装下载软件的情况下,这个URL实际上一个非法的URL,只是下载站和下载软件之间协议URL,这时候实际上这个链接也是通过下载站和下载软件厂商约定的JS脚本调用,JS脚本托管这个链接的点击事件,当判断是MyDownload:开头的特殊URL时,提示用户这个一个特殊的URL必须使用XXX下载软件下载,提示用户下载指定的下载软件。

这只是基本原理,具体的应用还要根据软件厂商不同的需要,来约定下载特殊URL。

2011-01-15 08:33:27

其实这个我研究的结果是:
java开发的下载器都会有一个外部协议请求地址,
比如说:test://test.mumayi.com/234,
用户在带有这个地址上点击就会呼出外部程序,
但是有几个问题就是,
如果你的PC端安装此程序就会导致呼出界面的不友好,
给用户体验带来负担,
而且目前我了解到的是无法识别用户PC端装没装此程序,
而进一步去提示用户去安装,
就是类似与迅雷的那种提示安装,
后来发现原来在我们安装迅雷和QQ旋风的时候,
它们都会自动安装一个浏览器的控件,
然后当我们用页面JS去访问此控件的一些行为时就可以判断此程序到底有没有,
这样就可以得到访问的反馈,
进而判断,
可能因为开发浏览器控件成本的问题,
所以这个被毙掉了,
直接采用先提示用户去安装下载器,
然后引导用户去点击下载,
这种模式就类似豌豆荚,
魔乐这样的PC端程序模式了,
大家可以体会一下,或者给出更好的答案

2011-01-15 06:28:30
您不能回答该问题或者回答已经关闭!

相关文章推荐

  • C#中using指令的几种用法

    using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到

  • C#实例解析适配器设计模式

    将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作

  • C#开发高性能Log Help类设计开发

    项目中要在操作数据库的异常处理中加入写Log日志,对于商业上有要求,写log时对其它操作尽可能影响小,不能因为加入log导致耗时太多

  • C#运行时相互关系

    C#运行时相互关系,包括运行时类型、对象、线程栈和托管堆之间的相互关系,静态方法、实例方法和虚方法的区别等等

  • C#协变和逆变

    “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型,“逆变”则是指能够使用派生程度更小的类型

  • 使用托管C++粘合C#和C++代码(二)

    本文实现一下C++代码调用C#代码的过程。我构造一个简单并且直观的例子:通过C++ UI 触发C# UI.

  • C#开发中的反射机制

    反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等

  • C#基础概念之延迟加载

    延迟加载(lazy load)是Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作

  • 使用托管C++粘合C#和C++代码(一)

    C#在xml读写,数据库操纵,界面构造等很多方面性能卓越;C++的效率高,是底层开发的必备武器

  • C#中的索引器的简单理解和用法

    C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作

  • Async和Await使异步编程更简单

    C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作

  • 深入C# 序列化(Serialize)、反序列化(Deserialize)

    C#中的序列化和反序列化,序列化是.NET运行时环境用来支持用户定义类型的流化的机制