如题,我写了一个BHO程序,
在SetSite函数里面获得页面的IWebBrowser2指针,
然后在Invoke函数里响应IE的事件,
我只在DISPID_DOCUMENTCOMPLETE里添加了代码,
弹出一个对话框,显示页面的插件信息,
当我打开一个页面里只有两个插件的网页时,
显示插件信息的对话框却是不停的弹出来,
反反复复都是那两个插件的信息,调试的时候只显示两个,
运行的时候就是不停显示,至少显示五六次吧,
我想知道这是怎么回事?
我只想显示一次,大家给看看,
SetSite函数的代码如下:
STDMETHODIMP CPlu::SetSite(IUnknown *pUnkSite)
{
USES_CONVERSION;

if (pUnkSite)
{
mWebBrowser2 = pUnkSite;
if (mWebBrowser2)
{
return RegisterEventHandler(TRUE);
}
}
return E_FAIL;
}

解决方案 »

  1.   

    因为如果一个页面里包括多个框架页(Frames),每个框架页加载完都会触发DISPID_DOCUMENTCOMPLETE
      

  2.   

    对于复杂的页面,常会由很多FRAME组成。页面加载时,当每个FRAME加载完毕后都会触发DISPID_DOCUMENTCOMPLETE。可以在DISPID_DOCUMENTCOMPLETE中,判断是否是整个页面加载完毕。  
      CComQIPtr<IWebBrowser2,   &IID_IWebBrowser2>   pDisp;  
      pDisp   =   pDispParams->rgvarg[1].pdispVal;  
       
      CComQIPtr<IUnknown,   &IID_IUnknown>   pUnkDisp;  
      pUnkDisp   =   pDisp;  
       
      CComQIPtr<IUnknown,   &IID_IUnknown>   pUnkBrowser;  
      pUnkBrowser   =   m_pWebBrowser2;//m_pWebBrowser2是SetSite中获得的接口  
       
      if(pUnkBrowser   ==   pUnkDisp)  
      {  
      //整个页面加载完毕  
      }  
      else  
      {  
      //其它FRAME加载完毕  
      }