WEB开发网
开发学院软件开发VC 用VisualStudio2005生成浏览器帮助对象(BHO) 阅读

用VisualStudio2005生成浏览器帮助对象(BHO)

 2007-03-15 21:46:38 来源:WEB开发网   
核心提示: 以下是引用片段:classATL_NO_VTABLECHelloWorldBHO:publicCComObjectRootEx,publicCComCoClass,publicIObjectWithSiteImpl,publicIDispatchImpl,publicIDispEventI
以下是引用片段:
  classATL_NO_VTABLECHelloWorldBHO:
  publicCComObjectRootEx,
  publicCComCoClass,
  publicIObjectWithSiteImpl,
  publicIDispatchImpl,
  publicIDispEventImpl<1,CHelloWorldBHO,&DIID_DWebBrowserEvents2,&LIBID_SHDocVw,1,1>

接下来,添加将事件路由到新的 OnDocumentComplete 事件处理程序方法的 ATL 宏,该事件处理程序方法采用的是 DocumentComplete 事件所定义的相同参数和顺序。将以下代码放置到该类的公共部分。

以下是引用片段:
  BEGIN_SINK_MAP(CHelloWorldBHO)
  SINK_ENTRY_EX(1,DIID_DWebBrowserEvents2,DISPID_DOCUMENTCOMPLETE,OnDocumentComplete)
  END_SINK_MAP()
  //DWebBrowserEvents2
  voidSTDMETHODCALLTYPEOnDocumentComplete(IDispatch*pDisp,VARIANT*pvarURL);

提供给 SINK_ENTRY_EX 宏 (1) 的数字指的是 IDispEventImpl 类定义的第一个参数,在必要时用于区分来自不同接口的事件。另请注意,不能从该事件处理程序返回值;这是因为 Internet Explorer 无论怎样都会忽略从 Invoke 返回的值。

最后,添加一个专用成员变量,以跟踪各对象是否已建立了与浏览器的连接。

以下是引用片段:
  private:
  BOOLm_fAdvised;
  HelloWorldBHO.cpp

要通过事件映射将事件处理程序连接到浏览器,可在处理 SetSite 期间调用 DispEventAdvise。同样,使用 DispEventUnadvise 断开连接。

以下是 SetSite 的新实现:

以下是引用片段:
  STDMETHODIMPCHelloWorldBHO::SetSite(IUnknown*pUnkSite)
  {
  if(pUnkSite!=NULL)
  {
  //缓存指向IWebBrowser2的指针。
  HRESULThr=pUnkSite->QueryInterface(IID_IWebBrowser2,(void**)&m_spWebBrowser);
  if(SUCCEEDED(hr))
  {
  //注册以从DWebBrowserEvents2中汇集事件。
  hr=DispEventAdvise(m_spWebBrowser);
  if(SUCCEEDED(hr))
  {
  m_fAdvised=TRUE;
  }
  }
  }
  else
  {
  //取消注册事件汇。
  if(m_fAdvised)
  {
  DispEventUnadvise(m_spWebBrowser);
  m_fAdvised=FALSE;
  }
  //在此释放缓存的指针和其他资源。
  m_spWebBrowser.Release();
  }
  //调用基类实现。
  returnIObjectWithSiteImpl::SetSite(pUnkSite);
  }

最后,添加一个简单的 OnDocumentComplete 事件处理程序。

上一页  3 4 5 6 7 8 9 10  下一页

Tags:VisualStudio 生成 浏览器

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接