VB创建COM加载项.docx
《VB创建COM加载项.docx》由会员分享,可在线阅读,更多相关《VB创建COM加载项.docx(21页珍藏版)》请在冰豆网上搜索。
![VB创建COM加载项.docx](https://file1.bdocx.com/fileroot1/2023-5/26/9779c490-2046-42db-8f53-09557bbf4a55/9779c490-2046-42db-8f53-09557bbf4a551.gif)
VB创建COM加载项
如何用VB创建COM加载项?
通过此演练,可以用VB创建COM加载项。
COM加载项可以在不给用户增加复杂性的情况下扩展应用程序的功能。
究其实质,COM加载项是一个动态链接库(DLL),需要进行注册才能供Microsoft®OfficeXP应用程序加载和使用。
虽然可以将加载项编写成可执行文件(.exe),但DLL通常会比.exe文件提供更好的性能。
此演练将使用VB创建并运行一个自定义工具栏COM加载项。
本主题中的任务假定您熟悉Office应用程序、VB工程,以及调试和运行代码。
引言
创建COM加载项时可以使用任何支持COM的语言,如VBA、VisualBasic和MicrosoftVisualC++。
用OfficeDeveloper创建的加载项将自动打包成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.在“外接程序显示名称”文本框中键入名称GreetingToolbar,在“外接程序描述”文本框中键入说明Toolbaradd-inthatlaunchesa
HelloWorldmessageinExcel。
4.从“应用程序”列表中选择MicrosoftExcel。
5.从“应用程序版本”列表中选择MicrosoftExcel10.0。
6.从“初始化加载行为”列表中选择"Startup"。
有关各种不同类型初始加载行为的详细信息,请参阅指定加载行为。
此主题相关图片如下:
7.在“工程”菜单中,选择“引用”,确保让工程引用下列类型库。
(该引用列表是此演练所必需的。
对于您的加载项,要确保选择每个可以使
用加载项的Office应用程序所需的类型库。
)
●VisualBasicforApplications
●OLEAutomation
●MicrosoftAdd-inDesigner
●MicrosoftOffice10.0ObjectLibrary
●MicrosoftExcel10.0ObjectLibrary
9.在“文件”菜单中选择“保存Connect”。
10.在“工程另存为”对话框中,输入名称Greetings.Dsr,选择要将其保存到的文件夹,然后单击“保存”。
在外接程序设计器中编写代码
在创建工程并为外接程序设计器赋值后,可以添加代码将加载项与宿主应用程序连接起来。
此演练将向您展示将加载项与宿主应用程序连接起来所需的典型过程和事件。
IDTExtensibility2接口提供连接这二者所需的COM对象和事件。
然后,加载项可以使用宿主应用程序所展示的对象模型与宿主应用程序接合。
可以在对象浏览器中查看特定应用程序的对象模型。
外接程序设计器中的代码可处理加载项与宿主应用程序的集成。
例如,加载或卸载加载项时运行的代码驻留在“外接程序设计器”的模块中。
如果加载项中包含窗体,则外接程序设计器还可以包含用于显示窗体的代码。
声明变量和设置过程存根
1.在“工程资源管理器”窗口中,选择Connect,然后打开“视图”菜单,单击“代码”。
清除原来有的代码.
2.在“通用声明”部分,引用可扩展性接口。
ImplementsIDTExtensibility2
3.添加用于在加载项和宿主之间提供通讯的模块级变量。
只要加载了COM加载项,赋值为AsExcel.Application的变量就一直存在,因此,所有过程都可以确定加载项当前正在哪个应用程序中运行。
因为WithEvents关键字指派给cbbButton变量,所以菜单项的Click事件过程将在用户单击新菜单项时触发。
'Globalobjectreferences
PublicappHostAppAsExcel.Application
PrivateWithEventscbbButtonAsOffice.CommandBarButton
4.在“代码”窗口中,从“对象”列表中选择IDTExtensibility2,从“事件”列表中选择OnConnection。
这将创建OnConnection事件过程存根。
注意您必须使由IDTExtensibility2界面提供的每个事件中都包括事件过程存根。
如果您删除了任何事件过程,工程就无法编译。
5.为下列每个事件添加事件过程存根:
●OnDisconnection
●OnStartupComplete
●OnBeginShutdown
●OnAddinsUpdate
现在就可以为您的加载项添加功能了。
将命令条控件集成到加载项中
如果您的COM加载项有一个用户界面,就可以添加用于显示命令条的代码,以方便用户运行您的加载项。
此演练将显示如何在宿主应用程序中包含用于创建新命令条控件(工具栏按钮或菜单项)的代码。
加载您的加载项时,会同时加载控件,用户可以通过单击按钮或菜单项打开并使用加载项。
创建命令条控件
1.查找OnConnection事件过程。
在PrivateSub和EndSub行之间,添加代码以创建新的命令条控件并将其指派给支持事件的CommandBarButton对象变量。
整个过程将显示如下:
PrivateSubIDTExtensibility2_OnConnection(ByVal_
ApplicationAsObject,ByValConnectModeAs_
AddInDesignerObjects.ext_ConnectMode,ByValAddInInst_
AsObject,custom()AsVariant)
'存储启动引用
SetappHostApp=Application
'添加命令条
SetcbbButton=CreateBar()
EndSub
如果您熟悉使用VisualBasic创建加载项,就可能注意到,在VBA中创建加载项时,不用设置命令条按钮OnAction属性的值。
这是因为事件自动为您挂起。
2.查找OnDisconnection事件过程。
在PrivateSub和EndSub行之间,添加代码以便在卸载加载项时删除命令条控件。
整个过程将显示如
下:
PrivateSubIDTExtensibility2_OnDisconnection(ByVal_
RemoveModeAsAddInDesignerObjects.ext_DisconnectMode,_
custom()AsVariant)
RemoveToolbar
'移除要关闭的引用
SetappHostApp=Nothing
SetcbbButton=Nothing
EndSub
3.通常,只要在代码中存储函数,就会在OnConnection过程中添加您调用的函数对应的代码。
该函数将创建命令条,设置命令按钮的属性,并提供错误信息的处理。
PublicFunctionCreateBar()AsOffice.CommandBarButton
'指定命令条
DimcbcMyBarAsOffice.CommandBar
DimbtnMyButtonAsOffice.CommandBarButton
OnErrorGoToCreateBar_Err
SetcbcMyBar=appHostApp.CommandBars.Add(Name:
="GreetingBar")
'指定命令条按钮
SetbtnMyButton=cbcMyBar.Controls.Add(Type:
=msoControlButton,_
Parameter:
="Greetings")
WithbtnMyButton
.Style=msoButtonCaption
.BeginGroup=True
.Caption="&Greetings"
.TooltipText="DisplayHelloWorldMessage"
.Width="24"
EndWith
'显示并返回命令条
cbcMyBar.Visible=True
SetCreateBar=btnMyButton
ExitFunction
CreateBar_Err:
MsgBoxErr.Number&vbCrLf&Err.Description
EndFunction
4.在OnDisconnection过程中添加您调用的函数对应的代码。
该函数在加载宏被卸载时会删除命令条。
PrivateFunctionRemoveToolbar()
appHostApp.CommandBars("GreetingBar").Delete
EndFunction
5.为CommandBarButton对象添加一个单击事件过程。
该过程将在单击新的命令条按钮时被调用。
下面的代码将显示一条消息以表明单击事件正在进行:
PrivateSubcbbButton_Click(ByValCtrlAs_
Office.CommandBarButton,CancelDefaultAsBoolean)
MsgBox("HelloWorld!
")
EndSub
6.保存您的工程。
现在,COM加载项完成。
其余的步骤就是调试和测试代码以确保它运行顺利,然后将加载项放入DLL文件中,该文件可以在其他装有OfficeXP的计算机上进行分发和使用。
对加载项进行调试和测试
当您在VB中开发COM加载项时,可以通过将工程置于运行模式而调试加载项。
如果工程处于运行模式,就可以从Office应用程序中加载COM加载项并使用它,通过使用任何VB调试工具而对它进行测试和调试。
使用VB调试和测试COM加载项
1.将任何所需的断点、Stop语句或监视放在代码中。
(可先不做这步)
2.在“工程”菜单上,单击“属性”,在“调试”对话框中,选择“等待要创建的部件”,单击“确定”
2.在“运行”菜单上,单击“全编译执行”。
这将对工程进行编译(当出现任何编译错误时将提出警告),然后将工程置于运行模式。
3.检查“[运行]”是否出现在VB的标题栏中。
注意必须发布加载项,宿主应用程序才能使用它。
4.启动一个新的Excel实例。
因为将加载项的加载行为设为"Startup",所以只要启动应用程序,加载项就会加载,OnConnection事件就会发生,于是出现Greetings按钮。
现在,您可以使用为调试代码而添加的断点和Stop语句了。
如果单击Greetings按钮,则只要在VB中运行工程,HelloWorld消息就会出现在编辑器之前(不在Excel之前)。
在将工程生成为DLL文件后,该消息就会出现在Excel之前。
5.当完成调试和测试后,打开“运行”菜单,单击“终止工程”。
这会清除临时文件和注册表项,并将工程置于正确的状态以生成DLL文件。
为COM加载项生成DLL
编写并调试代码后,可以使您的加载项成为一个DLL以将其部署到其他装有OfficeXP的计算机上。
在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代码。
=====================================
但是在Word中只能在第一个打开的Word中具有功能实现,但同时打开多个Word文件时,在除了第一个打开的Word文件窗口以外的其他窗口中的菜
单可以看到,但菜单所作的功能却无法实现。
有结果了,全部代码如下:
ImplementsIDTExtensibility2
PublicWithEventsappHostAppAsWord.Application
PrivateWithEventscbbButtonAsOffice.CommandBarButton
PrivateSubappHostApp_DocumentOpen(ByValDocAsWord.Document)
SetcbbButton=CreateBar()
EndSub
PrivateSubappHostApp_NewDocument(ByValDocAsWord.Document)
SetcbbButton=CreateBar()
EndSub
PrivateSubappHostApp_Quit()
OnErrorResumeNext
RemoveToolbar
EndSub
PrivateSubappHostApp_WindowActivate(ByValDocAsWord.Document,ByValWnAsWord.Window)
SetcbbButton=CreateBar()
EndSub
PrivateSubcbbButton_Click(ByValCtrlAsOffice.CommandBarButton,CancelDefaultAsBoolean)
MsgBox("HelloWorld!
")
EndSub
PrivateSubIDTExtensibility2_OnAddInsUpdate(custom()AsVariant)
'p
EndSub
PrivateSubIDTExtensibility2_OnBeginShutdown(custom()AsVariant)
'p
EndSub
PrivateSubIDTExtensibility2_OnConnection(ByValApplicationAsObject,ByValConnectModeAs
AddInDesignerObjects.ext_ConnectMode,ByValAddInInstAsObject,custom()AsVariant)
'存储启动引用
SetappHostApp=Application
'添加命令条
SetcbbButton=CreateBar()
EndSub
PrivateSubIDTExtensibility2_OnDisconnection(ByValRemoveModeAsAddInDesignerObjects.ext_DisconnectMode,custom()As
Variant)
RemoveToolbar
'移除要关闭的引用
SetappHostApp=Nothing
SetcbbButton=Nothing
EndSub
PrivateSubIDTExtensibility2_OnStartupComplete(custom()AsVariant)
'p
EndSub
PublicFunctionCreateBar()AsOffice.CommandBarButton
'指定命令条
DimcbcMyBarAsOffice.CommandBar
DimbtnMyButtonAsOffice.CommandBarButton
OnErrorGoToCreateBar_Err
'--------------------
ForEachbrInappHostApp.CommandBars
Ifbr.Name="GreetingBar"Then
br.Visible=True
SetCreateBar=br.Controls
(1)
ExitFunction
EndIf
Next
'---------------------
SetcbcMyBar=appHostApp.CommandBars.Add(Name:
="GreetingBar")
'指定命令条按钮
SetbtnMyButton=cbcMyBar.Controls.Add(Type:
=msoControlButton,_
Parameter:
="Greetings")
WithbtnMyButton
.Style=msoButtonCaption
.BeginGroup=True
.Caption="&Greetings"
.ToolTipText="DisplayHelloWorldMessage"
.Width="24"
EndWith
'显示并返回命令条
cbcMyBar.Visible=True
SetCreateBar=btnMyButton
ExitFunction
CreateBar_Err:
MsgBoxErr.Number&vbCrLf&Err.Description
EndFunction
PrivateFunctionRemoveToolbar()
OnErrorResumeNext
appHostApp.CommandBars("GreetingBar").Delete
EndFunction
==========================
如果一个工具条中有多个按钮又该如何编写代码
PrivateWithEventscbbButton1AsOffice.CommandBarButton
PrivateWithEventscbbButton2AsOffice.CommandBarButton
。
。
。
。
事个过程也要
PublicFunctionCreateBar()AsOffice.CommandBarButton
改成
subCreateBar()好了
SetcbbButton=CreateBar()
改成
callCreateBar
SetCreateBar=br.Controls
(1)
改成
SetcbbButton1=br.Controls
(1)
SetcbbButton2=br.Controls
(2)
。
。
。
如果很多,要用类模块了
======================
调试DLL是比较麻烦的事
对于复杂的工程
建议先用VB做成EXE方式,调试完了再改成DLL
IDTExtensibility2_OnConnection对应Form_load事件
IDTExtensibility2_OnDisconnection对应form_queryunload事件
【宏通Excel_VBA Com加载宏制作通用模板】、Dll制作
一、创建工程:
打开VB6.0,新建一个外接程序
二、VB中添加引用:
在“工程”菜单中点击“引用”,然后选上“MicrosoftExcel9.0ObjectLibray”这个选项,因为我用的是Excel2000版,其它版本的版本号就不是9.0,选择对应的即可。
引用后,在代码编写过程中,就可以自动完成对象的属性、方法了。
三、设置设计器属性:
工程名称:
VBA_COM
四、编写代码:
1、设计器代码:
OptionExplicit
'加载时事件
PrivateSubAddinInstance_OnC