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

字號(hào):

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