通過此演練,可以用 VB 創(chuàng)建 COM 加載項(xiàng)。COM 加載項(xiàng)可以在不給用戶增加復(fù)雜性的情況下擴(kuò)展應(yīng)用程序的功能。究其實(shí)質(zhì),COM 加載項(xiàng)是一個(gè)動(dòng)態(tài)鏈接庫 (DLL),需要進(jìn)行注冊才能供 Microsoft? Office XP 應(yīng)用程序加載和使用。
創(chuàng)建的 DLL 可包含多個(gè)加載項(xiàng),它們使用相同的窗體、模塊和類模塊,但面向的卻是不同的應(yīng)用程序。此演練使用 Excel 作為宿主 Office 應(yīng)用程序。
如果希望加載項(xiàng)可供多個(gè)應(yīng)用程序使用,就必須為每個(gè)宿主應(yīng)用程序各自添加一個(gè)外接程序設(shè)計(jì)器??梢酝ㄟ^模塊共享代碼;但在每個(gè)工程中,必須引用每個(gè)宿主應(yīng)用程序所特定的對(duì)象模型。
配置外接程序設(shè)計(jì)器
1.打開 VB
2.在“文件”菜單中,選擇“新建工程”,然后選擇“外接程序”。
3.把窗體移除,雙擊設(shè)計(jì)器中的Connect。
3.在“外接程序顯示名稱”文本框中鍵入名稱 Greeting Toolbar,在“外接程序描述”文本框中鍵入說明 Toolbar add-in that launches a Hello World message in Excel。
然后,加載項(xiàng)可以使用宿主應(yīng)用程序所展示的對(duì)象模型與宿主應(yīng)用程序接合。可以在對(duì)象瀏覽器中查看特定應(yīng)用程序的對(duì)象模型。
外接程序設(shè)計(jì)器中的代碼可處理加載項(xiàng)與宿主應(yīng)用程序的集成。例如,加載或卸載加載項(xiàng)時(shí)運(yùn)行的代碼駐留在“外接程序設(shè)計(jì)器”的模塊中。如果加載項(xiàng)中包含窗體,則外接程序設(shè)計(jì)器還可以包含用于顯示窗體的代碼。
聲明變量和設(shè)置過程存根
1.在“工程資源管理器”窗口中,選擇 Connect,然后打開“視圖”菜單,單擊“代碼”。清除原來有的代碼。
2.在“通用聲明”部分,引用可擴(kuò)展性接口。
Implements IDTExtensibility2
3.添加用于在加載項(xiàng)和宿主之間提供通訊的模塊級(jí)變量。只要加載了 COM 加載項(xiàng),賦值為 As Excel.Application 的變量就一直存在,因此,所有過程都可以確定加載項(xiàng)當(dāng)前正在哪個(gè)應(yīng)用程序中運(yùn)行。因?yàn)?WithEvents 關(guān)鍵字指派給 cbbButton 變量,所以菜單項(xiàng)的 Click 事件過程將在用戶單擊新菜單項(xiàng)時(shí)觸發(fā)。
'Global object references
Public appHostApp As Excel.Application
Private WithEvents cbbButton As Office.CommandBarButton
4.在“代碼”窗口中,從“對(duì)象”列表中選擇 IDTExtensibility2,從“事件”列表中選擇 OnConnection。這將創(chuàng)建 OnConnection 事件過程存根。
注意 您必須使由 IDTExtensibility2 界面提供的每個(gè)事件中都包括事件過程存根。如果您刪除了任何事件過程,工程就無法編譯。
5.為下列每個(gè)事件添加事件過程存根:
●OnDisconnection
●OnStartupComplete
●OnBeginShutdown
●OnAddinsUpdate
現(xiàn)在就可以為您的加載項(xiàng)添加功能了。
將命令條控件集成到加載項(xiàng)中 如果您的 COM 加載項(xiàng)有一個(gè)用戶界面,就可以添加用于顯示命令條的代碼,以方便用戶運(yùn)行您的加載項(xiàng)。此演練將顯示如何在宿主應(yīng)用程序中包含用于創(chuàng)建新命令條控件(工具欄按鈕或菜單項(xiàng))的代碼。加載您的加載項(xiàng)時(shí),會(huì)同時(shí)加載控件,用戶可以通過單擊按鈕或菜單項(xiàng)打開并使用加載項(xiàng)。
創(chuàng)建命令條控件
1.查找 OnConnection 事件過程。在 Private Sub 和 End Sub 行之間,添加代碼以創(chuàng)建新的命令條控件并將其指派給支持事件的 CommandBarButton 對(duì)象變量。整個(gè)過程將顯示如下:
Private Sub IDTExtensibility2_OnConnection(ByVal _
Application As Object, ByVal ConnectMode As _
AddInDesigNerobjects.ext_ConnectMode, ByVal AddInInst _
As Object, custom() As Variant)
' 存儲(chǔ)啟動(dòng)引用
Set appHostApp = Application
' 添加命令條
Set cbbButton = CreateBar()
End Sub
如果您熟悉使用 Visual Basic 創(chuàng)建加載項(xiàng),就可能注意到,在 VBA 中創(chuàng)建加載項(xiàng)時(shí),不用設(shè)置命令條按鈕 OnAction 屬性的值。這是因?yàn)槭录詣?dòng)為您掛起。
2.查找 OnDisconnection 事件過程。在 Private Sub 和 End Sub 行之間,添加代碼以便在卸載加載項(xiàng)時(shí)刪除命令條控件。整個(gè)過程將顯示如下:
Private Sub IDTExtensibility2_OnDisconnection(ByVal _
RemoveMode As AddInDesignerObjects.ext_DisconnectMode, _
custom() As Variant)
RemoveToolbar
' 移除要關(guān)閉的引用
Set appHostApp = Nothing
Set cbbButton = Nothing
End Sub
3.通常,只要在代碼中存儲(chǔ)函數(shù),就會(huì)在 OnConnection 過程中添加您調(diào)用的函數(shù)對(duì)應(yīng)的代碼。該函數(shù)將創(chuàng)建命令條,設(shè)置命令按鈕的屬性,并提供錯(cuò)誤信息的處理。
Public Function CreateBar() As Office.CommandBarButton
' 指定命令條
Dim cbcMyBar As Office.CommandBar
Dim BTnMyButton As Office.CommandBarButton
On Error GoTo CreateBar_Err
Set cbcMyBar = appHostApp.CommandBars.Add(Name:="GreetingBar")
' 指定命令條按鈕
Set btnMyButton = cbcMyBar.Controls.Add(Type:=msoControlButton, _
Parameter:="Greetings")
With btnMyButton
.Style = msoButtonCaption
.BeginGroup = True
.Caption = "&Greetings"
.TooltipText = "Display Hello World Message"
.Width = "24"
End With
' 顯示并返回命令條
cbcMyBar.Visible = True
Set CreateBar = btnMyButton
Exit Function
CreateBar_Err:
MsgBox Err.Number & vbCrLf & Err.Description
End Function
4.在 OnDisconnection 過程中添加您調(diào)用的函數(shù)對(duì)應(yīng)的代碼。該函數(shù)在加載宏被卸載時(shí)會(huì)刪除命令條。
Private Function RemoveToolbar()
appHostApp.CommandBars("GreetingBar").Delete
End Function
5.為 CommandBarButton 對(duì)象添加一個(gè)單擊事件過程。該過程將在單擊新的命令條按鈕時(shí)被調(diào)用。下面的代碼將顯示一條消息以表明單擊事件正在進(jìn)行:
Private Sub cbbButton_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
MsgBox ("Hello World!")
End Sub
6.保存您的工程。
現(xiàn)在,COM 加載項(xiàng)完成。其余的步驟就是調(diào)試和測試代碼以確保它運(yùn)行順利,然后將加載項(xiàng)放入 DLL 文件中,該文件可以在其他裝有 Office XP 的計(jì)算機(jī)上進(jìn)行分發(fā)和使用。
對(duì)加載項(xiàng)進(jìn)行調(diào)試和測試 當(dāng)您在 VB 中開發(fā) COM 加載項(xiàng)時(shí),可以通過將工程置于運(yùn)行模式而調(diào)試加載項(xiàng)。如果工程處于運(yùn)行模式,就可以從 Office 應(yīng)用程序中加載 COM 加載項(xiàng)并使用它,通過使用任何 VB 調(diào)試工具而對(duì)它進(jìn)行測試和調(diào)試。
使用 VB 調(diào)試和測試 COM 加載項(xiàng)
1.將任何所需的斷點(diǎn)、Stop 語句或監(jiān)視放在代碼中。(可先不做這步)
2.在“工程”菜單上,單擊“屬性”,在“調(diào)試”對(duì)話框中,選擇“等待要?jiǎng)?chuàng)建的部件”,單擊“確定”
3.在“運(yùn)行”菜單上,單擊“全編譯執(zhí)行”。這將對(duì)工程進(jìn)行編譯(當(dāng)出現(xiàn)任何編譯錯(cuò)誤時(shí)將提出警告),然后將工程置于運(yùn)行模式。
4.檢查“[運(yùn)行]”是否出現(xiàn)在VB的標(biāo)題欄中。
注意 必須發(fā)布加載項(xiàng),宿主應(yīng)用程序才能使用它。
4.啟動(dòng)一個(gè)新的 Excel 實(shí)例。因?yàn)閷⒓虞d項(xiàng)的加載行為設(shè)為 "Startup",所以只要啟動(dòng)應(yīng)用程序,加載項(xiàng)就會(huì)加載,OnConnection 事件就會(huì)發(fā)生,于是出現(xiàn) Greetings 按鈕?,F(xiàn)在,您可以使用為調(diào)試代碼而添加的斷點(diǎn)和 Stop 語句了。
如果單擊 Greetings 按鈕,則只要在 VB 中運(yùn)行工程,Hello World 消息就會(huì)出現(xiàn)在編輯器之前(不在 Excel 之前)。在將工程生成為 DLL 文件后,該消息就會(huì)出現(xiàn)在 Excel 之前。
5.當(dāng)完成調(diào)試和測試后,打開“運(yùn)行”菜單,單擊“終止工程”。這會(huì)清除臨時(shí)文件和注冊表項(xiàng),并將工程置于正確的狀態(tài)以生成 DLL 文件。
為 COM 加載項(xiàng)生成 DLL 編寫并調(diào)試代碼后,可以使您的加載項(xiàng)成為一個(gè) DLL 以將其部署到其他裝有 Office XP 的計(jì)算機(jī)上。
在 VB 中將 COM 加載項(xiàng)打包為 DLL
1.從“文件”菜單上,選擇“生成 myAddin.DLL”。
2.在“生成工程”對(duì)話框中保存文件名 Greetings,并選擇要用于保存工程的位置。
3.單擊“確定”。 (此時(shí),加載項(xiàng)可在本機(jī)正式使用)
這一步驟將創(chuàng)建 COM 加載項(xiàng),添加適當(dāng)?shù)淖员眄?xiàng),并使COM 加載項(xiàng)可用于 Office 宿主中。創(chuàng)建加載項(xiàng) DLL 時(shí),VB 使用給外接程序設(shè)計(jì)器提供的信息,將 DLL 注冊為 COM 加載項(xiàng)。VB 向注冊表中寫入加載項(xiàng)的名稱、說明和初始加載行為設(shè)置。加載項(xiàng)的宿主應(yīng)用程序讀取這些注冊表項(xiàng)并加載相應(yīng)的加載項(xiàng)。
常見加載項(xiàng)開發(fā)問題疑難解答
當(dāng)在開發(fā)環(huán)境中工作并在應(yīng)用程序之間進(jìn)行切換時(shí),可能會(huì)遇到某些錯(cuò)誤信息或意外行為。下面是一些常見問題及其解決方案。
出現(xiàn)編譯錯(cuò)誤或語句結(jié)束在編輯器中無效
要確保為工程引用了適當(dāng)?shù)膶?duì)象庫。
運(yùn)行工程并打開新的宿主應(yīng)用程序?qū)嵗龝r(shí)沒有任何反應(yīng)
●要確保字“已發(fā)布的”出現(xiàn)在所運(yùn)行的加載項(xiàng)的標(biāo)題欄中。如果不如此,就必須運(yùn)行工程。
●單擊每個(gè)打開的應(yīng)用程序窗口。您的對(duì)象可能正在運(yùn)行,但只有在您單擊所打開的應(yīng)用程序的第一個(gè)實(shí)例時(shí),它才是可見的。
●要確保正確地指定并設(shè)置模塊級(jí)變量。
●在宿主應(yīng)用程序中,要確保在“COM 加載項(xiàng)”對(duì)話框中選中了您的加載項(xiàng)??梢酝ㄟ^向工具欄中添加 COM 加載項(xiàng)命令而對(duì)宿主應(yīng)用程序進(jìn)行自定義。此命令將打開“COM 加載項(xiàng)”對(duì)話框。
將 COM 加載項(xiàng)對(duì)話框添加到工具欄中 1.打開EXCEL“工具”菜單,單擊“自定義”,選擇“命令”選項(xiàng)卡。在“類別”下,選擇“工具”。沿“命令”列表向下滾動(dòng),以查找“COM 加載項(xiàng)”。將“COM 加載項(xiàng)”拖動(dòng)到工具欄中,以創(chuàng)建新的按鈕,然后關(guān)閉“自定義”對(duì)話框。
2.在該工具欄上,單擊剛添加的“COM 加載項(xiàng)”按鈕。
3.在“COM 加載項(xiàng)”對(duì)話框中,確認(rèn)選中您的加載項(xiàng)旁邊的復(fù)選框。若要卸載加載項(xiàng),請清除該復(fù)選框。
對(duì)象出現(xiàn)在宿主應(yīng)用程序中但沒有響應(yīng)
可能是有多個(gè)對(duì)象實(shí)例在運(yùn)行。用于檢測和移除已有的具有該名稱的代碼可能沒在運(yùn)行。檢查并調(diào)試您的 OnDisconnection 代碼。