| VB 源码 | VC 源码 | ASP源码 | JSP源码 | PHP源码 | CGI源码 | FLASH源码 | 素材模板 | C 源程序 | 站长工具 | 站长教程 |

VB技术

ASP技术
PHP技术
JSP技术
VB技术
.NET技术

本类阅读TOP10

·利用shell编程实现DOS风格的Linux命令行
·新手必学:windows网络编程经典入门
·通过连接实例解读TCP/IP协议
·JAVA生成JPG缩略图
·一组VB实用小程序
·VB解决Unicode文本转换的问题
·用VB制作屏幕保护程序
·Visual Basic开发应用程序答疑
·用VB6实现中英文文本的私钥加密
·用VB学做“黑客”程序

站内搜索

使用插件功能扩展VB

  一、插件介绍

  从结构上来看,一个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 项。可以看到插件弹出一个窗体,点击“确定”按钮可以获得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事件代码。

 三、完善程序

 从上面的分析可以得知,程序框架实现了VB与插件间的接口和插件监控VB事件。接下来要实现插件对VB的控制。

 在VB调用插件对象的OnConnection方法时,会将自身作为一个VBE对象传递给插件供访问及操作。VBE对象是VB实例的根对象,其下包含以下5类基本的对象集合:

  VBProjects集合:通过该集合可以访问VB实例中所包含的工程。

  Windows集合:通过该集合可以访问所有的窗口,包括控件栏、属性栏以及工程中的窗体等。

  CodePanes集合:通过该集合可以访问所有的代码窗口。可以获得代码窗口中的代码以及改变其中的代码。

  CommandBars 集合:通过该集合可以访问VB实例中的所有命令栏,包括支持快速菜单的命令栏。

  Events 集合:通过该集合插件可以访问VB中的所有事件对象。

  下面的程序我们要实现的是:当点击 My-Addin菜单时,在当前工程中添加一个模块并在其中添加一个子程序,并让用户选择在工程中的窗体中选择一个窗体添加一个CommandButton控件,并向窗体的代码窗口写入代码使得点击CommmandButton控件就执行添加的子程序。

  打开工程中的frmAddIn窗体,在其中添加一个CommandButton控件和一个ListBox控件。

  在frmAddIn的Load事件中添加如下代码:

  Dim mCop As Object

  '获得当前启动工程中的所有对象
  For Each mCop In VBInstance.VBProjects.StartProject.VBComponents
    '如果对象是窗体类型就将其添加到ListBox中
    If mCop.Type = vbext_ct_VBForm Then
      List1.AddItem mCop.Name
    End If
  Next

  If List1.ListCount < 1 Then
    MsgBox "工程中没有添加控件的窗体"
    Connect.Hide
  Else
    List1.ListIndex = 0
  End If
  Command1.Caption = "Add Code"

  在Command1的Click事件中添加如下代码:

  Dim xComp As VBComponent
  Dim xModule As VBComponent
  Dim xForm As VBForm
  Dim xControl As VBControl
  Dim xCode As CodeModule

  '获得用户选择的窗体对象
  Set xComp = VBInstance.VBProjects.StartProject.VBComponents(List1.List(List1.ListIndex))
  '获得窗体设计器对象
  Set xForm = xComp.Designer

  '添加一个CommandButton到窗体上
  Set xControl = xForm.VBControls.Add("VB.CommandButton")
  '设定控件的名称
  xControl.Properties("Name") = "cmdButton"
  '添加控件的Click事件代码
  xComp.CodeModule.CreateEventProc "Click", "cmdButton"

  '添加一个新模块到工程中
  Set xModule = VBInstance.VBProjects.StartProject.VBComponents.Add(vbext_ct_StdModule)
  '设定模块名称
  xModule.Properties("Name") = "ModulTemp"
  '获得对象的代码对象
  Set xCode = xModule.CodeModule

  Dim astr As String

  '添加mClick子程序到新模块中
  astr = "Public Sub mClick()" + Chr(13) + Chr(10) + _
      Chr(vbKeyTab) + "MsgBox ""You click a button!""" + Chr(13) + Chr(10) + _
      "End Sub"
  xCode.AddFromString astr

  Dim lCount As Long

  '在cmdButton的Click事件中添加执行mClick子程序
  lCount = xComp.CodeModule.ProcBodyLine("cmdButton_Click", vbext_pk_Proc)
  If lCount <> 0 Then
    xComp.CodeModule.InsertLines lCount + 1, "mClick"
  End If

  运行程序,再次打开另一个VB程序建立一个标准Exe工程。并装载 My AddIn插件,点击菜单的 My AddIn项,然后在弹出窗口中选择工程中的一个窗体,然后点击 Add Code 按钮,可以看到工程中新添加了一个ModuleTemp模块,并且你选择的窗体中添加了一个CommandButton按钮。通过前面的介绍以及上面代码的注释,相信大家对于插件如何通过VBE对象控制VB可能有一个比较基本的了解了。

  上面的程序只是基本的介绍了VB插件的实现。通过完善可以形成一个功能齐全的插件程序,例如你可以将所积累很多年的代码保存到一个文件中,然后通过一个插件让用户可以方便的选择添加他们所需要的部分到自己的程序中。

  作者:陈锐




相关文章
  • 精通PHP的十大要点
  • VB解决Unicode文本转换的问题
  • 一个基于WEB的QQ程序
  • 使用xmlhttp查询域名是否被注的小程序
  • 用VB6实现中英文文本的私钥加密
  • 一组VB实用小程序
  • 用VB编写异步多线程下载程序
  • 屏保程序模板化完整源代码
  • VB中实现窗体自动隐藏
  • 用VB编写网络监控软件
  • VB到底为我们做了什么?
  • 键盘幽灵VB版
  • 用VB编写定时关闭计算机的程序
  • 用MCI命令做一个播放器
  • 使用VB在WIN2000下截获IP数据包
  • VB中字符串中文的问题
  • 用VB制作屏幕保护程序
  • VB枚举主机IP
  • 用VB编写一个弹出菜单类
  • 自己的IE——用VB制作浏览器
  • 相关软件

  • VBScript编辑器源码  
  • 字体观察器FontViewer源码  
  • 自动壁纸更换器源码[第二部分]  
  • 自动壁纸更换器源码[第一部分]  
  • WINDOWS 3.0终端程序的C源码  
  • 一个取得 CPU 信息的程序源码  
  • 广告窗口终结者源码  
  • 下载整个网站程序ssnag与源码  
  • CGI邮件程序源码  
  • ISAPI留言簿源码  



  • 月光软件源码下载编程文档电脑教程网站优化网址导航网络文学游戏天地生活休闲写作范文安妮宝贝站内搜索
    电脑技术编程开发网络专区谈天说地情感世界游戏元素分类游戏热门游戏体育运动手机专区业余爱好影视沙龙
    音乐天地数码广场教育园地科学大观古今纵横谈股论金人文艺术医学保健动漫图酷二手专区地方风情各行各业

    月光软件站·版权所有