您现在的位置:首页 >> API >> API >> 内容

Delphi阻断弹出式广告的BHO(2)

时间:2011/9/3 15:44:32 点击:


IObjectWithSite的接口的实现

 

先看IObjectWithSite的接口的实现,当IE加载BHO扩展后,会调用BHO的扩展,把自身的IUnknown接口作为参数pUnkSite传给扩展,BHO扩展应该从pUnkSite参数中获得浏览器接口IWebBrowser2,同时为了监听浏览器的事件,还需要获得事件链接点接口,IE的支持的事件都定义在DWebBrowserEvents2的双接口中,使用链接点的Advise方法建立对IE事件的监听,注意Advise方法调用后 会返回一个Cookie,需要保存Cookie,后面在退出IE时,需要Cookie作为参数来断开对IE事件的监听。

function TTIEAdvBHO.SetSite(const pUnkSite: IInterface): HResult;
begin
  Result := E_FAIL;
  //保存接口
  FIESite := pUnkSite;
  if not Supports(FIESite, IWebBrowser2, FIE) then
Exit;
  //获得事件连接点
  if not Supports(FIE, IConnectionPointContainer, FCPC) then
    Exit;
  FCPC.FindConnectionPoint(DWebBrowserEvents2, FCP);
  //监听事件
  FCP.Advise(Self, FCookie);
  Result := S_OK;
end;
后面IE有时会调用IObjectWithSite接口的GetSite方法获得需要的接口,这时可以将保存的接口返回。

function TTIEAdvBHO.GetSite(const riid: TIID;
  out site: IInterface): HResult;
begin
  if Supports(FIESite, riid,site) then
    Result := S_OK
  else
    Result:= E_NOINTERFACE;
end;
 

IDispatch接口的实现

 

前面我们在SetSite中建立了对IE事件的监听,建立事件监听后每当IE产生了新的事件,它就会调用扩展的IDispatch接口的Invoke方法通知扩展发生的事件类型以及事件参数,并请求扩展对事件进行处理。因此对于BHO扩展来说,IDispatch接口的Invoke方法是必须实现的,而其它的GetTypeInfoCount,GetTypeInfo和GetIDsOfNames方法都无须实现,只要返回结果为E_NOTIMPL,表示未实现该方法就可以了。

上一页12345下一页

作者:陈省 来源:转载
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
本类推荐
  • 没有
本类固顶
  • 没有
  • 盒子文章(www.2ccc.com) © 2022 版权所有 All Rights Reserved.
  • 沪ICP备05001939号