通过此演练,可以用 VB 创建 COM 加载项。COM 加载项可以在不给用户增加复杂性的情况下扩展应用程序的功能。究其实质,COM 加载项是一个动态链接库 (DLL),需要进行注册才能供 Microsoft® Office XP 应用程序加载和使用。虽然可以将加载项编写成可执行文件 (.exe),但 DLL 通常会比 .exe 文件提供更好的性能。
此演练将使用 VB 创建并运行一个自定义工具栏 COM 加载项。本主题中的任务假定您熟悉 Office 应用程序、VB 工程,以及调试和运行代码。
引言
创建 COM 加载项时可以使用任何支持 COM 的语言,如 VBA、Visual Basic 和 Microsoft® Visual C++®。用 Office Developer 创建的加载项将自动打包成 DLL,并由宿主应用程序注册后进行加载。可以创建一个加载项但能用于多个应用程序中。有关详细信息。请参阅为多个应用程序创建 COM 加载项。
此演练将完成一系列步骤,从而用 VB 创建一个 COM 加载项。创建 COM 加载项的基本步骤包括:
1.配置外接程序设计器。
2.在外接程序设计器中编写代码。
3.将命令条控件集成到加载项中。
4.对 COM 加载项进行调试和测试。
5.为 COM 加载项生成 DLL。
6.解决 COM 加载项的开发问题。
配置外接程序设计器
用外接程序设计器创建的工程为开发加载项提供工作区域。使用外接程序设计器可以创建用于 VBA 或任何 Office 应用程序的 COM 加载项。工程中的每个外接程序设计器都表示一个单独的、只能在一种 Office 应用程序中运行的加载项。创建的 DLL 可包含多个加载项,它们使用相同的窗体、模块和类模块,但面向的却是不同的应用程序。此演练使用 Excel 作为宿主 Office 应用程序。
如果希望加载项可供多个应用程序使用,就必须为每个宿主应用程序各自添加一个外接程序设计器。可以通过模块共享代码;但在每个工程中,必须引用每个宿主应用程序所特定的对象模型。
配置外接程序设计器
1.打开 VB
2.在“文件”菜单中,选择“新建工程”,然后选择“外接程序”。
3.把窗体移除,双击设计器中的Connect.
3.在“外接程序显示名称”文本框中键入名称 Greeting Toolbar,在“外接程序描述”文本框中键入说明 Toolbar add-in that launches a Hello World message in Excel。
4.从“应用程序”列表中选择 Microsoft Excel。
5.从“应用程序版本”列表中选择 Microsoft Excel 10.0。
6.从“初始化加载行为”列表中选择 "Startup"。有关各种不同类型初始加载行为的详细信息,请参阅指定加载行为。
此主题相关图片如下:screen.width-333)this.width=screen.width-333" border=0
7.在“工程”菜单中,选择“引用”,确保让工程引用下列类型库。(该引用列表是此演练所必需的。对于您的加载项,要确保选择每个可以使用加载项的 Office 应用程序所需的类型库。)
●Visual Basic for Applications
●OLE Automation
●Microsoft Add-in Designer
●Microsoft Office 10.0 Object Library
●Microsoft Excel 10.0 Object Library
9.在“文件”菜单中选择“保存 Connect”。
10.在“工程另存为”对话框中,输入名称 Greetings.Dsr,选择要将其保存到的文件夹,然后单击“保存”。
在外接程序设计器中编写代码
在创建工程并为外接程序设计器赋值后,可以添加代码将加载项与宿主应用程序连接起来。此演练将向您展示将加载项与宿主应用程序连接起来所需的典型过程和事件。IDTExtensibility2 接口提供连接这二者所需的 COM 对象和事件。然后,加载项可以使用宿主应用程序所展示的对象模型与宿主应用程序接合。可以在对象浏览器中查看特定应用程序的对象模型。
外接程序设计器中的代码可处理加载项与宿主应用程序的集成。例如,加载或卸载加载项时运行的代码驻留在“外接程序设计器”的模块中。如果加载项中包含窗体,则外接程序设计器还可以包含用于显示窗体的代码。
声明变量和设置过程存根
1.在“工程资源管理器”窗口中,选择 Connect,然后打开“视图”菜单,单击“代码”。清除原来有的代码.
2.在“通用声明”部分,引用可扩展性接口。
Implements IDTExtensibility2
3.添加用于在加载项和宿主之间提供通讯的模块级变量。只要加载了 COM 加载项,赋值为 As Excel.Application 的变量就一直存在,因此,所有过程都可以确定加载项当前正在哪个应用程序中运行。因为 WithEvents 关键字指派给 cbbButton 变量,所以菜单项的 Click 事件过程将在用户单击新菜单项时触发。
'Global object references
Public appHostApp As Excel.Application
Private WithEvents cbbButton As Office.CommandBarButton
4.在“代码”窗口中,从“对象”列表中选择 IDTExtensibility2,从“事件”列表中选择 OnConnection。这将创建 OnConnection 事件过程存根。
注意 您必须使由 IDTExtensibility2 界面提供的每个事件中都包括事件过程存根。如果您删除了任何事件过程,工程就无法编译。
5.为下列每个事件添加事件过程存根:
●OnDisconnection
●OnStartupComplete
●OnBeginShutdown
●OnAddinsUpdate
现在就可以为您的加载项添加功能了。
将命令条控件集成到加载项中
如果您的 COM 加载项有一个用户界面,就可以添加用于显示命令条的代码,以方便用户运行您的加载项。此演练将显示如何在宿主应用程序中包含用于创建新命令条控件(工具栏按钮或菜单项)的代码。加载您的加载项时,会同时加载控件,用户可以通过单击按钮或菜单项打开并使用加载项。
创建命令条控件
1.查找 OnConnection 事件过程。在 Private Sub 和 End Sub 行之间,添加代码以创建新的命令条控件并将其指派给支持事件的 CommandBarButton 对象变量。整个过程将显示如下:
Private Sub IDTExtensibility2_OnConnection(ByVal _
Application As Object, ByVal ConnectMode As _
AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst _
As Object, custom() As Variant)
' 存储启动引用
Set appHostApp = Application
' 添加命令条
Set cbbButton = CreateBar()
End Sub
如果您熟悉使用 Visual Basic 创建加载项,就可能注意到,在 VBA 中创建加载项时,不用设置命令条按钮 OnAction 属性的值。这是因为事件自动为您挂起。
2.查找 OnDisconnection 事件过程。在 Private Sub 和 End Sub 行之间,添加代码以便在卸载加载项时删除命令条控件。整个过程将显示如下:
Private Sub IDTExtensibility2_OnDisconnection(ByVal _
RemoveMode As AddInDesignerObjects.ext_DisconnectMode, _
custom() As Variant)
RemoveToolbar
' 移除要关闭的引用
Set appHostApp = Nothing
Set cbbButton = Nothing
End Sub
3.通常,只要在代码中存储函数,就会在 OnConnection 过程中添加您调用的函数对应的代码。该函数将创建命令条,设置命令按钮的属性,并提供错误信息的处理。
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 过程中添加您调用的函数对应的代码。该函数在加载宏被卸载时会删除命令条。
Private Function RemoveToolbar()
appHostApp.CommandBars("GreetingBar").Delete
End Function
5.为 CommandBarButton 对象添加一个单击事件过程。该过程将在单击新的命令条按钮时被调用。下面的代码将显示一条消息以表明单击事件正在进行:
Private Sub cbbButton_Click(ByVal Ctrl As _
Office.CommandBarButton, CancelDefault As Boolean)
MsgBox ("Hello World!")
End Sub
6.保存您的工程。
现在,COM 加载项完成。其余的步骤就是调试和测试代码以确保它运行顺利,然后将加载项放入 DLL 文件中,该文件可以在其他装有 Office XP 的计算机上进行分发和使用。
对加载项进行调试和测试
当您在 VB 中开发 COM 加载项时,可以通过将工程置于运行模式而调试加载项。如果工程处于运行模式,就可以从 Office 应用程序中加载 COM 加载项并使用它,通过使用任何 VB 调试工具而对它进行测试和调试。
使用 VB 调试和测试 COM 加载项
1.将任何所需的断点、Stop 语句或监视放在代码中。(可先不做这步)
2.在“工程”菜单上,单击“属性”,在“调试”对话框中,选择“等待要创建的部件”,单击“确定”
2.在“运行”菜单上,单击“全编译执行”。这将对工程进行编译(当出现任何编译错误时将提出警告),然后将工程置于运行模式。
3.检查“[运行]”是否出现在VB的标题栏中。
注意 必须发布加载项,宿主应用程序才能使用它。
4.启动一个新的 Excel 实例。因为将加载项的加载行为设为 "Startup",所以只要启动应用程序,加载项就会加载,OnConnection 事件就会发生,于是出现 Greetings 按钮。现在,您可以使用为调试代码而添加的断点和 Stop 语句了。
如果单击 Greetings 按钮,则只要在 VB 中运行工程,Hello World 消息就会出现在编辑器之前(不在 Excel 之前)。在将工程生成为 DLL 文件后,该消息就会出现在 Excel 之前。
5.当完成调试和测试后,打开“运行”菜单,单击“终止工程”。这会清除临时文件和注册表项,并将工程置于正确的状态以生成 DLL 文件。
为 COM 加载项生成 DLL
编写并调试代码后,可以使您的加载项成为一个 DLL 以将其部署到其他装有 Office XP 的计算机上。
在 VB 中将 COM 加载项打包为 DLL
1.从“文件”菜单上,选择“生成 myAddin.DLL”。
2.在“生成工程”对话框中保存文件名 Greetings,并选择要用于保存工程的位置。
3.单击“确定”。 (此时,加载项可在本机正式使用)
这一步骤将创建 COM 加载项,添加适当的注册表项,并使COM 加载项可用于 Office 宿主中。创建加载项 DLL 时,VB 使用给外接程序设计器提供的信息,将 DLL 注册为 COM 加载项。VB 向注册表中写入加载项的名称、说明和初始加载行为设置。加载项的宿主应用程序读取这些注册表项并加载相应的加载项。
有关分发部署 COM 加载项的信息,请参阅部署应用程序和部署 COM 加载项。
常见加载项开发问题疑难解答
当在开发环境中工作并在应用程序之间进行切换时,可能会遇到某些错误信息或意外行为。下面是一些常见问题及其解决方案。
出现编译错误或语句结束在编辑器中无效
要确保为工程引用了适当的对象库。
运行工程并打开新的宿主应用程序实例时没有任何反应
●要确保字“已发布的”出现在所运行的加载项的标题栏中。如果不如此,就必须运行工程。
●单击每个打开的应用程序窗口。您的对象可能正在运行,但只有在您单击所打开的应用程序的第一个实例时,它才是可见的。
●要确保正确地指定并设置模块级变量。
●在宿主应用程序中,要确保在“COM 加载项”对话框中选中了您的加载项。可以通过向工具栏中添加 COM 加载项命令而对宿主应用程序进行自定义。此命令将打开“COM 加载项”对话框。
将 COM 加载项对话框添加到工具栏中
1.打开EXCEL“工具”菜单,单击“自定义”,选择“命令”选项卡。在“类别”下,选择“工具”。沿“命令”列表向下滚动,以查找“COM 加载项”。将“COM 加载项”拖动到工具栏中,以创建新的按钮,然后关闭“自定义”对话框。
2.在该工具栏上,单击刚添加的“COM 加载项”按钮。
3.在“COM 加载项”对话框中,确认选中您的加载项旁边的复选框。若要卸载加载项,请清除该复选框。
对象出现在宿主应用程序中但没有响应
可能是有多个对象实例在运行。用于检测和移除已有的具有该名称的代码可能没在运行。检查并调试您的 OnDisconnection 代码。
(联系请到http://office.9zp.com)