IE浏览器 自定义地址协议的实现Word格式.docx
- 文档编号:18168689
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:20
- 大小:220.04KB
IE浏览器 自定义地址协议的实现Word格式.docx
《IE浏览器 自定义地址协议的实现Word格式.docx》由会员分享,可在线阅读,更多相关《IE浏览器 自定义地址协议的实现Word格式.docx(20页珍藏版)》请在冰豆网上搜索。
TencentProtocol"
"
URLProtocol"
="
C:
\\ProgramFiles\\Tencent\\QQ\\Timwp.exe"
[HKEY_CLASSES_ROOT\TENCENT\DefaultIcon]
\\ProgramFiles\\Tencent\\QQ\\Timwp.exe,1"
[HKEY_CLASSES_ROOT\TENCENT\shell]
[HKEY_CLASSES_ROOT\TENCENT\shell\open]
[HKEY_CLASSES_ROOT\TENCENT\shell\open\command]
\"
\\ProgramFiles\\Tencent\\QQ\\Timwp.exe\"
\"
%1\"
PPlive的:
[HKEY_CLASSES_ROOT\Synacast]
Protocol"
Version"
1.5.38"
[HKEY_CLASSES_ROOT\Synacast\DefaultIcon]
\\ProgramFiles\\PPLive\\PPLive.exe"
[HKEY_CLASSES_ROOT\Synacast\Shell]
[HKEY_CLASSES_ROOT\Synacast\Shell\Open]
[HKEY_CLASSES_ROOT\Synacast\Shell\Open\Command]
\\ProgramFiles\\PPLive\\PPLive.exe\"
通过多方查找终于发现是注册表这两项在起作用,原来只要在注册表里象添加文件扩展名一样,添加两个Synacast和TENCENT扩展名来,IE就会
自动查找到这里来调用相应的程序。
IE果然和windows系统内核整合起来了!
原来注册表扩展名项还有这种作用,自己见识太少了,这种方法实
现IE地址的自定义估计是最简单的了。
(这种方法,原来在MSDN中有记载的:
详见“RegisteringanApplicationtoaURLProtocol”
)widebright2008-03-21
方法二:
一开始不知道方法一的时候,在网上找了很多可以实现这种功能的代码,采用BHO(BrowserHelperObject,浏览器辅助对象)或者
IURLSearchHook接口来做到。
也就是通常所说的IE插件了,我这里统称为方法二。
如果不知道什么叫做BHO和IURLSearchHook的就去搜索一下
吧,最近流氓插件很火,所以这个技术也有多人提到,借助IURLSearchHook还可以实现中文实名上网等功能,不过那些臭名昭著的流氓软件可
都不是这样子坐的他更多的精力是放到防止别人卸载那边去了。
因为我没有编写过ATL或者COM方面的程序,所以也就借着这个机会写了个IURLSearchHook的实现,以后碰到IE插件编程,ATL编程,COM编
程,Shell接口编程的时候也好能够玩一玩,好像shell接口编程还是有很多有意思东西的。
这个是MSDN上IURLSearchHook接口的说明:
下面这个是MSDN上shell接口编程的说明:
这个是ATL编程的
有一片不错的来之VCbase的文章说得是“ATL实现定制的IE浏览器栏、工具栏和桌面工具栏”
简单的说,IURLSearchHook被浏览器用来转换一个未知的URL协议地址,当浏览器企图去打开一个未知协议的URL地址时,浏览器首先尝试从这个地址得到当前的协议,如果不成功,浏览器将寻找系统里所有注册为“URLSearchHook”(资源搜索钩子,USH)的对象并把这个IE不能理解的地址发送过去,如果某个USH对象“认识”这个地址,它就返回一个特定的标识告诉IE它知道怎么打开这个地址,然后IE就根据约定的方法调用它,最终打开这个地址。
其实USH对象并不陌生,我们一些偷懒的用户就经常为了省事而不输入“http:
//”,但是IE最终还是能认出并打开某个地址,就是USH的功劳。
当然通过BHO的GetSite方法也可以做到同样的事情,不过IURLSearchHook简单一些,只有一个Translate方法,我技术不行所以专挑简单的^_^
以下是实现代码:
使用VC2003新建一个名字为UrlSearchHook的ATL工程
进入工程之后在类视图中右击工程名字-》添加类—》添加一个叫WidebrightBlog的“ATL简单对象”
还是类视图中右击WidebrightBlog类——》添加->
实现接口,利用向导找到shell接口中的IURLSearchHook后添加实现。
向导里面列了很多,不过我是没找到啦,所以之后手工添加接口实现了,以下全部代码,红色的是自己写的。
//WidebrightBlog.h:
CWidebrightBlog的声明
#pragmaonce
#include"
resource.h"
//主符号
#include<
comdef.h>
shlobj.h>
//IWidebrightBlog
[
object,
uuid("
1F0B2F61-221A-456C-A8E1-E0E01796E482"
),
dual,helpstring("
IWidebrightBlog接口"
pointer_default(unique)
]
__interfaceIWidebrightBlog:
IDispatch
{
};
//CWidebrightBlog
coclass,
threading("
apartment"
vi_progid("
UrlSearchHook.WidebrightBlog"
progid("
UrlSearchHook.WidebrightBlog.1"
version(1.0),
44AA49F1-7E20-472E-A5A4-08D3233D9132"
helpstring("
WidebrightBlogClass"
)
classATL_NO_VTABLECWidebrightBlog:
publicIWidebrightBlog,
publicIURLSearchHook
public:
CWidebrightBlog()
//MessageBox(NULL,"
在CWidebrightBlog()"
"
widebright"
MB_OK);
}
DECLARE_PROTECT_FINAL_CONSTRUCT()
//组件接口映射部分,该部分映射主要是告诉QueryInterface能返回哪些接口给外部
BEGIN_COM_MAP(CWidebrightBlog)
COM_INTERFACE_ENTRY(IWidebrightBlog)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IURLSearchHook)
END_COM_MAP()
HRESULTFinalConstruct()
returnS_OK;
voidFinalRelease()
STDMETHODIMPTranslate(
LPWSTRlpwszSearchURL,
DWORDcchBufferSize)
{
//
MessageBox(NULL,"
在Translate函数中了"
if(wcsncmp(L"
widebright"
lpwszSearchURL,10)==0)
{
找到了"
wcscpy(lpwszSearchURL,L"
returnS_OK;
}
returnE_FAIL;
//没有修改lpwszSearchURL
returnS_FALSE;
//修改了lpwszSearchURL的,但还需要继续处理
intMyFunction(void)
//这个是自己利用向导生成Method的函数,想试一下COM接口,没什么用的,根本程序无关。
return0;
不过编译一下,有错,说是IURLSearchHook接口GUID没定义,明显是有这个接口的,在MSDN里面没有什么说明,最后在CSDN上找到一张帖子
,说是VC2003里面和VC6的ATL不同,在VC6里面上面代码是可以通过的,但在VC2003以后版本就不行了。
这是引用帖子中原话“Therearetwo
<
headerfilesinVC.NET,oneinVc7/includeandtheotherinVc7/PlatformSDK/include.Theformersplitsoffthe
smartpointertypedefsintocomdefsp.h,anditdoesn'
tincludeIContextMenu.Thelatterdoes.Youcantryto#includethe
PlatformSDKheaderdirectly,changeyourINCLUDEpathorder,orsupplythemissingtypedefyourself,e.g.
struct__declspec(uuid("
000214e4-0000-0000-c000-000000000046"
))
IContextMenu;
_COM_SMARTPTR_TYPEDEF(IContextMenu,__uuidof(IContextMenu));
”
我查看了VC目录下的两个文件也确实如此,所以手工添加了一下Include路径确保#include<
包含的是Platform中的那个comdef.h就行了。
在UrlSearchHook工程-“工程属性”-》“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会成功就是了。
(建在HKEY_LOCAL_MACHINE\Software\Microsoft\InternetExplorer\UrlSearchHooks下面可以的,如果没有UrlSearchHooks下就自己创建一个,然后建一个REG_SZ类似的值,名字指定为你的插件的GUID的值就行了widebright2008-04-22)
好了,启动IE7,输入widebright开头的地址,都跳到
来了,在卡卡上网助手里可见CWidebrightBlogObject地址栏搜索项。
方法三:
也是使用IE扩展接口实现,我之所以把它独立处理列为一种方法,是我觉得是一种很使用的价值的功能。
我发现电脑里面有的电子书在我升级到IE7后看不了,可能也是这方面有问题。
在注册表中都可见到这些Ebook电子书的注册值,可能Ebook也就是这么干的吧。
更多相关内容搜索:
协议插件(AsynchronousPluggableProtocols),MIMEFilter
我是在下面这篇文章里面发现这种实现方法的,下面转载:
转贴来互联网,不过文章作者倒是很眼熟,好像是看过他几篇文章了,支持!
IE异步可插入协议扩展
作者陈省
介绍
对于每天都要使用的IE浏览器的人来说,输入
等网址进行网上冲浪就象呼吸一样自然。
大多数情况时,我们可能根本想不起来要在网址前面加上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。
IE的URLmoniker是在urlmon.dll动态连接库中实现的。
当urlmon.dll处理http,ftp,Gopher等内置协议的访问时,它把访问请求转发给内部的一个COM组件来处理,该COM组件使用WinInet函数来完成实际的处理工作。
对于非内置的协议,urlmon.dll则把请求转发给特定的可插入协议扩展进行处理,比如说mailto:
协议。
一个典型的异步可插入协议(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
TIEEncryptAPP=class(TComObject,IInternetProtocol)
protected
//IInternetProtocolRoot接口定义
functionStart(szUrl:
LPCWSTR;
OIProtSink:
IInternetProtocolSink;
OIBindInfo:
IInternetBindInfo;
grfPI,dwReserved:
DWORD):
HResult;
stdcall;
functionContinue(constProtocolData:
TProtocolData):
functionAbort(hrReason:
dwOptions:
functionTerminate(dwOptions:
functionSuspend:
functionResume:
//IInternetProtocol接口定义
functionRead(pv:
Pointer;
cb:
ULONG;
outcbRead:
ULONG):
functionSeek(dlibMove:
LARGE_INTEGER;
dwOrigin:
DWORD;
outlibNewPosition:
ULARGE_INTEGER):
functionLockRequest(dwOptions:
functionUnlockRequest:
end;
其中IInternetProtocolRoot接口的方法意义如下:
Abort
停止一个正在进行的资源下载过程
Continue
允许协议扩展继续进行进行资源数据下载过程。
Resume
未来扩充需要,暂时未实现。
Start
启动同该协议相关的资源下载过程。
Suspend
未来扩充需要,暂时未实现
Terminate
结束下载过程,释放扩展分配的资源。
而IInternetProtocol协议的方法定义如下:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IE浏览器 自定义地址协议的实现 IE 浏览器 自定义 地址 协议 实现