通过开发VB插件来扩展VB应用

通过开发VB插件来扩展VB应用,第1张

一、插件介绍

从结构上来看,一个VB插件实际上是一个COM组件,原则上组件可以使用支持COM的开发工具,例如Delphi、VC来编写。组件通过实帆亩现COM中的IDTExtensibility对象来建立与VB的连接。组件注册以后,当VB运行中在Add-In菜单中装载组件后,VB就会调用组件中IDTExtensibility对象中的相应方法(如在装载组件后会调用OnConnection方法)。这时整个插件就成为VB的一部分从而可以访问VB开发环境中的各种对象和资源了。

利用VB本身来编写插件是一个很好的办法,首先通过VB可以快速建立一个IDTExtensibility对象框架(当然在VB中不叫这个名称);其次VB对于整个开发环境都提供了相应的对象供插件访问和控制,而使用插件的主要目的就是通过插件来控制宿主程序;最后是调试十分的方便,可以直接运行看结果,不需要编译注册。

二、建立程序框架

首先我们来建立程序框架,以下的代码和说明都是使用Win2K+VB6中文企业版完成的,在VB英文版以及Win9X下运行通过只是程序中对于界面的说明根据不同的VB会有不同。

打开VB,点击菜单中的 文件 | 新建 项,在 新建工程 窗口中选择“外接程序” 项(在英文版中是Addin),然后点击确定按钮建立插件工程。

建立完毕后在工程列表窗口中可以看到新工程的名称为MyAddIn。其中包含两个对象,在窗体类中包含frmAddIn窗体,在设计器类中包含Connect设计器对象。VB已经为插件设立了一个基本框架,下面按F5运行插件并将VB主此兆窗口最小化。然后再打开一个VB程序,在其中建立一个标准 Exe工程。点击菜单的 外接程序 | 外接程序管理器 项。在打开的外接程序管理器窗口的列表中可以看到其中有一个My Add-In 项,点击该项,然后将下面 加载行为(英文版中是Load Behavior) 区域中的三个复选框都选中后点击确定按钮装载插件。然后再点击“外接程序” 菜单,再点击其中新添加的 My AddIn 项。可以看到插件d出一个窗体,点击“确定”按钮可以获得VB运行的目录,点击“取消”按钮关闭窗体。

接下来再次打开外接程序管理器窗口。选中 My Add-In项,将 加载行为 区域中的三个复选框中的对勾去掉。然后回到运行插件的VB程序,态扒森点击停止按钮停止插件的执行。

回到插件工程中,我们主要来看Connect对象,打开Connect对象的代码窗口。可以看到其中包含两个对象:AddinInstance和MenuHandler。其中AddInstance是工程中实现同VB接口的对象。在程序中对应AddInstance包含两个方法:OnConnection和OnDisconnection。在这里我们称它们为方法而不是事件,是因为它们是由VB调用而不是由某个消息引发而由系统调用的。

OnConnection方法在插件装载使被调用,其中的参数Application是调用插件的VB实例对象。这个对象是一个VBE类对象。由VB传递给插件插件就可以通过Application对象访问和控制调用自己的VB实例。其中比较重要的是这一段:

If ConnectMode = ext_cm_External Then

Me.Show

Else

Set mcbMenuCommandBar = AddToAddInCommandBar("AddInSample")

Set Me.MenuHandler = VBInstance. Events. CommandBarEvents (mcbMenuCommandBar)

End If

在上面的程序段中,首先通过ConnectMode来判断插件被装载的方式,如果是不是通过外部程序启动的话,首先调用AddToAddInCommandBar方法添加一个菜单项到 外接程序 菜单栏。

添加了菜单项后,插件程序还必须能够响应对菜单的点击做响应,VB支持插件对自身的很多事件监控,包括点击菜单、工具栏按钮、打开工程、添加/删除工程中的文件等等。对应每一种事件,VB实例都包含有一个相应的事件对象。对象可以通过VB实例对象的Events属性获得或者设置。在插件程序中可以事先定义一个事件对象并编写好对象的事件响应代码,然后将该对象赋予VB实例对象中的相应事件对象。在上面的程序中,需要插件监控对添加的菜单项的点击事件,那么首先在程序中首先定义了一个With Events的对象MenuHandler。并在程序中编写对象的Click事件代码,然后在OnConnection方法中用Set Me.MenuHandler = VBInstance.Events.CommandBarEvents(mcbMenuCommandBar)将MenuHandler设定为建立的菜单对象的事件对象,那么当在VB中点击 My Add-In项后,VB就会调用MenuHandle的Click事件代码。

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

首先需要获得IObjectWithSite接知乱口的定义,你下载个tl_ole.zip,包含了接口定义,下载下来以后,把它应用

然后创建一个ActiveX DLL工程,名称为MyBho 在工程中引用这个tlb文件,

并且引用Microsoft HTML Object Library(MSHTML.DLL)和mcrosoft Internet Controls(Shdocvw.dll)。

Implements IObjectWithSiteTLB.IObjectWithSite

Dim WithEvents m_ie As InternetExplorer '浏览器对象

Attribute m_ie.VB_VarHelpID = -1

Dim m_Site As IUnknownVB 'COM 接口

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

将这个工程编译为:MyBho.dll。

编译物局工程罩猛让后,可以通过调用regsvr32 MyBho.dll注册这个组件,这个地方如果这个组件在系统目录下的话就不用带路径,否则的话要带路径,如e:\\MyBho.dll

组件注册了以后,就会在注册表HKEY_CLASSES_ROOT\CLSID中注册组件的GUID。

在注册表中用prjBHO.dll做关键字就可以查找到MyBho.dll注册的GUID,然后将这个GUID拷贝下来,然后在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects下创建一个新项,项的名称就是这个GUID

Private Sub m_ie_DocumentComplete(ByVal pDisp As Object, URL As Variant)

On Error Resume Next

MsgBox CSTR(URL)

End Sub

你在袜态“工程”“引用”里的环境设置应该搭前不完整,还有你的程序里有错误,应改为Private Function SwAddin_DisconnectFromSW() As Boolean

swApp.removemenu swDocPART, "螺纹联结标准件库", ""

Set swApp = Nothing '释放变量知好清

SwAddin_DisconnectFromSW = True '设置去除连接标

End Function


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12406326.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存