您的位置:首页 > 其它

协议插件(Asynchronous Pluggable Protocols)

2009-09-23 13:53 253 查看
协议插件(Asynchronous Pluggable Protocols)
2009年09月01日 星期二 上午 04:51
这个是微软专门为IE扩展的东西。
在互联网上,常见的应用层协议包括http、FTP等。出于种种原因,微软允许用户在标准的 应用层协议之外,扩展自己的协议,称为Asynchronous Pluggable Protocol。到MSDN、codeguru和codeproject上搜索这几个关键字,从理论到源代码都能找出一堆,在这里我就不罗嗦了。
Asynchronous Pluggable Protocol可以指定对所有进程有效,这个在注册表的HKEY_CLASSES_ROOT/PROTOCOLS/Handler下注册一下就好;也可 以指定只在某个进程内有效,以增加保密性,不过这个时候微软就不叫它Asynchronous Pluggable Protocol了,而是Pluggable Namespace Handler。
由于Asynchronous Pluggable Protocol具有一定的保密性,实现起来又有例子可参考,而且差不多与架设web server一样,能够对网页显示提供全面的支持,因此在电子书中得到了广泛的应用,我见过的就有mk(chm)、ada99(eBook Workshop)、wc2p(Web Compiler 2000)、ic32pp(Web Compiler 2000—exe防反编译格式)、e-book(E-Book Creator)、mec(E-ditor eBook Compiler)等。不过这种技术如果使用不好,可能会在注册表中产生垃圾,或产生垃圾文件(插件本身是一个COM控件,一般用DLL实现,使用前必须 在注册表中注册)。
KeyLife富翁笔记
标题: 用IE支持的Asynchronous Pluggable Protocols实现直接从数据库取得信息显示在WebBrowser中
关键字: WebBrowser 数据库 Asynchronous Pluggable Protocols
IID_NSHandler: TGUID = '{ A562A5BC-F3C8-4968-8FA8-996B45223990 }';
IE异步可插入协议扩展作者 陈省介绍
对于每天都要使用的IE浏览器的人来说,输入www.google.com 等网址进行网上冲浪就象呼吸一样自然。大多数情况时,我们可能根本想不起来要在网址前面加上http:// 来声明要访问的是一个基于http协议的Web网站。所谓网络协议,其实无非就是一组描述如何获取不同资源并进行通讯的行为规则。IE浏览器除了内置了对 http协议外,还持ftp和gopher等协议。
从IE4开始,IE允许通过插入式异步协议扩展来扩展它处理协议的功能,人们可以通过自定义的扩展来让IE支持更多的协议,比如一些不是普遍支持的流媒体协议等。此外,我们还可以通过插入式协议扩展让IE可以以HTML文件的形式显示一个数据库中的表。
异步可插入协议的原理
可插入式协议是基于异步的URL Moniker技术的。Moniker最早是从OLE2中引入的概念,当时的Moniker就是一个COM绑定和定位对象,人们可以使用Moniker来 定位并加载被保存到文件中的COM组件,实现COM的可持续性,一开始Moniker是基于同步方式实现的。随着网络技术的发展,定位并从网络上获取信息 的需求逐渐超过了对本地数据的存取需求,因为网络的通讯通常都是不稳定的,因此需要以异步的方式来实现。为此微软设计了URL moniker对象来提供网络信息下载过程的一个统一接口,基于URL来访问网络资源的Moniker演变成了以异步方式实现的Moniker。
IE的URL moniker是在urlmon.dll动态连接库中实现的。当urlmon.dll处理http, ftp, Gopher等内置协议的访问时,它把访问请求转发给内部的一个COM组件来处理,该COM组件使用WinInet函数来完成实际的处理工作。对于非内置 的协议,urlmon.dll则把请求转发给特定的可插入协议扩展进行处理,比如说mailto:协议。
一个典型的异步可插入协议(APP)的主要工作的就是接收一个非IE内置的UrlURL协议字符串,对字符串进行解析,分析字符串的元素,并根据协议访问相应的系统或者网络资源,并将网络资源的内容输出到浏览器。
创建COM组件
首先,新建一个ActiveX Library项目,保存为IEProtocol.dpr,然后新建一个名为TIEEncryptAPP的COM组件,保存为 CIEProtocol.pas文件。一个APP组件至少要实现IInternetProtocol接口(该接口定义在urlmon.pas单元中),又 由于IInternetProtocol接口派生自IInternetProtocolRoot,所以我们还需要实现 IInternetProtocolRoot接口。下面是实现了IInternetProtocol接口的TIEEncryptAPP类的定义:
其中IInternetProtocolRoot接口的方法意义如下:
Abort 停止一个正在进行的资源下载过程
Continue 允许协议扩展继续进行进行资源数据下载过程。
Resume 未来扩充需要,暂时未实现。
Start 启动同该协议相关的资源下载过程。
Suspend 未来扩充需要,暂时未实现
Terminate 结束下载过程,释放扩展分配的资源。
而IInternetProtocol协议的方法定义如下:
LockRequest 锁定资源下载请求,这时IInternetProtocolRoot接口的Terminate方法将允许被调用,与此同时未下载完的数据仍然可以被读取。
Read 浏览器调用这个方法从协议扩展获得相应的数据。
Seek 移动读取数据的位置。
UnlockRequest 释放请求锁定
除了上面的协议扩展外,IE还支持NameSpace Handler以及Mime-Handler两种APP扩展。其中NameSpace扩展是对特定名字空间进行处理的协议扩展,比如如果我们注册一个对名字空间<hubdog>,则当IE处理http://hub dog.csdn.net、mailto:hub dog at 263 dot net的 URL时,一旦遇到hubdog名字空间,就会调用我们的NameSpace Handler进行处理,而不管URL是基于http协议的还是ftp等其它协议的都进行处理。从实现的角度来看,NameSpace的实现方法和前面的 协议扩展几乎一样,除了注册时要填写的注册表项内容不同而已。
而Mime协议扩展处理的主要是对一些特殊的媒体资源如图片,声音文件进行处理,比如下表是IE默认支持的一些媒体形式。
数据通讯方式上来看,Mime扩展同一般的协议扩展差别比较大,通讯的流程是这样的:
1. 首先,IE会在遇到相应资源下载请求时,调用扩展的Start方法来启动下载过程。
2. 然后IE会调用扩展的ReportProgress方法,告知扩展被下载的数据保存的缓存文件名称。
3. 当IE下载完原始数据后,会调用扩展的ReportData方法通知扩展准备对原始数据进行加工处理。
4. 这时,扩展需要调用IE提供的IInternetProtocol接口的Read方法来获得原始数据。
5. 对原始数据处理后,扩展要调用IE的IInternetProtocolSink接口的ReportData方法通知IE数据处理完毕。
6. 最后,IE调用扩展的Read方法获得处理后的数据。
可以看出来同一般协议扩展的纯主动向IE返回数据的方式不同,Mime的数据通讯方式即有被动的接收IE获取的原始数据,也有将处理后的数据返回IE的主动通讯方式。
本站原创及翻译内容保留版权,欢迎转贴,转贴时请注明转自Delphi深度探索
常见的应用层协议包括http、FTP等。另外,微软还允许用户在标准的应用层协议之外,扩 展自己的协议,称为Asynchronous Pluggable Protocols(APPs)。APPs可以指定对所有进程有效,在注册表HKEY_CLASSES_ROOT/PROTOCOLS/Handler中 进行协议定义;也可以指定只在某个进程内有效,不过这个时候微软就不叫它APPs了,而是称之为Pluggable Namespace Handler。
前面我们提到的bds:、vs:和x-view:是Pluggable Namespace Handler的实现。这些协议只允许在各自的进程中使用,所以无法在IE中访问。而ms-help:和mk:则是Asynchronous Pluggable Protocols的实现,可以在HKEY_CLASSES_ROOT/PROTOCOLS/Handler中找到,所以可以在IE中访问。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: