惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LINUX DO - 最新话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
PCI Perspectives
PCI Perspectives
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
H
Heimdal Security Blog
S
Security @ Cisco Blogs
N
News | PayPal Newsroom
J
Java Code Geeks
罗磊的独立博客
Security Archives - TechRepublic
Security Archives - TechRepublic
N
News and Events Feed by Topic
V
V2EX
WordPress大学
WordPress大学
Google Online Security Blog
Google Online Security Blog
N
News and Events Feed by Topic
www.infosecurity-magazine.com
www.infosecurity-magazine.com
月光博客
月光博客
AI
AI
小众软件
小众软件
The GitHub Blog
The GitHub Blog
MongoDB | Blog
MongoDB | Blog
A
Arctic Wolf
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
美团技术团队
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Tailwind CSS Blog
S
Schneier on Security
博客园 - 三生石上(FineUI控件)
F
Full Disclosure
B
Blog RSS Feed
Forbes - Security
Forbes - Security
S
SegmentFault 最新的问题
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
人人都是产品经理
人人都是产品经理
云风的 BLOG
云风的 BLOG
Jina AI
Jina AI
Cisco Talos Blog
Cisco Talos Blog
U
Unit 42
Project Zero
Project Zero
H
Hacker News: Front Page
Y
Y Combinator Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
The Cloudflare Blog
大猫的无限游戏
大猫的无限游戏
S
Secure Thoughts
The Hacker News
The Hacker News
Microsoft Azure Blog
Microsoft Azure Blog

博客园 - 飞天名猪

django 定制管理页面外观 模板文件不生效的解决方法 新手上路,django学习笔记(1) 环境部署 Windows7系统命令总结 VC 编程ANSI环境下读写Unicode文件(转载) ICE3.1.1 开发中遇到的问题(四) 发布9个腾讯微博的邀请码 [转载]vc6转2008的一些实践经验 - 飞天名猪 - 博客园 IcePatch2+IceGrid部署的解决方案 ICE 开发中遇到的问题(三) Ice开发中遇到的问题(二) ICE开发中遇到的问题 (一) - 飞天名猪 - 博客园 使用ICE遇到的编译问题 dbf文件结构 判断操作系统的类型 浏览器插件-- Browser Helper Object(BHO) 三 浏览器插件-- Browser Helper Object(BHO) 二 浏览器插件-- Browser Helper Object(BHO) 一 window程序自启动的几种方法(四) windows程序自启动的几种方法(三)系统配置文件
浏览器插件-- Browser Helper Object(BHO) 四
飞天名猪 · 2008-06-02 · via 博客园 - 飞天名猪
 

BHO中处理IE的事件

    IEHelperSetSite方法的实现过程中,IEHelper通知IE浏览器他想要收到所有IE触发的事件。为了能够从IE中收到事件,你必须实现IDispatch接口。

    在默认的情况下,简单的ATL对象从IDispatchImpl中继承,当IE触发了事件的时候, 你可以使用AtlAdvise来让IE通知你。仅有的一个你需要重写的IDispatchImpl方法是Invoke方法。每次IE激发了一个事件的时候,他都会调用你的Invoke方法。

    为了停止收到事件,你可以雕用AtlUnadvise方法。当IE通知你,他正在退出的时候,你必须调用AtlUnadvise传递DISPID_QUIT参数到Invoke方法。下面的代码重写了Invoke方法。就象我们看到的那样,下面的大部分代码是为了处理IE的事件并且将这些事件的名字写到IEHelper事件的窗口中。

STDMETHODIMP CIEHlprObj::Invoke(DISPID dispidMember, REFIID riid,
                                LCID lcid, WORD wFlags,
                                DISPPARAMS
* pDispParams,
                                VARIANT
* pvarResult,
                                EXCEPINFO
*  pExcepInfo, UINT* puArgErr)
{
   USES_CONVERSION;
   strstream strEventInfo;
 
   
if (!pDispParams)
      
return E_INVALIDARG;
 
   
//
   
// Get the current URL.
   
//  
   LPOLESTR lpURL = NULL;
   m_spWebBrowser2
->get_LocationURL(&lpURL);
 
   
switch (dispidMember)
   
{
      
//
      
// The parameters for this DISPID are as follows:
      
// [0]: Cancel flag  - VT_BYREF|VT_BOOL
      
// [1]: HTTP headers - VT_BYREF|VT_VARIANT
      
// [2]: Address of HTTP POST data  - VT_BYREF|VT_VARIANT 
      
// [3]: Target frame name - VT_BYREF|VT_VARIANT 
      
// [4]: Option flags - VT_BYREF|VT_VARIANT
      
// [5]: URL to navigate to - VT_BYREF|VT_VARIANT
      
// [6]: An object that evaluates to the top-level or frame
      
//      WebBrowser object corresponding to the event 
      
//
      case DISPID_BEFORENAVIGATE2:
         strEventInfo 
<< "BeforeNavigate2: ";
 
         
if (pDispParams->cArgs >= 5 &&
             pDispParams
->rgvarg[5].vt == (VT_BYREF|VT_VARIANT))
         
{
            CComVariant varURL(
*pDispParams->rgvarg[5].pvarVal);
            varURL.ChangeType(VT_BSTR);
 
            strEventInfo 
<< OLE2T(varURL.bstrVal);
         }

         
else
            strEventInfo 
<< "NULL";
 
         strEventInfo 
<< ends;
         
break;
 
      
//
      
// The parameters for this DISPID:
      
// [0]: URL navigated to - VT_BYREF|VT_VARIANT
      
// [1]: An object that evaluates to the top-level or frame
      
//      WebBrowser object corresponding to the event 
      
//
      case DISPID_NAVIGATECOMPLETE2:
         
if (pDispParams->rgvarg[0].vt == (VT_BYREF|VT_VARIANT))
         
{
            CComVariant varURL(
*pDispParams->rgvarg[0].pvarVal);
            varURL.ChangeType(VT_BSTR);
  
            strEventInfo 
<< "NavigateComplete2: "
                         
<< OLE2T(varURL.bstrVal)
                         
<< ends;
         }

         
break;
 
      
//
      
// The parameters for this DISPID:
      
// [0]: New status bar text - VT_BSTR
      
//
      case DISPID_STATUSTEXTCHANGE:
         LPOLESTR lpStatusText;
 
         m_spWebBrowser2
->get_StatusText(&lpStatusText);
         strEventInfo 
<< "StatusTextChange: ";
 
         
if (!strcmp(OLE2T(lpStatusText), ""))
            strEventInfo 
<< "NULL";
         
else
            strEventInfo 
<< OLE2T(lpStatusText);
 
         strEventInfo 
<< ends;
         
break;
 
      
//
      
// The parameters for this DISPID:
      
// [0]: Maximum progress - VT_I4
      
// [1]: Amount of total progress - VT_I4
      
//
      case DISPID_PROGRESSCHANGE:
         strEventInfo 
<< "ProgressChange: ";
 
         
if (pDispParams->cArgs == 0)
            strEventInfo 
<< "NULL";
         
else
         
{
            
if (pDispParams->rgvarg[0].vt == VT_I4)
               strEventInfo 
<< pDispParams->rgvarg[0].lVal;
 
            
if (pDispParams->cArgs > 1 &&
                pDispParams
->rgvarg[1].vt == VT_I4)
            
{
               strEventInfo 
<< "" << pDispParams->rgvarg[1].lVal;
            }

         }

 
         strEventInfo 
<< ends;
         
break;
 
      
case DISPID_DOCUMENTCOMPLETE:
         strEventInfo 
<< "DocumentComplete" << ends;
         
break;
 
      
case DISPID_DOWNLOADBEGIN:
         strEventInfo 
<< "DownloadBegin" << ends;
         
break;
 
      
case DISPID_DOWNLOADCOMPLETE:
         strEventInfo 
<< "DownloadComplete" << ends;
         
break;
 
      
//
      
// The parameters for this DISPID:
      
// [0]: Enabled state - VT_BOOL
      
// [1]: Command identifier - VT_I4
      
//
      case DISPID_COMMANDSTATECHANGE:
         strEventInfo 
<< "CommandStateChange: ";
 
         
if (pDispParams->cArgs == 0)
            strEventInfo 
<< "NULL";
         
else
         
{
            
if (pDispParams->rgvarg[0].vt == VT_BOOL)
            
{
               strEventInfo 
<< ((pDispParams->rgvarg[0].boolVal == 
                                 VARIANT_TRUE) 
? "True" : "False");
            }

 
            
if (pDispParams->cArgs > 1 &&
                pDispParams
->rgvarg[1].vt == VT_I4)
            
{
               strEventInfo 
<< "" << pDispParams->rgvarg[1].lVal;
            }

         }

 
         strEventInfo 
<< ends;
         
break;
 
      
case DISPID_NEWWINDOW2:
         strEventInfo 
<< "NewWindow2" << ends;
         
break;
 
      
//
      
// The parameters for this DISPID:
      
// [0]: Document title - VT_BSTR
      
//
      case DISPID_TITLECHANGE:
         strEventInfo 
<< "TitleChange: ";
 
         
if (pDispParams->cArgs > 0 &&
             pDispParams
->rgvarg[0].vt == VT_BSTR)
         
{
            strEventInfo 
<< OLE2T(pDispParams->rgvarg[0].bstrVal);
         }

         
else
         
{
            strEventInfo 
<< "NULL";
         }

 
         strEventInfo 
<< ends;
         
break;
 
      
//
      
// The parameters for this DISPID:
      
// [0]: Name of property that changed - VT_BSTR
      
//
      case DISPID_PROPERTYCHANGE:
         strEventInfo 
<< "PropertyChange: ";
 
         
if (pDispParams->cArgs > 0 &&
             pDispParams
->rgvarg[0].vt == VT_BSTR)
         
{
            strEventInfo 
<< OLE2T(pDispParams->rgvarg[0].bstrVal);
         }

         
else
         
{
            strEventInfo 
<< "NULL";
         }

 
         strEventInfo 
<< ends;
         
break;
 
      
//
      
// The parameters for this DISPID:
      
// [0]: Address of cancel flag - VT_BYREF|VT_BOOL
      
//
      case DISPID_QUIT:
         strEventInfo 
<< "Quit" << ends;
 
         ManageConnection(Unadvise);
         m_dlgEvents.DestroyWindow();
         
break;
 
      
default:
         strEventInfo 
<< "Unknown Event" << dispidMember << ends;
         
break;
   }

 
   m_dlgEvents.AddEventToList(strEventInfo.str());
 
   
return S_OK;
}