5-8万年薪顶级嵌入式,京沪深就业地 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

给IE去掉弹出窗口的BHO实现问题?

楼主legenx(legenx)2002-04-29 15:45:45 在 VC/MFC / 基础类 提问

本人参考中华网的一条关于BHO的例子:  
  http://tech.china.com/zh_cn/netschool/softwares/ie/628/20010306/01.html(MSDN的例子)  
  以及CSDN的去掉弹出窗口的例子:  
  http://www.csdn.net/Develop/Read_Article.asp?Id=10691  
  想为IE去掉弹出窗口。  
  参考了许多资料(ATL,BHO,IDISPATCH....)但怎样都调试不出来。有请高手帮我找出错误,我个人的操作步骤如下:  
   
   
  1、新建ATL工程,选择进程内COM(其余都没有选)工程名:TEST。  
   
  2、通过ATL   Object   Wizard创建了Internet   Explorer   Object的COM(使用缺省设置),接口名:elf。  
   
  3、在elf.h在加入 #include   <ExDisp.h> ,添加三个变量:  
          CComQIPtr<IWebBrowser2,   &IID_IWebBrowser2>   m_spWebBrowser2;  
          CComQIPtr<IConnectionPointContainer,   &IID_IConnectionPointContainer>   m_spCPC;  
          BOOL   bAD;//OnNewWindow2中的Cancel值。  
   
  4、在elf.cpp在加入 #include   <ExDispID.h>   
   
  5、在接口Ielf上单击右键添加5个方法及写入实现代码:  
   
  //=================获取IWebBrowser2的指针=============  
  STDMETHODIMP   Celf::SetSite(IUnknown   *pUnkSite)  
  {  
  //   Retrieve   and   store   the   IWebBrowser2   pointer    
  m_spWebBrowser2   =   pUnkSite;    
   
  if   (m_spWebBrowser2   ==   NULL)  
  return   E_INVALIDARG;  
   
  //   Retrieve   and   store   the   IConnectionPointerContainer   pointer  
  m_spCPC   =   m_spWebBrowser2;  
  if   (m_spCPC   ==   NULL)    
  return   E_POINTER;  
   
  HRESULT   hr;  
  CComPtr<IConnectionPoint>   spCP;  
   
  //   Receives   the   connection   point   for   WebBrowser   events  
  hr   =   m_spCPC->FindConnectionPoint(  
  DIID_DWebBrowserEvents2,    
  &spCP);  
          if   (FAILED(hr))  
  return   hr;  
   
          return   hr;    
  }  
   
  //=========实现IE的事件监听=============  
  STDMETHODIMP   Celf::Invoke(DISPID   dispidMember,   REFIID   riid,   LCID   lcid,   WORD   wFlags,   DISPPARAMS   *pDispParams,   VARIANT   *pvarResult,   EXCEPINFO   *pExcepInfo,   UINT   *puArgErr)  
  {  
        if   (!pDispParams)  
              return   E_INVALIDARG;  
     
        //   Download   Begin  
        if   (dispidMember   ==   DISPID_DOWNLOADBEGIN)  
        OnDownloadBegin();  
   
        //   Download   complete    
        if   (dispidMember   ==   DISPID_DOWNLOADCOMPLETE)  
  OnDownloadComplete();  
   
        //open   AD   window  
        if   (dispidMember   ==   DISPID_NEWWINDOW2)  
  OnNewWindow2(NULL,&bAD);  
   
  return   S_OK;  
  }  
   
  STDMETHODIMP   Celf::OnDownloadBegin()  
  {  
  bAD=TRUE;  
  return   S_OK;  
  }  
   
  STDMETHODIMP   Celf::OnDownloadComplete()  
  {  
  bAD=FALSE;  
  return   S_OK;  
  }  
   
  STDMETHODIMP   Celf::OnNewWindow2(LPDISPATCH   *ppDisp,   BOOL   *Cancel)  
  {  
  *Cancel=bAD;  
  return   S_OK;  
  }  
   
   
  ========================  
  编译完成。  
  但是,我在SetSite方法中加入断点,都没有暂停。  
  Why???????  
  是不是存在许多问题(新手上路)。最好点明操作步骤。  
   
  最好也能email我修正后源码(legenx@163.com),无比感谢!  
   
  问题点数:100、回复次数:10Top

1 楼mickeyx(alanet.51.net)回复于 2002-04-29 16:12:44 得分 0

调试Shell/IE的插件时须预先修改一下系统设置,   见<Debugging   With   the   Shell>Top

2 楼tianlinyi(笨蛋)回复于 2002-04-29 16:55:56 得分 2

upTop

3 楼masterz(www.fruitfruit.com)回复于 2002-04-29 19:44:47 得分 0

add   the   following   to   your   *.rgs   file,   you   have   to   modify   the   CLSID   string   after   "ForceRemove".   And   rebuild   your   project.  
  HKLM    
  {  
    SOFTWARE    
    {  
      Microsoft    
      {        
        Windows    
        {  
  CurrentVersion    
  {  
    Explorer    
    {  
      'Browser   Helper   Objects'    
        {  
  ForceRemove     {DADF130D-84E2-46C3-9BE1-3298086F26A7}                  
  }  
  }  
  }  
  }  
  }  
  }  
  }Top

4 楼masterz(www.fruitfruit.com)回复于 2002-04-29 19:53:49 得分 0

add   a   member   to   your   class  
  DWORD   m_dwCookie;  
  add   this   line   to   your   Celf::SetSite(IUnknown   *pUnkSite)  
  hr   =   spCP->Advise(   reinterpret_cast<IDispatch*>(this),   &m_dwCookie);  
  and   modify   your   Invoke(...)  
        if   (dispidMember   ==   DISPID_NEWWINDOW2)  
        {  
  //Once   you're   connected   to   DWebBrowserEvents2,   implement   your   IDispatch::Invoke   so   that    
  //it   handles   DISPID_NEWWINDOW2.   During   the   IDispatch::Invoke   function   call   for   DISPID_NEWWINDOW2,    
  //the   array   pDispParams   contains   two   parameters.   The   first   one,   at   index   zero,   is   a   Boolean   value    
  //that   tells   the   WebBrowser   Control   whether   to   cancel   the   new   window   or   not.   By   default,   it   is    
  //FALSE   and   a   new   window   will   open.   If   you   want   to   cancel   new   window   creation   completely,    
  //set   the   flag   to   TRUE.  
  //you   have   not   passed   pDispParams   to   OnNewWindow2,   so   I   don't   think   that   function   can   take   effect.   You   can   change   pDispParams   here   directly,   not   using   your   OnNewWindow2  
        }  
  Top

5 楼surfl(晓龙)回复于 2002-04-29 20:36:05 得分 0

学习中。。。!Top

6 楼legenx(legenx)回复于 2002-04-30 10:47:41 得分 0

to:   masterz()    
  那么又怎样可以将值传给OnNewWindow2中的第二个参数?Top

7 楼legenx(legenx)回复于 2002-04-30 11:22:39 得分 0

我试了加入这一行  
  pDispParams->rgvarg[0].boolVal=TRUE;  
  到  
  if   (dispidMember   ==   DISPID_NEWWINDOW2){  
  的下面,但不行,运行IE时仍弹出广告窗口。  
  Top

8 楼masterz(www.fruitfruit.com)回复于 2002-04-30 11:31:19 得分 98

Cxx::Invoke(...)  
  {  
        if   (dispidMember   ==   DISPID_NEWWINDOW2)  
        {  
        if(bAD)  
        {  
  *V_BOOLREF(&pDispParams->rgvarg[0])   =   VARIANT_TRUE;  
        }  
        else  
        {  
  *V_BOOLREF(&pDispParams->rgvarg[0])   =   VARIANT_FALSE;  
        }        
        }  
  }Top

9 楼legenx(legenx)回复于 2002-04-30 11:36:41 得分 0

thanks   a   lot!Top

10 楼myjoy(笑看风云)回复于 2002-04-30 13:23:52 得分 0

收藏!Top

相关问题

  • 给IE去掉弹出窗口的BHO实现问题?
  • 如何去掉win2000-pro 启动时自动弹出的IE
  • 用IE时右下角弹出仿QQ式的广告,很让我烦呀,各位大侠怎么去掉呀
  • 能不能用BHO控制IE的弹出菜单??
  • 我的ActiveX控件放到IE中浏览时总会弹出安全警告框,谁知道怎样可以去掉?
  • 各位兄弟,如何能使弹出来的IE页面只剩下关闭和最小化,最大化,其他的工具栏都去掉?
  • 请教两个问题: 如何让弹出页面的母页面自动关闭?如何去掉IE右键功能?谢谢
  • 连接ACCESS时,总是要弹出LOGIN窗口,如何去掉?
  • 怎么在程序中去掉弹出的对话框
  • 求教:ntdll.DbgUserBreakPoint-----CPU窗口总是弹出来,怎末去掉

关键词

  • ie
  • hr
  • atl
  • onnewwindow
  • pdispparams
  • dispidmember
  • dispid
  • spcpc
  • stdmethodimp celf
  • spwebbrowser

得分解答快速导航

  • 帖主:legenx
  • tianlinyi
  • masterz

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
x 提问