VB BHO

canca canca
2009-04-01 22:00
2
0

以前一直不知道有BHO这个名字,但一直对IE中的"加载项"编程念念不忘. 前不久一网友让我做一个小程序,功能就是替换网页中指定的内容,但是不启动软件,直接用IE看的话就是原文.感觉有点意思的,因为不知道原理,网上找了一下BHO这个名词自然就落入眼底了.

BHO(浏览器辅助对象)用于IE的加载项中,可以对IE的事件进行拦截编程(可以是IE上的工具条,或者按钮或者不可见插件).BHO的定义位于注册表"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects\" 下,当IE启动时就加载了该项下所有子项.通过IObjectWithSite接口同前面的工具条扩展一样可以用来获得浏览器的接口,而IDispatch接口,则被用来监听浏览器的事件。

在VB中IObjectWithSite需要用工具生成然后再VB工程中引用,还要添加MSHTML及SHDOCWV两个库,最后代码如下,替换一个网页中第一个链接的内容

 

 

 Implements IObjectWithSiteTLB.IObjectWithSite
Dim WithEvents m_ie As InternetExplorer
Attribute m_ie.VB_VarHelpID = -1
Dim m_Site As IUnknownVB

Private Sub IObjectWithSite_GetSite(ByVal priid As IObjectWithSiteTLB.GUIDPtr, ppvObj As IObjectWithSiteTLB.VOIDPtr)
    m_Site.QueryInterface priid, ppvObj
End Sub

Private Sub IObjectWithSite_SetSite(ByVal pSite As IObjectWithSiteTLB.IUnknownVB)
    Set m_Site = pSite
    Set m_ie = pSite
End Sub

Private Sub m_ie_DocumentComplete(ByVal pDisp As Object, URL As Variant)
    On Error Resume Next
   
    'Dim HTMLDoc As MSHTML.HTMLDocument
    If m_ie.LocationURL = URL Then
       
        m_ie.document.links(0).innerHTML = "这里是要替换的内容"
       
       
        MsgBox "替换完成" & URL
   
    End If
   
End Sub

 

这样一个BHO就做了,编译成DLL,然后注册,把注册后的CLSD编号插入到前面说的IE启动时BHO的子项中.新开一个新的窗口,当页面加载完之后这个程序就会替换页面中的指定内容了.

 

      原理弄清楚就很容易了,除了拦截页面的加载事件外还有很多事件可以拦截,从而进行控制,最重要的就是HTMLDocument对象,对整个页面的元素都可以进行读写操作.(比如插入一段小广告什么的,:))

发表评论