一直以来,已经写过几个BHO控件,一段时间之后发现,只是记得大概流程,但是由于时间太长,已经不太能记得细节了,所以第二次写的时候就有些困难,明明已经正确生成,但是就是不能再加载项中发现,对于已经接触过的技术,实在是汗颜,于是决心记录下该项技术,以备不时之需

首先建立一个ATL项目

下一步,直接完成即可

其次呢,就是添加一个ATL简单对象,如下图所示

然后呢,就是添加ATL简单对象的过程

下一步,如下图所示

只需要填入简称,其他就会自动填好,这样就好,然后点击下一步,->下一步

需要注意的就是支持那一栏IObjectWithSite一定要勾上!!!

然后呢,就是创建类的成员变量和类的成员函数

[cpp] view plaincopy
  1. STDMETHOD(SetSite)(IUnknown*p);
  2. CComQIPtr<IWebBrowser2,&IID_IWebBrowser2>m_spWebBrowser;
  3. HRESULT Connecnt(BOOL);
  4. DWORD m_cookie;
  5. STDMETHODIMP Invoke(DISPID dispidMember,REFIID riid, LCID lcid,
  6. WORD wFlags, DISPPARAMS * pDispParams,
  7. VARIANT * pvarResult,EXCEPINFO * pexcepinfo,
  8. UINT * puArgErr);

其实,SetSite是IObjectWithSite接口的成员函数,然后呢,我们要将其记录下来,也就是IE浏览器的指针。然后再EyeOIE的cpp文件中写入如下代码

[cpp] view plaincopy
  1. STDMETHODIMP CEyeOnIE::SetSite(IUnknown*pSite)
  2. {
  3. m_spWebBrowser=pSite;
  4. if(m_spWebBrowser==NULL)
  5. {
  6. return E_INVALIDARG;
  7. }
  8. return Connecnt(true);
  9. }
  10. HRESULT CEyeOnIE::Connecnt(BOOL pB)
  11. {
  12. CComPtr<IConnectionPoint>spPC;
  13. CComQIPtr<IConnectionPointContainer,&IID_IConnectionPointContainer>spCPC(m_spWebBrowser);
  14. HRESULT hr=spCPC->FindConnectionPoint(DIID_DWebBrowserEvents2,&spPC);
  15. if(FAILED(hr))
  16. {
  17. return hr;
  18. }
  19. if(pB)
  20. {
  21. hr=spPC->Advise(reinterpret_cast<IDispatch*>(this),&m_cookie);
  22. }
  23. else
  24. {
  25. hr=spPC->Unadvise(m_cookie);
  26. }
  27. return hr;
  28. }
  29. STDMETHODIMP CEyeOnIE::Invoke(DISPID dispidMember,REFIID riid, LCID lcid,
  30. WORD wFlags, DISPPARAMS * pDispParams,
  31. VARIANT * pvarResult,EXCEPINFO * pexcepinfo,
  32. UINT * puArgErr)
  33. {
  34. USES_CONVERSION;
  35. if (!pDispParams)
  36. return E_INVALIDARG;
  37. switch (dispidMember)
  38. {
  39. case 250://DISPID_BEFORENAVIGATE2:
  40. break;
  41. case 252://DISPID_NAVIGATECOMPLETE2:
  42. break;
  43. case 259://DISPID_DOCUMENTCOMPLETE:
  44. ::MessageBoxA(NULL,"dada",0,0);
  45. break;
  46. default:
  47. break;
  48. }
  49. return S_OK;
  50. }

其实SetSite和Connect两个函数就是两个功能,一个是记录下IE浏览器的指针,然后呢就是,将浏览器指针强制类型转换,变成连接点管理器,然后,由得到的连接点管理器获得连接点,根据连接点,激活IE浏览器和BHO之间的通信,这样就完成了基本的操作,然后呢就是一些其他与BHO功能本身无关的代码了,但也是必须的

在dllmain.cpp文件中加入

[cpp] view plaincopy
  1. if (dwReason == DLL_PROCESS_ATTACH)
  2. {
  3. TCHAR pszLoader[MAX_PATH];
  4. //返回调用者模块的名称,第一个参数应为NULL,详见msdn。
  5. GetModuleFileName(NULL, pszLoader, MAX_PATH);
  6. _tcslwr(pszLoader);
  7. if (_tcsstr(pszLoader, _T("explorer.exe")))
  8. return FALSE;
  9. }

这样就避免了文件管理器加载该BHO插件,然后呢就是寻找EyeOnIE.rgs文件中加入一个注册表输出

[cpp] view plaincopy
  1. HKLM
  2. {
  3. SOFTWARE
  4. {
  5. Microsoft
  6. {
  7. Windows
  8. {
  9. CurrentVersion
  10. {
  11. Explorer
  12. {
  13. 'Browser Helper Objects'
  14. {
  15. {<strong>851FBDE4-1953-4B58-AF94-5D072F1E9ED1</strong>}
  16. }
  17. }
  18. }
  19. }
  20. }
  21. }
  22. }

上面加粗的内容呢就是该BHO的CLSID,该CLSID的定义在BhoPlugin.idl文件中,

将该文件中的CLSID替换掉EyeOnIE.rgs文件中即可,这样BHO的创建就完成了!!!

PS:::::我在进行网页信息的获取时,有时会将网页中的内容就录下来,想放在txt文档中,但是呢,代码是正确的,就是不执行,经过一系列的文件查找,发现必须使用管理员权限运行IE浏览器,才能执行,对于遇到同样问题的童鞋,予以提醒

BHO的创建-Window7 VS2010相关推荐

  1. C++ 使用VS2010创建MFC ActiveX工程项目

    1.ActiveX的基本概念 ActiveX控件可以看作是一个极小的服务器应用程序,它不能独立运行,必须嵌入到某个容器程序中,与该容器一起运行.这个容器包括WEB网页,应用程序窗体等... Activ ...

  2. 基于Delphi的BHO开发基础

    在Windows操作系统上,我们最常见的浏览器有两种:文件浏览器(exploer.exe,应用于文件系统)和Internet浏览器(iexplore.exe,应用于互联网资源).由于这两个浏览器功能强 ...

  3. 反射(13)——C#开发BHO插件UrlTrack

    最近忽然突发奇想,想统计一下我最经常上的网站是哪些,并且在这些网站上都停留了多久.为此决定写一个BHO插件来做这件事. BHO(Browser Help Objects)是实现了特定接口(IObjec ...

  4. java bho_COM组件应用(3)——BHO学习

    1.什么叫BHO Browser Helper Objects,"浏览器帮助者对象",以下皆简称BHO. 2.支持BHO特性的系统一览表: Shell版本 操作系统版本 支持BHO ...

  5. Java bho插件_VC++开发BHO插件——定制你的浏览器  作者 陆其明

    关键字 BHO Browser COM ATL 网址过滤 原作者姓名 陆其明 文章原始出处 http://hqtech.nease.net 读者评分 18 评分次数 4 正文 在Windows操作系统 ...

  6. 创建带界面UI的Activex

    1.ActiveX的基本概念 ActiveX控件可以看作是一个极小的服务器应用程序,它不能独立运行,必须嵌入到某个容器程序中,与该容器一起运行.这个容器包括WEB网页,应用程序窗体等... Activ ...

  7. TFS 2010 使用手册(二)项目集合与项目

    1.项目集合 1.1 项目集合创建 打开TFS管理控制台,点击"团队项目集合". 图1点击"团队项目集合" 图2 点击"创建集合" 然后按照 ...

  8. C++调用Asprise OCR识别图片

    在一个识别软件中发现了Asprise OCR的"身影",上官网查了一下相关信息,发现功能挺强大的,识别印刷体应该不错,遗憾的是好像不能识别中文,不过不知道它对扭曲后的英文识别能力怎 ...

  9. Silverlight 4新控件PivotViewer介绍

    早在Silverlight 4正式版发布之前,微软发布PivotViewer控件的演示版本,其处理以及展示大批量数据的功能吸引不少开发人员和终端客户,今天微软发布了PivotViewer控件正式版本, ...

最新文章

  1. 【鸿蒙 HarmonyOS】Ability 中使用纯代码绘制布局及 UI 组件
  2. 高性能I/O设计模式Reactor和Proactor
  3. 玻璃质感_素描丨零基础,你也可以画出玻璃质感
  4. java取出连续子串_JAVA :在给定一个数组中,可以取得多个连续的子串。在众多子串中,求各元素和为最大值的连续子串...
  5. b站 实时弹幕和历史弹幕 Protobuf 格式解析
  6. K均值聚类关于初始聚类中心的探讨
  7. 微信又一期待已久的功能上线:是手残党的福音了
  8. Https背景与证书在spring boot项目中的使用
  9. python冒泡排序_python实现基本算法之冒泡排序(Bubble Sort)
  10. vue axios封装
  11. 怎样查看PPT中的字数
  12. [iuud8]ios不同版本下推送本地通知
  13. 小米手机android目录在哪里设置字体,在哪里修改小米手机的字体大小
  14. 《计算机程序的构造和解释》阅读笔记:准备(3)【python3简单实现lisp解释器(3)】
  15. 人工智能数学基础之函数与极限(无穷小与夹逼定理),附视频详解【菜鸟窝出品】
  16. 黑基网博客——网络安全、工具软件、无线智能设备、编程开发、网赚分享与交流基地
  17. 个人免签支付系统,2019完美的个人支付源码
  18. html 气泡动画效果,css3实现好看的气泡按钮动画特效
  19. 【Web前端笔记-基础】第八课·初识 CSS,CSS属性
  20. 《Joint 3D Face Reconstruction and Dense Alignment with Position Map Regression Network》论文学习笔记

热门文章

  1. 有符号整型和无符号整型
  2. Fabrice Bellard
  3. 驱动器D中的磁盘未被格式化
  4. 《Java工程师成神之路》深入理解Java核心技术(基础篇)
  5. C语言static和const的区别
  6. css实现红心点赞动态效果
  7. PHP简易实现批量生成html静态页面
  8. 韦德之道---说一说詹韦连线
  9. Web3中文|未来的工作模式:VR头显、元宇宙和供应商协作
  10. 用html做网站古诗春思,春思