- 浏览: 1234351 次
-
文章分类
最新评论
-
你不懂的温柔:
楼主是好人
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的功能无限延伸。
|
相关推荐
总的来说,通过自定义协议,开发者可以构建更加集成和个性化的用户体验,使IE浏览器成为一个可以与其他应用程序无缝交互的平台。这种方式避免了插件的复杂性和潜在风险,同时也提供了一种高效、灵活的方式来启动和...
从其基本功能上看,浏览网页、下载文件、收发电子邮件等是其核心功能,而地址栏、工具栏、状态栏、收藏夹等则是组成IE浏览器的主要元素。 为了满足用户个性化的需求,IE浏览器还提供了许多设置和自定义的选项,包括...
在.NET框架中,C#语言提供了丰富的库和组件来实现各种功能,其中之一就是模拟IE浏览器。这个实例项目是专门为了教学目的设计的,让你能够深入理解C#如何与Web交互,以及如何利用.NET的组件来实现类似浏览器的功能。...
【JAVA仿IE浏览器源码】项目是一个基于Java技术实现的简单网络浏览器,旨在为开发者提供一个基础框架,以便于在该基础上进行二次开发和功能扩展。这个项目充分展示了Java语言在构建桌面应用上的能力,尤其是GUI...
【VC IE浏览器】是一个基于Microsoft Visual C++ 6.0(简称VC6.0)开发的简单且实用的浏览器示例项目。这个项目的主要目的是为开发者提供一个基础的参考,以便他们理解如何利用编程技术实现类似Windows系统自带的...
IE浏览器不支持CSS自定义滚动条,所以需要借助JavaScript。可以创建一个覆盖在滚动条上的假滚动条,并通过监听滚动事件同步实际滚动条的位置。以下是一个简单的示例: ```javascript function customScrollbar() ...
许多企业内部的老旧系统可能依赖于IE浏览器的特定功能或ActiveX控件,这些在现代浏览器中往往不再支持。该插件的出现就是为了缓解这种不兼容性问题,确保用户能在保持新浏览器优势的同时,也能访问和操作那些需要IE...
"IE_ie浏览器_浏览器 C#" 暗示了这个项目是关于用C#编程语言来创建一个类似于IE的浏览器应用。C#是一种广泛用于Windows桌面应用程序开发的现代、面向对象的编程语言,微软的.NET框架提供了丰富的支持。 在描述中,...
【标题】"myie.rar_MyIE_ie浏览器_java 浏览器_浏览器_浏览器 java" 涉及的核心知识点是自定义浏览器开发,主要聚焦在IE浏览器的仿制以及使用Java语言实现。在这个项目中,作者尝试创建了一个名为MyIE的浏览器,其...
### IE浏览器跨域设置详解 #### 一、引言 随着网络应用的不断发展与普及,浏览器作为连接用户与互联网世界的桥梁,在日常生活中扮演着至关重要的角色。而在浏览器使用过程中,跨域问题一直是开发者和用户面临的一...
- IE浏览器的源码解析是一项复杂的任务,涉及到TCP/IP协议、HTTP/HTTPS协议的理解,以及HTML、CSS、JavaScript的解析和执行。 - PowerBuilder可能被用来构建浏览器的前端部分,如用户界面、页面加载逻辑,而网络...
"利用Visual C++打造自己的IE浏览器"这个主题深入探讨了如何使用微软的Visual C++ IDE和MFC(Microsoft Foundation Classes)库来创建一个基于Internet Explorer引擎的自定义浏览器。 C++是一种强大的编程语言,它...
总之,CVSTab控件是实现类似IE浏览器Tab功能的一个工具,它为开发者提供了方便的接口和功能,简化了在桌面应用程序中实现多标签页界面的工作。通过理解和应用这个控件,开发者能够构建更加用户友好的软件,提升用户...
3. **安全性增强**:考虑到IE浏览器历史上的一些安全问题,开发者可能已经添加了额外的安全措施,比如加强的恶意软件防护,或者是对HTTPS和其他加密协议的支持。 4. **扩展插件支持**:定制版可能增强了对第三方...
IE浏览器允许用户浏览网页,通过HTTP、HTTPS等协议访问互联网资源,支持HTML、CSS、JavaScript等网页语言。尽管现在已被Microsoft Edge取代,但了解其工作原理对理解Web技术的发展历程仍然很重要。 **二、可执行...
描述中的“IE浏览器cookies查看器”是一个应用程序,它允许用户查看和分析IE浏览器中的cookies数据。这个工具以时间顺序显示用户的浏览历史,使用户能清晰地看到各个时间点访问过的网站。同时,它还能按照不同的访问...
标题中的“实例4实现IE地址栏.rar”表明这是一个关于如何在软件开发中实现类似IE浏览器地址栏功能的实例教程。地址栏是用户在浏览器中输入网址以访问网页的关键组件,通常具备URL输入、自动填充、历史记录搜索等功能...
MyIE可能是一个自定义的浏览器插件,或者是基于IE浏览器开发的特殊应用,用于管理和操作特定的数据库。这样的应用可能会包含一些定制的功能,如特定的数据展示方式、高级搜索选项或者用户权限管理等。 总的来说,IE...
对于一般情况来说,我们用得最多的可能是使用ActiveX控件的方法来实现,但此方案只适用于IE浏览器。为了能兼容不同的浏览器,如FireFox等,我们就需要考虑到一种比较通用的方法。此方法我们可以参考“在很多网站中,...
WebBrowser控件内部集成了Trident渲染引擎,这是IE浏览器用于解析和显示HTML页面的部分。开发者可以通过调用WebBrowser控件的方法,如Navigate()来加载指定URL的网页,并通过Document对象获取HTML文档的DOM树,进行...