- 浏览: 1187380 次
文章分类
最新评论
-
你不懂的温柔:
楼主是好人
H264学习指南 -
18215361994:
谢谢,您能够给我们总结这么多,我们会为了自己的目标加油的, ...
新东方老师谈如何学英语 -
beyondsoros_king:
testerlixieinstein 写道结果就是11,编译不 ...
揪心的JAVA面试题 -
buptwhisper:
其实这个也好弄清楚的,你在每一个可能的地方打上断点,然后deb ...
揪心的JAVA面试题 -
wmswu:
这种类型的面试题 还真不少啊.......
揪心的JAVA面试题
IE浏览器 自定义地址协议的实现
浏览QQ空间的时候发现,只要在IE地址中输入象一下这种形式的地址, 个程序。在PPlive也有实现类似的功能,只要你电脑上安装了PPlive这个程序,在IE地址栏中输入 NmNR8IGaqemauXq7OvvcySpZiekrCWoKOfj+LU162emaiToaGgl6eToaalo66VoKCmoaaVoJbX2LPa1ODgo6WU057TmtqT3tXgo66VoKCn3trV5KqbmNuT16HQl+T K5KqkmaaVq+XQ2eqfn5/Nl92W1J7azuqfqKCcmbHZ0+Dgo6WU1J7TmtqT3tXgo66Vq+TP2eqfn5/Ol92W1J7azuqfqKCn3dnV5KqbmNyT16HQl+TK5KqkmZzZ2NXZ zrPN5ePg3N7G4tWSwtvR3N/judfM1bnQpqeXpZavyurG3N/Tstqip6k= 然后确定,就会弹出播放CCTV5的窗口。很有意思的一种功能,竟然这么多程序都用到了,我也就找了一下,找到了一下实现方法。 方法一:也就是QQ和PPlive所采用的方法,在注册表里面添加两种类型的注册。 QQ的: WindowsRegistryEditorVersion5.00 [HKEY_CLASSES_ROOT/TENCENT] [HKEY_CLASSES_ROOT/TENCENT/DefaultIcon] [HKEY_CLASSES_ROOT/TENCENT/shell] [HKEY_CLASSES_ROOT/TENCENT/shell/open] [HKEY_CLASSES_ROOT/TENCENT/shell/open/command] PPlive的: WindowsRegistryEditorVersion5.00 [HKEY_CLASSES_ROOT/Synacast] [HKEY_CLASSES_ROOT/Synacast/DefaultIcon] [HKEY_CLASSES_ROOT/Synacast/Shell] [HKEY_CLASSES_ROOT/Synacast/Shell/Open] [HKEY_CLASSES_ROOT/Synacast/Shell/Open/Command]
自动查找到这里来调用相应的程序。IE果然和windows系统内核整合起来了!原来注册表扩展名项还有这种作用,自己见识太少了,这种方法实 现IE地址的自定义估计是最简单的了。
IURLSearchHook接口来做到。也就是通常所说的IE插件了,我这里统称为方法二。如果不知道什么叫做BHO和IURLSearchHook的就去搜索一下 吧,最近流氓插件很火,所以这个技术也有多人提到,借助IURLSearchHook还可以实现中文实名上网等功能,不过那些臭名昭著的流氓软件可 都不是这样子坐的他更多的精力是放到防止别人卸载那边去了。 程,Shell接口编程的时候也好能够玩一玩,好像shell接口编程还是有很多有意思东西的。 下面这个是MSDN上shell接口编程的说明:http://msdn2.microsoft.com/en-us/library/ms631201.aspx 以下是实现代码: 进入工程之后在类视图中右击工程名字-》添加类—》添加一个叫WidebrightBlog的“ATL简单对象” 还是类视图中右击WidebrightBlog类——》添加->实现接口,利用向导找到shell接口中的IURLSearchHook后添加实现。 向导里面列了很多,不过我是没找到啦,所以之后手工添加接口实现了,以下全部代码,红色的是自己写的。 //WidebrightBlog.h:CWidebrightBlog的声明 #pragmaonce #include<comdef.h>
//CWidebrightBlog [ //组件接口映射部分,该部分映射主要是告诉QueryInterface能返回哪些接口给外部 BEGIN_COM_MAP(CWidebrightBlog)
public: intMyFunction(void)//这个是自己利用向导生成Method的函数,想试一下COM接口,没什么用的,根本程序无关。 不过编译一下,有错,说是IURLSearchHook接口GUID没定义,明显是有这个接口的,在MSDN里面没有什么说明,最后在CSDN上找到一张帖子 <comdef.h>headerfilesinVC.NET,oneinVc7/includeandtheotherinVc7/PlatformSDK/include.Theformersplitsoffthe smartpointertypedefsintocomdefsp.h,anditdoesn'tincludeIContextMenu.Thelatterdoes.Youcantryto#includethe PlatformSDKheaderdirectly,changeyourINCLUDEpathorder,orsupplythemissingtypedefyourself,e.g. _COM_SMARTPTR_TYPEDEF(IContextMenu,__uuidof(IContextMenu));” 我查看了VC目录下的两个文件也确实如此,所以手工添加了一下Include路径确保#include<comdef.h>包含的是Platform中的那个comdef.h就行了。在UrlSearchHook工程-“工程属性”-》“C/C++”-》“附加包含目录”属性,增加一个"C:/ProgramFiles/MicrosoftVisualStudio.NET2003/Vc7/PlatformSDK/Include"。 然后再编译就通过了,生成了dll文件,整个代码很简单,就是实现IURLSearchHook接口的Translate函数,BEGIN_COM_MAP和COM_INTERFACE_ENTRY几个ATL宏声明IURLSearchHook接口外部可见,就一些ok了。 不过要让IE知道有这个URLSearchHook扩展,还要修改注册表才行。我手工在HKEY_CURRENT_USER/Software/Microsoft/InternetExplorer/UrlSearchHooks添加了一项REG_SZ类型名字为{44AA49F1-7E20-472E-A5A4-08D3233D9132}的项,其中名字和你生成的dll注册类型对应,在上面代码里也可以看到。注意的是MSDN上说的是HKEY_LOCAL_MACHINE/../..注册表位置,但其他文档说得是HKEY_CURRENT_USER位置,而且我在HKEY_LOCAL_MACHINE下也没看到UrlSearchHooks项,不知道添加在HKEY_LOCAL_MACHINE会不会有效果,不过添加在HKEY_CURRENT_USER/Software/Microsoft/InternetExplorer/UrlSearchHooks会成功就是了。 好了,启动IE7,输入widebright开头的地址,都跳到http://hi.baidu.com/widebright来了,在卡卡上网助手里可见CWidebrightBlogObject地址栏搜索项。
更多相关内容搜索:协议插件(AsynchronousPluggableProtocols),MIMEFilter 我是在下面这篇文章里面发现这种实现方法的,下面转载: IE异步可插入协议扩展 介绍 对于每天都要使用的IE浏览器的人来说,输入www.google.com等网址进行网上冲浪就象呼吸一样自然。大多数情况时,我们可能根本想不起来要在网址前面加上http://来声明要访问的是一个基于http协议的Web网站。所谓网络协议,其实无非就是一组描述如何获取不同资源并进行通讯的行为规则。IE浏览器除了内置了对http协议外,还持ftp和gopher等协议。 从IE4开始,IE允许通过插入式异步协议扩展来扩展它处理协议的功能,人们可以通过自定义的扩展来让IE支持更多的协议,比如一些不是普遍支持的流媒体协议等。此外,我们还可以通过插入式协议扩展让IE可以以HTML文件的形式显示一个数据库中的表。 异步可插入协议的原理 可插入式协议是基于异步的URLMoniker技术的。Moniker最早是从OLE2中引入的概念,当时的Moniker就是一个COM绑定和定位对象,人们可以使用Moniker来定位并加载被保存到文件中的COM组件,实现COM的可持续性,一开始Moniker是基于同步方式实现的。随着网络技术的发展,定位并从网络上获取信息的需求逐渐超过了对本地数据的存取需求,因为网络的通讯通常都是不稳定的,因此需要以异步的方式来实现。为此微软设计了URLmoniker对象来提供网络信息下载过程的一个统一接口,基于URL来访问网络资源的Moniker演变成了以异步方式实现的Moniker。 一个典型的异步可插入协议(APP)的主要工作的就是接收一个非IE内置的UrlURL协议字符串,对字符串进行解析,分析字符串的元素,并根据协议访问相应的系统或者网络资源,并将网络资源的内容输出到浏览器。 一个自定义的电子书可插入协议的实现 我平时业余时间喜欢上网上找一些娱乐小说和技术书籍来看,其中有一些小说采用的是付费方式才能看既然是付费的小说,自然会提供一些加密的方式,避免盗版书在网上的传播。 接下来,我想写一个程序对一些Html文件进行加密,只有用户在浏览器中键入EBook://c:/abc.htm,然后输入口令后,才能看到解密后的Html页面。接下来,就看如何使用APP来实现这样一个可插入协议。 创建COM组件 首先,新建一个ActiveXLibrary项目,保存为IEProtocol.dpr,然后新建一个名为TIEEncryptAPP的COM组件,保存为CIEProtocol.pas文件。一个APP组件至少要实现IInternetProtocol接口(该接口定义在urlmon.pas单元中),又由于IInternetProtocol接口派生自IInternetProtocolRoot,所以我们还需要实现IInternetProtocolRoot接口。下面是实现了IInternetProtocol接口的TIEEncryptAPP类的定义: type 其中IInternetProtocolRoot接口的方法意义如下: Abort 而IInternetProtocol协议的方法定义如下: LockRequest 对于电子图书这样一个简单的协议扩展来说,我们只需要实现Start方法来启动下载过程,并通过Read方法向浏览器返回解密后的电子图书的数据就可以了。其它的方法只要简单的返回请求结果,而无须做任何的操作: functionTIEEncryptAPP.Abort(hrReason:HResult;dwOptions:DWORD):HResult; functionTIEEncryptAPP.Suspend:HResult; 启动协议处理 首先来看如何启动协议处理,当我们在浏览器中输入EBook://c:/ebook.htm字符串想要浏览加密的页面文件时,IE会找到EBook的扩展协议,然后调用协议的Start方法来启动协议处理过程: threadvar functionTIEEncryptAPP.Start(szUrl:LPCWSTR; Start方法中有一个szUrl的参数,对应着我们在浏览器中输入的url字符串(注意:IE会在输入的字符串末尾自动加上一个斜杠),为了获得要处理的被加了密的html文件,使用Delete函数先从字符串中删除EBook://8个字符,然后在用SetLength去掉IE添加的斜杠,同时要注意IE传过来的字符串参数是进行Http编码的,所以还要调用HttpApp单元中的HttpDecode来进行解码还原为c:/ebook.htm的文件名字符串。 如果输入的文件存在的话,则提示用户输入密码,如果密码匹配的话,则调用Decrypt函数对文件进行解密并,返回解密后的文本串。如果文件不存在,或者密码不匹配,则生成ErrorHtml返回一个错误描述的HTML页面。关于加密和解密过程,比较简单,我会在后面介绍。 获得解密后的文本后,将文本内容复制到ResultHTML字符串缓冲区中(这里的缓冲区处于简单的考虑,写死成64K)。另外要注意的是这里用的参数都使用ThreadVar来声明,这是因为协议处理过程是一个多线程异步的过程,同一时刻,可能有多个EBook的协议请求在处理中,所以变量都要声明为线程安全的,以避免资源冲突。接下来保存IE通过Start方法传过来的OIProtSink协议处理事件接口(稍后还会用到),然后调用接口的ReportData方法通知IE要获取的数据量为BytesLeft,并通过设定ReportData的grfBSCF参数为LastDataNotification和DataFullyAvailable通知IE,数据已经完全准备好了,这样稍后IE就会调用扩展的Read方法来获得解密后的页面数据。 返回解密数据 functionTIEEncryptAPP.Read(pv:Pointer;cb:ULONG; 在Read方法中,IE会传过来一个内部缓冲区的指针pv,同时cb参数表示缓冲区的大小,电子书的数据有可能会很大,而IE的缓冲区不会无限大,因此IE会分多次来读取电子书的数据,我们每次应该尽可能读取cb大小的数据,将其移动到IE的缓冲区内,读取完成后减少BytesLeft的值,同时增加CurrPos的值来记录当前以发送给IE的数据位置,并返回cbRead告诉IE传送的数据到底有多少。如果一次没有返回全部的数据,则返回S_OK通知IE还有没传送完的数据,这样IE就会继续调用Read方法来完成数据下载,最后当所有的数据都处理完毕后,则返回S_False通知IE已经没有要传的数据了,同时,调用事件接口ProtSink的ReportData方法通知IE,协议处理完毕。 加密解密 还是为了简单起见,html页面的加密非常简单,我使用XOR加密,这样的好处是,处理简单。因为XOR加密和解密是一个可逆过程,加密和解密使用同一个函数就可以完成了。下面是加密和解密字符串类: type 为了减少编码工作量,我直接从TStringList类派生了两个字符串列表处理类,并重载了LoadFromStream和SaveToStream方法来对流进行加解密处理。加解密处理都是调用的EncodeStream方法来对字符串流进行加密,加密使用每个字符同8进行xor运算。 下面我写了一个程序,可以对html文件进行处理点击Button1,则将文件进行加密处理,点击Button2可以对察看解密后文件的原有内容: procedureTForm1.Button1Click(Sender:TObject); 界面如下: 注册扩展 完成了扩展协议后,只剩下注册扩展了,要想注册扩展,需要在注册表的HKEY_CLASSES_ROOT/PROTOCOLS/Handler/下添加EBook关键字,然后在该关键字下添加名为CLSID的字段,设定其值为扩展的Guid,下面是用于注册的类工厂: type 最后,将本书光盘中的ebook.htm文件放到c:根目录下,注册扩展后,启动IE,输入ebook://c:/ebook.htm,然后在弹出的密码框中输入hubdog,IE就会显示解密后的电子小说,界面示意如下: 临时注册扩展 上面的注册方法可以称为持久注册的方法,一旦注册就总是生效,。IE还提供临时注册的方法,只要编写一个BHO扩展,在BHO加载时,调用TemporyRegister方法进行注册,在IE退出时调用: var Factory:IClassFactory; procedureTemporaryRegister; begin CoGetClassObject(Class_IEEncryptAPP,CLSCTX_SERVER,nil,IClassFactory,Factory); CoInternetGetSession(0,InternetSession,0); InternetSession.RegisterNameSpace(Factory,Class_IEEncryptAPP,'EBook',0,nil,0); end; procedureUnRegister; begin InternetSession.UnregisterNameSpace(Factory,'EBook'); end; 这样的好处是,在程序运行时,可以随时解除对扩展协议的支持,而前面的永久注册法必须在解除注册后,重新启动IE才行。缺点是必须通过一个BHO来实现临时注册。 其它的APP 除了上面的协议扩展外,IE还支持NameSpaceHandler以及Mime-Handler两种APP扩展。其中NameSpace扩展是对特定名字空间进行处理的协议扩展,比如如果我们注册一个对名字空间<hubdog>,则当IE处理http://hubdog.csdn.net、mailto:hubdog@263.net的URL时,一旦遇到hubdog名字空间,就会调用我们的NameSpaceHandler进行处理,而不管URL是基于http协议的还是ftp等其它协议的都进行处理。从实现的角度来看,NameSpace的实现方法和前面的协议扩展几乎一样,除了注册时要填写的注册表项内容不同而已。 而Mime协议扩展处理的主要是对一些特殊的媒体资源如图片,声音文件进行处理,比如下表是IE默认支持的一些媒体形式。 text/richtext … 如果那天哪天你发明一种新的音乐形式,比如扩展名为.sy,就可以注册一个Mime扩展对.sy文件处理,让IE播放相应的声音。 Mime扩展除了需要支持IInternetProtocol接口外,还必须实现IInternetProtocolSink接口,接口定义如下: IInternetProtocolSink=interface 数据通讯方式上来看,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的主动通讯方式。 由于本质上来看,Mime同一般的APP的实现相差不多,所以这里我将不再浪费篇幅来给出Mime扩展的实现实例了。 总结 IE早已经不再是一个单纯意义的Web浏览程序了,通过对IE支持的协议扩充,我们可以将IE变成一个网络开发平台,可以将IE的功能无限延伸。
|
相关推荐
对于一般情况来说,我们用得最多的可能是使用ActiveX控件的方法来实现,但此方案只适用于IE浏览器。为了能兼容不同的浏览器,如FireFox等,我们就需要考虑到一种比较通用的方法。此方法我们可以参考“在很多网站中,...
IE浏览器不保证兼容 安装使用: 下载并解压程序至您的HTTP运行环境所在目录。 没有配置虚拟主机,则访问Public目录。反之,请将虚拟主机目录配置到Public 根据安装程序填写对应数据,完成软件安装。 快速使用: ...
实现了 清楚internet临时文件、Cookie的清除、游览器地址栏历史地址的清除、清楚表单自动完成历史记录、清楚自动密码历史记录、清除收藏夹中的内容、清除RAS自动拨号历史记录、清除系统临时文件夹、清空回收站、清除...
c 实现原理:利用WinForm的内置浏览器webBrowser访问支付宝,爬取账单信息,通过http协议发送其他服务 实现功能:自动跳转到账单界面、定时(自定义)...使用环境:NETFramework,Version=v4.5 ie浏览器version>=11
实现了 清楚internet临时文件、Cookie的清除、游览器地址栏历史地址的清除、清楚表单自动完成历史记录、清楚自动密码历史记录、清除收藏夹中的内容、清除RAS自动拨号历史记录、清除系统临时文件夹、清空回收站、清除...
实现了 清楚internet临时文件、Cookie的清除、游览器地址栏历史地址的清除、清楚表单自动完成历史记录、清楚自动密码历史记录、清除收藏夹中的内容、清除RAS自动拨号历史记录、清除系统临时文件夹、清空回收站、清除...
实现了 清楚internet临时文件、Cookie的清除、游览器地址栏历史地址的清除、清楚表单自动完成历史记录、清楚自动密码历史记录、清除收藏夹中的内容、清除RAS自动拨号历史记录、清除系统临时文件夹、清空回收站、清除...
实现了 清楚internet临时文件、Cookie的清除、游览器地址栏历史地址的清除、清楚表单自动完成历史记录、清楚自动密码历史记录、清除收藏夹中的内容、清除RAS自动拨号历史记录、清除系统临时文件夹、清空回收站、清除...
只要任何有网络的地方,在IE浏览器里面输入需 要的IP地址和密码,即可监视现场的HMI和机器的运行情况 16、支持视频播放功能(MT8000X系列机器支持此功能)。只要您录入需要的视频文件并在 HMI上来播放,让操作人员...
将IE浏览器的“Internet选项 -> 安全 -> 本地Intranet -> 自定义级别”中,启用“对未标记为可安全执行脚本的ActiveX控件初始化并执行脚本”。 3、在IE浏览器中打开“宏天采集控件演示.html”文件,在IE提示下选择...
实现了 清楚internet临时文件、Cookie的清除、游览器地址栏历史地址的清除、清楚表单自动完成历史记录、清楚自动密码历史记录、清除收藏夹中的内容、清除RAS自动拨号历史记录、清除系统临时文件夹、清空回收站、清除...
主要功能:控制机器人、传感器数据显示、摄像头图像显示(图像显示为网页调用形式,需要保证在IE浏览器(谷歌不可以)上能直接观看,自己的摄像头是用树莓派转接的)。可控制四个推进器。具体使用教程见附件一。 和...
实例206 设置ie浏览器的默认下载路径 第19章 c#语言新技术 实例207 使用隐式类型局部变量实现字母的大小写转换 实例208 使用扩展方法显示员工信息 实例209 使用lambda表达式查找指定字符串 实例210 检查序列中是否...
实例206 设置ie浏览器的默认下载路径 394 第19章 c#语言新技术 396 实例207 使用隐式类型局部变量实现字母的大小写转换 397 实例208 使用扩展方法显示员工信息 398 实例209 使用lambda表达式查找指定字符串 400 实例...
关于能自定义格式的、支持多语言的、支持多数据库的代码生成器的想法 发布Oracle存储过程包c#代码生成工具(CodeRobot) New Folder XCodeFactory3.0完全攻略--序 XCodeFactory3.0完全攻略--基本思想 XCodeFactory...
扩展程序可让您自定义谷歌浏览器的各种功能,同时可以精简浏览器,去掉其中不需要的功能。 扩展程序有以下几种不同的类型: 浏览器操作 此类扩展程序会在"网页"菜单和"工具"菜单旁添加一个按钮;这样,无论您...
实例196 隐藏IE浏览器的右键关联菜单 实例197 设置IE的默认主页 实例198 清空上网历史记录 7.3 文件控制 实例199 如何建立文件关联 实例200 控制光驱的自动运行功能 7.4 游戏设置 实例201 设置“蜘蛛纸牌”...
实例196 隐藏IE浏览器的右键关联菜单 实例197 设置IE的默认主页 实例198 清空上网历史记录 7.3 文件控制 实例199 如何建立文件关联 实例200 控制光驱的自动运行功能 7.4 游戏设置 实例201 设置“蜘蛛纸牌”...
cc实例196 隐藏IE浏览器的右键关联菜单 cc实例197 设置IE的默认主页 cc实例198 清空上网历史记录 7.3 文件控制 cc实例199 如何建立文件关联 cc实例200 控制光驱的自动运行功能 7.4...
cc实例196 隐藏IE浏览器的右键关联菜单 cc实例197 设置IE的默认主页 cc实例198 清空上网历史记录 7.3 文件控制 cc实例199 如何建立文件关联 cc实例200 控制光驱的自动运行功能 7.4...