Depending on its function, your COM component might or might not have any user interface. If
it does require user interface, that interface will have to be based on one or more forms included
in the server component project. You must be aware of the way each form affects the lifetime of the
server component application. When the server component is an in-process server component, you
must also be aware of the effect your form has on the client application.
It is important to keep in mind that the forms and other elements of the user interface, such
as message boxes, belong to your COM component, and not to the client application. Although this
is an obvious fact, its consequences might not be so obvious. When an out-of-process server component
displays its interface, for example, that interface might not be on top of other windows that the
client is displaying.
a name="managing-forms-in-an-out-of-process-server-component">Managing Forms in an Out-Of-Process Server Component
In an out-of-process server component, a form may be the startup form for the server component
application's project. You must unload this form and any other forms before the server component
can be unloaded.
Because of this, you shouldn't use formname.Hide in your out-of-process server component's
code when it is completely done with a form. Instead, the out-of-process server component application
should load the form when it needs it, and unload it whenever it does not need to be visible. If
you have copies of the form in memory, an out-of-process server component will continue to run even after
it is not needed.
Managing Forms in an In-Process Server Component
A form is never the entry point into an in-process server component, because the server component
runs in the same process space as the client, and the client itself initiates and terminates
the server component.
Although you can generally display modal forms as needed in an inprocess server component, modeless
forms present more problems. The only client applications that will support modeless forms in an in-process
server component as of this writing are as follows:
-
Clients that are written in VB5 or VB6.
-
Clients that use Visual Basic for Applications 5.0 or later. This includes the Microsoft
Office 97 suite and later versions, as well as any third-party applications that carry
the Visual Basic Technology logo.
Internet Explorer 4.0 and above.
When you program a server component, you can't foresee which clients will attempt to use it,
so you can't tell whether your server component's client supports modeless server component forms.
If you want to be very cautious, you can just avoid ever displaying a modeless form in an in-process
server component.
For more flexibility, however, you can verify the App object's NonModalAllowed property
in the server component's code. If the property is True, the current client supports modeless
forms in the server component. You might write code similar to Listing 12.26 so that your server
component could display a form either modelessly or modally, depending on what the client allows.
LISTING 12.26
DETERMINING WHETHER YOUR IN-PROCESS SERVER COMPONENT CAN SAFELY DISPLAY A MODELESS FORM
If App.NonModalAllowed Then
frmMsg.Show vbModeLess
Else
frmMsg.Show vbModal
End If
Even if an in-process server component still has forms loaded, it may be able to unload anyway,
providing all forms are invisible and certain
other conditions are fulfilled.
Note that an out-of-process server component can't terminate with any forms loaded, even
though they are invisible.
NOTE - App.NonModalAllowed Gives Incorrect Results in
the VB Debugging Environment : Typically, you can test your component
against another application by running your app from the VB environment and specifying
the test client from the Debug dialog box. The VB environment will always return
App.NonModalAllowed as True, however, regardless of whether the external application
really does support nonmodal forms in a component. The only way to really find
out whether a potential client supports nonmodal forms is to compile your application
and test the client against the compiled version—or against a small compiled
test application that checks the value of App.NonModalAllowed.