- 浏览: 169186 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (186)
- [网站分类]4.其他技术区 (93)
- [网站分类]6.转载区(Java技术文章转载, 请注明原文出处) (4)
- [网站分类]3.非技术区 (7)
- [网站分类]1.网站首页原创Java技术区(对首页文章的要求: 原创、高质量、经过认真思考并精心写作。BlogJava管理团队会对首页的文章进行管理。) (28)
- HTML&CSS (0)
- 感悟生活 (4)
- c#(.net) (1)
- [网站分类]2.Java新手区 (32)
- [网站分类]5.提问区(Java方面的技术提问) (1)
- java (6)
- web前端 (7)
- php (0)
- C++ (1)
- python (0)
- 互联网应用 (0)
最新评论
-
lliiqiang:
请求单线程资源只能等待结果.
Applet 与JS通信 -
feng2qin:
期待你的精彩回到。QQ:864479410
Applet 与JS通信 -
feng2qin:
我想问一句;哥们儿,applet程序中调用js,你真的成功了嘛 ...
Applet 与JS通信 -
lyaixsp:
...
ExtJS 入门学习之 window与panel篇 -
longzijian:
不知道 java-he 现在找到数组的这种特性 的原因在那里
和网友关于javascript数组的讨论
1.什么叫BHO
Browser Helper Objects,"浏览器帮助者对象",以下皆简称BHO。
2.支持BHO特性的系统一览表:
Shell版本 操作系统版本 支持BHO
4.00 Windows 95 and Windows NT 4.0(IE版本为 4.0) 仅IE4.0
4.71 Windows 95 and Windows NT 4.0(IE版本为 4.0) IE和文件浏览器
4.72 Windows 98 IE和文件浏览器
5.00 Windows 2000 IE和文件浏览器
3.BHO注册表中的位置
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects\{7C260B4B-F7A0-40B5-B403-
BEFCDC6A4C3B}
IE启动时候根据此项到HKEY_CLASSES_ROOT\CLSID下面找到对应BHO组件加载。
4.基本逻辑
IE将自己的IUnKnown指针传递给BHO,BHO需要建立一个私有的基于COM的通讯通道,目的是响应IE事件。所以BHO最重要的是实现
IObjectWithSite 接口。IE 通过这个接口,传递自己的IUnknown接口,BHO存储该接口,进一步通过调用IObjectWithSite 提供的方法。
IE启动时候会依次执行一些函数,把BHO自己的函数注册到这里,书面上称之为连接点。这样就能调用进入 BHO自己的程序内部了。
5.IObjectWithSite 介绍
主要有两个函数要实现:
a).HRESULT SetSite(IUnknown* pUnkSite) 接收ie浏览器的IUnknown指针。典型实现是保存该指针以备将来使用。
b).HRESULT GetSite(REFIID riid, void** ppvSite) 从通过SetSite()方法设置的场所中接收并返回指定的接口,典型实现是查询前面保
存的接口指针以进一步取得指定的接口。
6.下面通过一个实例来讲解下
目标是启动IE 访问 http://www.blogjava.net/JAVA-HE/的时候弹出一个警告对话框。
a) 首先启动VC 2005 新建工程 ATL Project
工程名字: HelloWorld
Application Settings 中,Server type 选择 Dynamic-link library (dll) 其他都不选。(简单总结为以atl 创建dll工程)
b) 其次在新建好的CLASS VIEW下选择 工程 HelloWorld 右键 add -> class
选择创建ATL Simple Object ,下一步 在short name中输入 HelloWorldBHO 其他都自动补齐不用管。
下一步在options中 :
Threading mode 选择 Apartment ;
Aggregation 选择 no;
Interface 选择 Dual
support 选择 IObjectWithSite(IE object support)
点击Finish ,这是一个最简单的BHO已经创建好了。
c) 目前要做的就是添砖了
编辑 HelloWorldBHO.h 发现系统已经为你创建了 CHelloWorldBHO类, 在类的最下行有一个public: 没后文,这里就是系统提示你要添加的代
码了。
CHelloWorldBHO 中SetSite 已经为你添加将浏览器的IUnknown 指针保存下来(见m_spUnkSite);。
现在要做的是注册到连接点。
{
IObjectWithSiteImpl<CHelloWorldBHO>::SetSite(pUnkSite);
RegisterEventHandler(TRUE);
return S_OK;
}
继承父类的 SetSite方法,显示调用父类(SetSite)方法,添加一个注册函数。(就是前面所述的,添加到连接点)
{
CComPtr<IConnectionPoint>spCP;
m_spWebBrowser2 = m_spUnkSite;
if( m_spWebBrowser2 == NULL )
{
return E_FAIL;
}
CComQIPtr<IConnectionPointContainer,&IID_IConnectionPointContainer> spCPC(m_spWebBrowser2);
if(spCPC == NULL)
{
return E_FAIL;
}
// 查找到连接点
HRESULT hr = spCPC->FindConnectionPoint(DIID_DWebBrowserEvents2, &spCP);
if(FAILED(hr))
{
return hr;
}
if(inAdvise)
{
// 添加到连接点 (注册)
hr = spCP->Advise(reinterpret_cast<IDispatch *>(this), &mCookie);
}else
{
// 反注册
spCP->Unadvise(mCookie);
}
return hr;
}
其中成员声明:
DWORD mCookie;
连接点注册上去的索引,方便以后反注册使用。
CComQIPtr<IWebBrowser2> m_spWebBrowser2;
m_spWebBrowser2 用来将浏览器IUnknown 指针转变为 IWebBrowser2 ,并保存方便后面使用。
我们可以看到将 IDispatch 接口注册上去了。 想想 COM组件应用(2)——IUnknown 中写过的 QueryInterface的应用,我们就知道
这里把IDispatch 接口注册上去,说明浏览器将可以调用IDispatch 的方法了。
查IDispatch 接口,主要核心在于实现 Invoke 函数。
2 WORD wFlags, DISPPARAMS * pDispParams,
3 VARIANT * pvarResult, EXCEPINFO * pexcepinfo,
4 UINT * puArgErr)
5 {
6 USES_CONVERSION;
7 if(!pDispParams)
8 {
9 return E_INVALIDARG;
10 }
11 switch(dispidMember)
12 {
13 case DISPID_BEFORENAVIGATE2:
14 {
15 CComBSTR strUrl;
16 if( m_spWebBrowser2 != NULL )
17 m_spWebBrowser2->get_LocationURL(&strUrl);
18
19 if (strUrl == CComBSTR("http://www.blogjava.net/JAVA-HE/"))
20 {
21 ::MessageBox(NULL, _T("该网页是我的blog!"),_T("Warning"),MB_ICONSTOP);
22 return S_OK;
23 }
24
25 break;
26 }
27
28 case DISPID_NAVIGATECOMPLETE2:
29 break;
30 case DISPID_DOCUMENTCOMPLETE:
31 break;
32 case DISPID_DOWNLOADBEGIN:
33 break;
34 case DISPID_DOWNLOADCOMPLETE:
35 break;
36 case DISPID_NEWWINDOW2:
37 break;
38 case DISPID_QUIT:
39 RegisterEventHandler(FALSE);
40 break;
41 default:
42 break;
43 }
44
45 return S_OK;
46 }
上面是这次实例的范例代码。有兴趣的朋友可以照着敲下,下面还是讲下这个函数里面的一些点:
I.最佳反注册时机
case DISPID_QUIT:
RegisterEventHandler(FALSE);
在浏览器退出的时候,是最佳反注册时机,不然可能浏览器退出后,你的BHO还在运行哦(有可能)
II. 有些宏需要引入头文件
#include <exdisp.h >
#include <ExDispid.h>
III.当要使用ATL 编码转换时候在函数开头引入 USES_CONVERSION; 宏,不过这里如果没有转换应用,可以去掉。
根据支持BHO特性,为了不让资源管理器加载该BHO,所以在dll main 函数里加入如下代码判断是否加载:
{
TCHAR pszLoader[MAX_PATH];
GetModuleFileName(NULL,pszLoader,MAX_PATH);
_tcslwr(pszLoader);
if(_tcsstr(pszLoader,_T("explorer.exe")))
{
return FALSE;
}
}
发表评论
-
图象缓冲
2007-02-07 09:45 743图象缓冲的应用双缓冲绘图:<!--<br>& ... -
检验邮箱
2007-02-08 09:46 773<!--<br><br> ... -
批处理命令总结
2007-02-08 16:52 693批处理命令总结:@ 符号后 的命 ... -
学习UML笔记
2007-02-27 17:30 746学习 UML 笔记 前言 为了自己能快速将 UML ... -
blog加上一个同页面浏览者聊天室代码
2007-05-23 10:17 698都是用的别人提供的服务。哈哈。<script type= ... -
常见网页技巧
2007-06-10 16:32 5481.鼠标移动上去,图片变亮,移开又变成灰色。改变的是透明度。 ... -
javascript 数组排序
2007-07-01 03:16 715javascript 数组排序发现一个我原来不知道的事情: ... -
javascript 在客户端绘制图表系列三——xy坐标曲线图
2007-07-01 04:31 1296系列1、2中介绍过的内容在这里不会赘述。原理同面1、2基本一样 ... -
搭建php的运行环境
2007-07-31 18:50 871配置 php 环境 ... -
从网页导出excel
2007-08-09 21:36 707<?xml:namespace ... -
简单日期下拉框
2007-08-09 22:13 832项目中用到一个级联、动态下拉选择日期框。我以前也收集 ... -
php学习笔记1
2007-08-22 22:36 785前面总结过 ... -
php学习笔记2
2007-08-23 23:33 716主要内容:总结了第四章,主要关于字符串处理。参考书籍 ... -
分享一个表格排序程序
2007-08-23 23:46 643应广大网友要求特此分享一个表格排序的程序。有问题,欢迎留言(虽 ... -
AJAX愉快之旅——prototype.js篇
2007-08-24 09:53 588AJAX ... -
Javascript 事件转移
2007-09-19 08:52 723我遇到的Javascript 现 ... -
网页打印脚本
2007-09-19 08:55 1570<html><head><sty ... -
记录访问者IP
2007-09-19 10:46 830<?php //文件名字 $filename = &q ... -
JAVASCRIPT COOKIE初级指南
2007-12-23 23:43 6491、设置COOKIE数据: 最 ... -
PHP读取4种配置文件(php,ini,yaml,xml)
2007-12-23 23:49 828<?php/*** 读取4中配置的表信息,现支持php. ...
相关推荐
VCpp开发BHO插件——定制你的浏览器 BHO Plugin + EyeOnIE
利用vc++进行BHO编写,成功创建的BHO,不仅可以得到各种标准的浏览器操作事件,并做出响应;还可以定制浏览器的菜单、工具条等界面元素;更或者可以安装钩子函数,监视浏览器的一举一动。值得注意的是,使用BHO插件...
C#下Browser Helper Object (BHO)定制浏览器2分钟学习教程及示例代码 微软已经推出了Browser Helper Object (BHO),以使得众多开发人员可以定制自己的浏览器,或者说开发自己的浏览器。本文及示例代码向你展示在C#中...
3、BHO_HelloWorld 4、BHOEvent BHO开发实例之文档对象事件响应 5、BHOIE插件 6、BHO插件开发文档及例程 7、BHO定制你的浏览器 8、bho实例,实现基本事件 9、BHO学习教程及示例代码 10、BHO样例, 可以用来制作模板 ...
此资源是本人进行bho开发尝试时所整理利用的一些资料,包括 《com原理与应用》。《Visual C++ 6.0 模板库参考手册》等书籍资料。适合对c++ bho并不十分了解又想接触的朋友。里面还有很多可参考的网址。
学习bho的很好例子 BHO框架可以实现对网页访问监控
运行了,马上清除IE里的所有BHO插件,小心使用!!!
利用VC+bho写的一个插件例子,可以用来供刚进行BHO编写的同志进行入门级学习,并给我提出意见
学习BHO最重要的一个例子,特别是初学者
BHO小小整理, BHO小小整理, BHO小小整理, BHO小小整理, BHO小小整理, BHO小小整理,
IE浏览器插件编程-COM ATL BHO.zip
BHO(Browser Help Objects),是实现了特定接口的COM组件。开发好的BHO插件在注册表特定的位置注册好后,每当微软的浏览器启动,BHO实例就会被创建。本插件实现定制你的浏览器
其实Windows8刚出来的时候写过一篇关于BHO怎么与Win8 x86下IE11(增强保护模式开启)兼容的文章(传送门:http://blog.csdn.net/magictong/article/details/21280243),本文主要讨论的问题是Windows10 x86 & x64...
VC++ BHO 教程 源代码 资料VC++ BHO 教程 源代码 资料VC++ BHO 教程 源代码 资料VC++ BHO 教程 源代码 资料VC++ BHO 教程 源代码 资料VC++ BHO 教程 源代码 资料
VB6 BHO 教程 资料 源代码VB6 BHO 教程 资料 源代码VB6 BHO 教程 资料 源代码VB6 BHO 教程 资料 源代码VB6 BHO 教程 资料 源代码VB6 BHO 教程 资料 源代码
vb bho插件开发
BHO插件开发与发布
供bho初学者入门,说明了bho的开发流程及关键步骤,有参考价值。
简单的浏览器BHO插件程序源代码,基于.net 4.0,vs2010