Visual Basic Concepts
Sharing the CoffeeMonitor
Of course, a thorough programmer would want to be sure of getting coffee notifications regardless of which application she was using. You could create separate CoffeeMonitor objects for each program in which you wanted to be notified, but that could cause problems if your computer doesn’t have multiple serial ports.
One way to allow multiple clients to hook up to a single CoffeeMonitor object is to provide a connector object, as shown in the following procedure.
To create the Connector object
Switch to the instance of Visual Basic containing the Coffee project, and click the End button to return to design mode.
On the Project menu, select Add Module to add a standard module to the Coffee project. (If you have the Add Module dialog box enabled, double-click the Module icon when the dialog box appears.) Add the following variable declarations to the Declarations section:
Option Explicit Public gCoffeeMonitor As CoffeeMonitor Public glngUseCount As Long
The variable
gCoffeeMonitor
is used to keep a reference to the single shared CoffeeMonitor. TheglngUseCount
variable keeps track of the number of Connector objects using the CoffeeMonitor.On the Project menu, select Add Class Module to add a class module to the Coffee project. (If you have the Add Class Module dialog box enabled, double-click the Class Module icon when the dialog box appears.) In the Properties window, set (Name) to Connector.
Add the following code to the Connector class’s code window:
Public Property Get CoffeeMonitor() As CoffeeMonitor Set CoffeeMonitor = gCoffeeMonitor End Property
The Connector’s read-only CoffeeMonitor property returns a reference to the single global instance of CoffeeMonitor.
In the Object drop down, select Class to open the template for the default event (Initialize). Add the following code to create the global instance of CoffeeMonitor:
Private Sub Class_Initialize() If gCoffeeMonitor Is Nothing Then Set gCoffeeMonitor = New CoffeeMonitor End If glngUseCount = glngUseCount + 1 End Sub
The first time a client requests a Connector object, it will create the global CoffeeMonitor. Each Connector object increases the use count of the CoffeeMonitor.
Tip The Initialize event of the first object a component creates is a good place to initialize the component. You’ll be much less likely to encounter object creation time-out problems and deadlocks that may occur if Sub Main is used to initialize the component.
In the Procedure drop down, select the Terminate event for the class. Add the following code to the event procedure template:
Private Sub Class_Terminate() glngUseCount = glngUseCount - 1 If glngUseCount = 0 Then Set gCoffeeMonitor = Nothing End If End Sub
Just as objects should dispose of any forms they create, so they should release any objects they use. Because the reference to the global CoffeeMonitor is in a global variable, the last Connector object must release it.
Note A compiled out-of-process component shuts down when all clients release their references to its objects, unless it has a loaded form. When compiled, the Coffee component would be kept running by the TestForm that CoffeeMonitor keeps a reference to. Since the CoffeeMonitor object is kept from terminating by the global variable, the component would never shut down. This is discussed in "Starting and Ending a Component," in "General Principles of Component Design."
In the Project Explorer window, double-click CoffeeMonitor to activate it. In the Properties window, set the Instancing property of the class to PublicNotCreatable.
Important Make sure you have the CoffeeMonitor class active before you set the Instancing property. If you set the Instancing property of the wrong class, you’ll get an error later when you run CoffeeWatch.
Any client can create an instance of the Connector class, because its Instancing property is set to MultiUse (the default). Clients can use a Connector object’s CoffeeMonitor property to get a reference to the single shared CoffeeMonitor object. By making CoffeeMonitor a PublicNotCreatable class, you allow clients to use the shared global instance — while preventing them from creating their own CoffeeMonitors.
Press CTRL+F5 to run the project. Remember, when working with out-of-process components, the component project must be in run mode before you can edit or run the client project.
When prompted to save the new files, use the following names. Visual Basic supplies the extensions.
File | File name | Extension |
Class module | Coffee_Connector | .cls |
Module | Coffee_Module1 | .bas |
Step by Step
This topic is part of a series that walks you through creating a sample ActiveX EXE.
To | See |
Go to the next step | Using the Shared CoffeeMonitor |
Start from the beginning | Creating an ActiveX EXE Component |