连接或断开外接程序

在将外接程序注册到系统注册表中,并且在 Vbaddin.ini 文件中引用它之后,便可以将其连接到 IDE。该连接使外接程序能够对事件作出响应并执行某些操作。连接、断开外接程序可以通过手工方式或程序方式实现。

处理 OnConnection 和 OnDisconnection 事件

无论是以手工方式还是程序方式连接外接程序,都将调用外接程序的 IDTExtensibility_OnConnection 事件过程。在断开外接程序的时候,调用 IDTExtensibility_OnDisconnection 事件。

Private Sub IDTExtensibility_OnConnection(ByVal _ 
VBInst As Object, ByVal ConnectMode As _ 
VBIDE.vbext_ConnectMode, ByVal AddInInst As _ 
VBIDE.AddIn, custom() As Variant)
   MsgBox "Add-in is now connected"
End Sub

Private Sub IDTExtensibility_OnDisconnection(ByVal _ 
RemoveMode As VBIDE.vbext_RemoveMode, _ 
Custom () as Variant)
   MsgBox "Add-in is now disconnected"
End Sub

Private Sub IDTExtensibility_OnStartupComplete _ 
(custom() As Variant)
   '注释,防止编译时过程被删除。
End Sub

Private Sub IDTExtensibility_OnAddInsUpdate _ 
(custom() As Variant)
   '注释,防止编译时过程被删除。
End Sub

在这个例子中,程序所做的唯一的事情是显示一个消息框,显示外接程序何时被连接或断开。后面的两个事件过程在这个例子中没有用到,但是,为了使外接程序正常工作,必须加上它们。

各参数的意义

OnConnection 事件过程中的 VBInst 参数是 Visual Basic 当前实例的对象引用。正是通过该对象才能够访问 Visual Basic 可扩展性对象模型。

LoadMode 参数通知 Visual Basic 如何激活外接程序。它有三种可能的设置。

Vbext_cm_AfterStartup 在开发环境启动之后连接外接程序。
Vbext_cm_Startup 在开发环境标准启动时连接外接程序。
Vbext_cm_ExternalStartup 外接程序与 Visual Basic 开发环境之外的程序相连。

OnDisconnection 事件过程的 RemoveMode 参数通知 Visual Basic 外接程序如何被断开。

用手工方式连接和断开外接程序

连接外接程序到 Visual Basic 的主要的(也是最简单的)方法是:在“外接程序管理器”中手工选择它的复选框,“外接程序管理器”可以通过 Visual Basic 的“外接程序”菜单获得。断开外接程序的主要方法是清除该复选框。

注意,在单击“外接程序管理器”的“确定”按钮之前,外接程序并没有真正地被连接或断开。选定外接程序并单击“确定”之后,Visual Basic 立即试图创建该外接程序的一个实例。如果创建成功,该外接程序就成为活动的。如果由于某种原因 Visual Basic 创建失败,则它将发出错误信息。(请参阅本章的“外接程序疑难解答”,寻找可能的原因及其解决办法。)在断开外接程序之后,它所占的内存将被释放。

请记住下面的重要事实。如果仅仅关闭外接程序 的可见部分,例如 双击系统菜单或单击关闭按钮,那么窗体将从屏幕上消失,但该外接程序仍然保留在内存中。尽管可以在窗体的 Unload 事件中书写代码来释放某些句柄和指针,以释放一些内存,但是在通过“外接程序管理器”对话框断开外接程序之前,外接程序对象本身将一直驻留在内存中。

以程序方式连接和断开外接程序

连接已断开的外接程序的另一种方法是用幕后程序实现的,这需要将 AddIns 集合的 Connect 属性设置为 True,然后在 OnAddInsUpdate 事件过程中对 Addins 集合使用 Update 方法。

将 AddIns 集合的 Connect 属性修改为 True,即可使外接程序的连接标志从 0 变为 1(意味着在启动 IDE 时进行连接)。这种修改会触发 OnAddInsUpdate 事件,对“外接程序管理器”中列出的任何外接程序的连接标志(或者是 Vbaddin.ini 中的文件项)所作的任何改动都将触发该事件。对 AddIns 集合使用 Update 方法将强制“外接程序管理器”重新读入 Vbaddin.ini 文件或外接程序设计器中的外接程序登录项目列表。此后,由于标志已经设置为 True,该外接程序也将被连接。

在下述例子中,Visual Basic 循环搜索 Addins 集合,检查给出的外接程序程序 ID 是否与可用外接程序列表中的程序 ID 相匹配。这样做的目的仅仅是为了确认即将用于设置 Connect 属性的外接程序索引号确实是存在的。不能直接将外接程序的程序 ID 作为参数输入,使之成为 AddIns 集合的 Connect 属性。在程序 ID 被确认为合法之后,外接程序的 Connect 属性将被设为 1(已连接的)。

另外一种方法是,加入外接程序的号码,但是建议不要这样做,因为如果外接程序被中止后又重新启动,它的号码可能会发生改变。

注意   这个例子假设预先已经为基本外接程序定义了所需的变量,例如用于 Visual Basic 实例(这里称为 "vbi")的变量。这些必须做的事情将在本章的后面谈到。另外还必须把“proj.class”替换为想要激活的程序 ID。

Sub ConnectAddIn()
   For Each x In vbi.AddIns 
   '遍历集合中的每一个外接程序。
      If x.ProgId = "proj.class" Then x.Connect = True
      '如果有的外接程序的 progIDs 与所给的外接程序一致,
      '设其 Connect 标志为 TrueNext x
   '继续遍历该集合。
End Sub

如果对 AddIns 集合执行 Update 方法,集合将被更新。然后,Visual Basic 将注意到该外接程序已被标记为需要连接,并连接它。为了执行更新操作,需要在类模块的 OnAddInsUpdate 事件过程中添加以下代码行。

vbi.AddIns.Update
' AddIns 集合执行 Update

这种方法强制 Visual Basic 重新读入 Vbaddin.ini 文件或外接程序设计器列表中。因为需要启动的外接程序的标志已经设为 1 或连接,该外接程序将被连接。

以程序方式断开外接程序可以按照同样的步骤,只需把 AddIns 集合的 Connect 属性设为 False 即可。