协议插件(Asynchronous Pluggable Protocols)

协议插件(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中访问。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值