共享 CoffeeMonitor

当然,认真的程序员希望确保得到咖啡通知,而不管正在使用什么应用程序。可以为每个希望得到通知的程序创建独立的 CoffeeMonitor 对象,但如果计算机没有那么多串行口,这样做就不行。

一种能使多个客户挂到单个 CoffeeMonitor 对象上的方法是提供一个连接器对象,如以下过程所示。

要创建连接器对象,请按照以下步骤执行:

  1. 切换到包含 Coffee 工程的 Visual Basic 实例,并单击“结束”按钮,返回设计状态。

  2. 在“工程”菜单上,选择“添加模块”,在 Coffee 工程中添加标准模块。(如果有可用的“添加模块”对话框,当对话框出现时双击“模块”图标)。在声明部分中添加如下变量声明:
    Option Explicit
    Public gCoffeeMonitor As CoffeeMonitor
    Public glngUseCount As Long
    

    变量 gCoffeeMonitor 用于保持对单个共享 CoffeeMonitor 的引用。glngUseCount 变量跟踪记录使用 CoffeeMonitor 的 Connector 对象的数目。

  3. 在“工程”菜单上,选择“添加类模块”,在 Coffee 工程中添加类模块。(如果有可用的“添加类模块”对话框,当对话框出现时双击“类模块”图标)。在“属性”窗口中,设置 (Name)Connector

  4. 添加下列代码到 Connector 类的代码窗口:
    Public Property Get CoffeeMonitor() As CoffeeMonitor
    Set CoffeeMonitor = gCoffeeMonitor
    End Property
    

    连接器的只读的 CoffeeMonitor 属性返回对 CoffeeMonitor 的单个全局实例的引用。

  5. 在“对象”下拉菜单中,选择“”打开缺省事件 (Initialize) 的模板。添加下列代码创建 CoffeeMonitor 的全局实例:
    Private Sub Class_Initialize()
    If gCoffeeMonitor Is Nothing Then
    Set gCoffeeMonitor = New CoffeeMonitor
    End If
    glngUseCount = glngUseCount + 1
    End Sub
    

    客户第一次申请连接器对象时,会创建该全局 CoffeeMonitor。每个连接器对象增加 CoffeeMonitor 的使用计数。

    提示 最好在部件创建的第一个对象的 Initialize 事件中初始化部件。这样,将会很少遇到对象创建时的超时问题和死锁,而如果用 Sub Main 来初始化部件就可能会遇到这些问题。

  6. 在“过程”下拉菜单中,选择类的“Terminate”事件。添加如下代码到事件过程模板中:
    Private Sub Class_Terminate()
    glngUseCount = glngUseCount - 1
    If glngUseCount = 0 Then
    Set gCoffeeMonitor = Nothing
    End If
    End Sub
    

    正如对象应该释放掉它创建的所有窗体一样,它们应当释放掉它所使用的所有对象。因为对全局 CoffeeMonitor 的引用是在全局变量中,最后一个连接器对象必须把它释放。

    注意 当所有的客户都释放了对对象的引用时,已编译了的进程外部件才关闭,除非它具有一个加载的窗体。在编译时, TestForm 一直在运行 Coffee 部件,而 CoffeeMonitor 保持着对 TestForm 的引用。因为 CoffeeMonitor 对象利用全局变量而使自身不终止,所以该部件不会关闭。 在“部件设计的一般准则”的“启动和结束部件”中对此予以讨论。

  7. 在“工程资源管理器”窗口,双击激活“CoffeeMonitor”。在“属性”窗口,把类的 Instancing 属性设置成 PublicNotCreatable

    重要 要确保在设置 Instancing 属性之前, CoffeeMonitor 类就是活动的了。如果设置了错类的 Instancing 属性,则将在运行 CoffeeWatch 时出现错误。

    任何客户都可以创建 Connector 类的实例,因为其 Instancing 属性被设置成 MultiUse(缺省值)。客户可以使用 Connector 对象的 CoffeeMonitor 属性来引用单个共享的 CoffeeMonitor 对象。把 CoffeeMonitor 做成 PublicNotCreatable 类,就可以使客户使用共享的全局实例,但是这妨碍了客户创建自己的 CoffeeMonitors。

  8. 按 CTRL+F5 键运行工程。记住,当使用进程外部件时,在能够编辑或运行客户工程之前必须使部件工程处于运行状态。

    当提示保存新文件时,使用下列名字。Visual Basic 提供扩展名。

    文件 文件名 扩展名
    Class module Coffee_Connector .cls
    Module Coffee_Module1 .bas

循序渐进

本主题是逐步创建 ActiveX EXE 示例过程的一部分。

要到 请参阅
下一步 使用共享的 CoffeeMonitor
从头开始 创建 ActiveX EXE 部件