通過開發(fā)VB插件來擴(kuò)展VB應(yīng)用

字號:

一、插件介紹
    從結(jié)構(gòu)上來看,一個(gè)VB插件實(shí)際上是一個(gè)COM組件,原則上組件可以使用支持COM的開發(fā)工具,例如Delphi、VC來編寫。組件通過實(shí)現(xiàn)COM中的IDTExtensibility對象來建立與VB的連接。組件注冊以后,當(dāng)VB運(yùn)行中在Add-In菜單中裝載組件后,VB就會調(diào)用組件中IDTExtensibility對象中的相應(yīng)方法(如在裝載組件后會調(diào)用OnConnection方法)。這時(shí)整個(gè)插件就成為VB的一部分從而可以訪問VB開發(fā)環(huán)境中的各種對象和資源了。
    利用VB本身來編寫插件是一個(gè)很好的辦法,首先通過VB可以快速建立一個(gè)IDTExtensibility對象框架(當(dāng)然在VB中不叫這個(gè)名稱);其次VB對于整個(gè)開發(fā)環(huán)境都提供了相應(yīng)的對象供插件訪問和控制,而使用插件的主要目的就是通過插件來控制宿主程序;最后是調(diào)試十分的方便,可以直接運(yùn)行看結(jié)果,不需要編譯注冊。
    二、建立程序框架
    首先我們來建立程序框架,以下的代碼和說明都是使用Win2K+VB6中文企業(yè)版完成的,在VB英文版以及Win9X下運(yùn)行通過只是程序中對于界面的說明根據(jù)不同的VB會有不同。
    打開VB,點(diǎn)擊菜單中的 文件 | 新建 項(xiàng),在 新建工程 窗口中選擇“外接程序” 項(xiàng)(在英文版中是Addin),然后點(diǎn)擊確定按鈕建立插件工程。
    建立完畢后在工程列表窗口中可以看到新工程的名稱為MyAddIn。其中包含兩個(gè)對象,在窗體類中包含frmAddIn窗體,在設(shè)計(jì)器類中包含Connect設(shè)計(jì)器對象。VB已經(jīng)為插件設(shè)立了一個(gè)基本框架,下面按F5運(yùn)行插件并將VB主窗口最小化。然后再打開一個(gè)VB程序,在其中建立一個(gè)標(biāo)準(zhǔn) Exe工程。點(diǎn)擊菜單的 外接程序 | 外接程序管理器 項(xiàng)。在打開的外接程序管理器窗口的列表中可以看到其中有一個(gè)My Add-In 項(xiàng),點(diǎn)擊該項(xiàng),然后將下面 加載行為(英文版中是Load Behavior) 區(qū)域中的三個(gè)復(fù)選框都選中后點(diǎn)擊確定按鈕裝載插件。然后再點(diǎn)擊“外接程序” 菜單,再點(diǎn)擊其中新添加的 My AddIn 項(xiàng)??梢钥吹讲寮棾鲆粋€(gè)窗體,點(diǎn)擊“確定”按鈕可以獲得VB運(yùn)行的目錄,點(diǎn)擊“取消”按鈕關(guān)閉窗體。
    接下來再次打開外接程序管理器窗口。選中 My Add-In項(xiàng),將 加載行為 區(qū)域中的三個(gè)復(fù)選框中的對勾去掉。然后回到運(yùn)行插件的VB程序,點(diǎn)擊停止按鈕停止插件的執(zhí)行。
    回到插件工程中,我們主要來看Connect對象,打開Connect對象的代碼窗口??梢钥吹狡渲邪瑑蓚€(gè)對象:AddinInstance和MenuHandler。其中AddInstance是工程中實(shí)現(xiàn)同VB接口的對象。在程序中對應(yīng)AddInstance包含兩個(gè)方法:OnConnection和OnDisconnection。在這里我們稱它們?yōu)榉椒ǘ皇鞘录?,是因?yàn)樗鼈兪怯蒝B調(diào)用而不是由某個(gè)消息引發(fā)而由系統(tǒng)調(diào)用的。
    OnConnection方法在插件裝載使被調(diào)用,其中的參數(shù)Application是調(diào)用插件的VB實(shí)例對象。這個(gè)對象是一個(gè)VBE類對象。由VB傳遞給插件插件就可以通過Application對象訪問和控制調(diào)用自己的VB實(shí)例。其中比較重要的是這一段:
     If ConnectMode = ext_cm_External Then
     Me.Show
     Else
     Set mcbMenuCommandBar = AddToAddInCommandBar("AddInSample")
     Set Me.MenuHandler = VBInstance. Events. CommandBarEvents (mcbMenuCommandBar)
     End If
    在上面的程序段中,首先通過ConnectMode來判斷插件被裝載的方式,如果是不是通過外部程序啟動的話,首先調(diào)用AddToAddInCommandBar方法添加一個(gè)菜單項(xiàng)到 外接程序 菜單欄。
    添加了菜單項(xiàng)后,插件程序還必須能夠響應(yīng)對菜單的點(diǎn)擊做響應(yīng),VB支持插件對自身的很多事件監(jiān)控,包括點(diǎn)擊菜單、工具欄按鈕、打開工程、添加/刪除工程中的文件等等。對應(yīng)每一種事件,VB實(shí)例都包含有一個(gè)相應(yīng)的事件對象。對象可以通過VB實(shí)例對象的Events屬性獲得或者設(shè)置。在插件程序中可以事先定義一個(gè)事件對象并編寫好對象的事件響應(yīng)代碼,然后將該對象賦予VB實(shí)例對象中的相應(yīng)事件對象。在上面的程序中,需要插件監(jiān)控對添加的菜單項(xiàng)的點(diǎn)擊事件,那么首先在程序中首先定義了一個(gè)With Events的對象MenuHandler。并在程序中編寫對象的Click事件代碼,然后在OnConnection方法中用Set Me.MenuHandler = VBInstance.Events.CommandBarEvents(mcbMenuCommandBar)將MenuHandler設(shè)定為建立的菜單對象的事件對象,那么當(dāng)在VB中點(diǎn)擊 My Add-In項(xiàng)后,VB就會調(diào)用MenuHandle的Click事件代碼。