通過此演練,可以用 VB 創(chuàng)建 COM 加載項(xiàng)。COM 加載項(xiàng)可以在不給用戶增加復(fù)雜性的情況下擴(kuò)展應(yīng)用程序的功能。究其實(shí)質(zhì),COM 加載項(xiàng)是一個(gè)動(dòng)態(tài)鏈接庫(kù) (DLL),需要進(jìn)行注冊(cè)才能供 Microsoft? Office XP 應(yīng)用程序加載和使用。
此演練將使用 VB 創(chuàng)建并運(yùn)行一個(gè)自定義工具欄 COM 加載項(xiàng)。本主題中的任務(wù)假定您熟悉 Office 應(yīng)用程序、VB 工程,以及調(diào)試和運(yùn)行代碼。 引言 創(chuàng)建 COM 加載項(xiàng)時(shí)可以使用任何支持 COM 的語(yǔ)言,如 VBA、Visual Basic 和 Microsoft Visual C++。用 Office Developer 創(chuàng)建的加載項(xiàng)將自動(dòng)打包成 DLL,并由宿主應(yīng)用程序注冊(cè)后進(jìn)行加載??梢詣?chuàng)建一個(gè)加載項(xiàng)但能用于多個(gè)應(yīng)用程序中。有關(guān)詳細(xì)信息。請(qǐng)參閱為多個(gè)應(yīng)用程序創(chuàng)建 COM 加載項(xiàng)。 此演練將完成一系列步驟,從而用 VB 創(chuàng)建一個(gè) COM 加載項(xiàng)。創(chuàng)建 COM 加載項(xiàng)的基本步驟包括: 1.配置外接程序設(shè)計(jì)器。 2.在外接程序設(shè)計(jì)器中編寫代碼。 3.將命令條控件集成到加載項(xiàng)中。 4.對(duì) COM 加載項(xiàng)進(jìn)行調(diào)試和測(cè)試。 5.為 COM 加載項(xiàng)生成 DLL。 6.解決 COM 加載項(xiàng)的開發(fā)問題。 配置外接程序設(shè)計(jì)器 用外接程序設(shè)計(jì)器創(chuàng)建的工程為開發(fā)加載項(xiàng)提供工作區(qū)域。使用外接程序設(shè)計(jì)器可以創(chuàng)建用于 VBA 或任何 Office 應(yīng)用程序的 COM 加載項(xiàng)。工程中的每個(gè)外接程序設(shè)計(jì)器都表示一個(gè)單獨(dú)的、只能在一種 Office 應(yīng)用程序中運(yùn)行的加載項(xià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。 4.從“應(yīng)用程序”列表中選擇 Microsoft Excel。
5.從“應(yīng)用程序版本”列表中選擇 Microsoft Excel 10.0。 6.從“初始化加載行為”列表中選擇 "Startup"。有關(guān)各種不同類型初始加載行為的詳細(xì)信息,請(qǐng)參閱指定加載行為。 此主題相關(guān)圖片如下: ![]() 7.在“工程”菜單中,選擇“引用”,確保讓工程引用下列類型庫(kù)。(該引用列表是此演練所必需的。對(duì)于您的加載項(xiàng),要確保選擇每個(gè)可以使用加載項(xiàng)的 Office 應(yīng)用程序所需的類型庫(kù)。) ●Visual Basic for Applications ●OLE Automation ●Microsoft Add-in Designer ●Microsoft Office 10.0 Object Library ●Microsoft Excel 10.0 Object Library 8.在“文件”菜單中選擇“保存 Connect”。 9.在“工程另存為”對(duì)話框中,輸入名稱 Greetings.Dsr,選擇要將其保存到的文件夾,然后單擊“保存”。 在外接程序設(shè)計(jì)器中編寫代碼 在創(chuàng)建工程并為外接程序設(shè)計(jì)器賦值后,可以添加代碼將加載項(xiàng)與宿主應(yīng)用程序連接起來。此演練將向您展示將加載項(xiàng)與宿主應(yīng)用程序連接起來所需的典型過程和事件。IDTExtensibility2 接口提供連接這二者所需的 COM 對(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è)事件中都包括事件過程存根。如果您刪除了任何事件過程,工程就無(wú)法編譯。 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)試和測(cè)試代碼以確保它運(yùn)行順利,然后將加載項(xiàng)放入 DLL 文件中,該文件可以在其他裝有 Office XP 的計(jì)算機(jī)上進(jìn)行分發(fā)和使用。 對(duì)加載項(xiàng)進(jìn)行調(diào)試和測(cè)試 當(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)行測(cè)試和調(diào)試。 1.將任何所需的斷點(diǎn)、Stop 語(yǔ)句或監(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 語(yǔ)句了。 如果單擊 Greetings 按鈕,則只要在 VB 中運(yùn)行工程,Hello World 消息就會(huì)出現(xiàn)在編輯器之前(不在 Excel 之前)。在將工程生成為 DLL 文件后,該消息就會(huì)出現(xiàn)在 Excel 之前。 5.當(dāng)完成調(diào)試和測(cè)試后,打開“運(yùn)行”菜單,單擊“終止工程”。這會(huì)清除臨時(shí)文件和注冊(cè)表項(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ù)淖?cè)表項(xiàng),并使COM 加載項(xiàng)可用于 Office 宿主中。創(chuàng)建加載項(xiàng) DLL 時(shí),VB 使用給外接程序設(shè)計(jì)器提供的信息,將 DLL 注冊(cè)為 COM 加載項(xiàng)。VB 向注冊(cè)表中寫入加載項(xiàng)的名稱、說明和初始加載行為設(shè)置。加載項(xiàng)的宿主應(yīng)用程序讀取這些注冊(cè)表項(xiàng)并加載相應(yīng)的加載項(xiàng)。 常見加載項(xiàng)開發(fā)問題疑難解答 當(dāng)在開發(fā)環(huán)境中工作并在應(yīng)用程序之間進(jìn)行切換時(shí),可能會(huì)遇到某些錯(cuò)誤信息或意外行為。下面是一些常見問題及其解決方案。 出現(xiàn)編譯錯(cuò)誤或語(yǔ)句結(jié)束在編輯器中無(wú)效 要確保為工程引用了適當(dāng)?shù)膶?duì)象庫(kù)。 運(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),請(qǐng)清除該復(fù)選框。 對(duì)象出現(xiàn)在宿主應(yīng)用程序中但沒有響應(yīng) 可能是有多個(gè)對(duì)象實(shí)例在運(yùn)行。用于檢測(cè)和移除已有的具有該名稱的代碼可能沒在運(yùn)行。檢查并調(diào)試您的 OnDisconnection 代碼。
|
|