|
Den Fall, dass sich eine von einer Anwendung benötigte ActiveX-DLL oder -EXE nicht auf einem System befinden oder nicht ordnungsgemäß registriert sein sollte, können Sie mit einer einfachen Fehlerprüfung in den Griff bekommen:
Dim nMyClass As MyClass
On Error Resume Next
Set nMyClass = New MyClass
If Err.Number = 429 Then
' Objekt nicht gefunden
End If
On Error GoTo 0
Doch statt sich darauf zu verlassen, dass Sie schon irgendwo im Code Ihrer Anwendung eine solche Prüfung vornehmen werden, können Sie bereits beim Programmstart eine solche Prüfung für alle Fälle vornehmen.
Ebenso sollten Sie externe Steuerelemente auf ihre tatsächliche Existenz und Verfügbarkeit hin prüfen. Diese Prüfung ist etwas komplizierter. Denn beim Laden eines Forms, wenn Visual Basic ein Steuerelement zu laden versucht, wird keinerlei Code ausgeführt, in den Sie eine eigene Fehlerprüfung einbauen könnten. Sie müssen daher den Ladevorgang gezielt per Code provozieren, um eine gegebenenfalls abfangbare Reaktion zu erhalten.
In Visual Basic 5 können Sie dazu vor dem Laden und Anzeigen eines Forms in einer selbstdefinierten Methode dieses Forms versuchen, auf eine Eigenschaft oder auf eine Methode eines auf dem Form platzierten Steuerelements zuzugreifen. Den hierbei ausgelösten Fehler (339), falls das Steuerelement nicht verfügbar sein sollte, können Sie abfangen und auswerten. Visual Basic lädt zwar dazu das Form, aber da Sie eine Fehlerbehandlung eingeschaltet haben, bleibt das unter Ihrer Kontrolle. Um ein Form so testen zu können, kann es nicht das Hauptform sein, das beim Anwendungsstart automatisch geladen wird. Sie sollten das Form aus einer Sub Main-Prozedur heraus starten, nachdem Sie den Test durchgeführt haben.
Public Function TestControl() As Boolean
Dim nTest As String
On Error Resume Next
nTest = MyControl.Tag
If Err.Number = 339 Then
' Steuerelement nicht verfügbar
' ggfs. Unload Me
Else
TestControl = True
End If
End Sub
Unter Visual Basic 6 bietet sich eine allgemeinere Lösung an. Während Sie Objekte aus ActiveX-DLLs oder -EXEs schon immer dynamisch per CreateObject und Angabe der ProgId laden und instanzieren konnten, geht das ähnlich erst ab Visual Basic 6 auch bei Steuerelementen. So können Sie ein eigenständiges Test-Form anlegen und über Methoden dieses Forms die notwendigen Tests durchführen. Dieses Form braucht ansonsten keine weitere Funktion in der Anwendung zu haben - es ist klein und unscheinbar genug.
Der Methode TestForCtl übergeben Sie die ProgId des zu testenden externen Steuerelements (die Verfügbarkeit in VB eingebauter Steuerelemente brauchen Sie ja nie zu prüfen). Konnte das Steuerelement erfolgreich geladen werden, gibt die Methode True zurück. Wenn Sie mehrere Steuerelemente hintereinander testen möchten, können Sie das sofortige Entladen des Forms unterdrücken, indem Sie im optionalen Parameter UnloadNow False übergeben (Voreinstellung ist True). Allerdings sollten Sie diesen Test nicht mit Steuerelementen veranstalten, die wider jede Vernunft gleich beim ersten Initialisieren umfangreichere Operationen durchführen - etwa eine Datenbank laden, oder gar eine Verbindung zum Internet herstellen (mit so etwas sollte ein Steuerelement erst nach ausdrücklichem Aufruf einer Methode loslegen).
Public Function TestForCtl(ProgId As String, _
Optional ByVal UnloadNow As Boolean = True) As Boolean
Dim nCtl As Control
On Error Resume Next
Set nCtl = Controls.Add(ProgId, "test")
TestForCtl = CBool(Err.Number = 0)
If UnloadNow Then
Unload Me
End If
End Function
Die zweite Methode des Testforms, TestForDLL, arbeitet ähnlich. Sie übergeben ihr ebenfalls die ProgId der Komponente und erhalten True zurück, wenn die Komponente erfolgreich geladen werden konnte. Die Kontrolle des Entladens des Forms entfällt hier, da das Form bei diesem Aufruf gar nicht erst geladen wird, sondern sich einfach wie eine simple Klasse verhält. Auch für Komponenten gilt, dass sie sich bei der Initialisierung zahm und unauffällig verhalten sollten (Bei Komponenten, die dem zuwider handeln, sollten Sie generell deren Einsatz überdenken - womöglich bergen sie noch mehr solche undurchdachten Schwachpunkte. Sollten Sie jedoch selbst der Autor einer solchen Komponente sein - nun, was soll ich Ihnen noch erzählen...?).
Public Function TestForDLL(ProgId As String) As Boolean
Dim nObj As Object
On Error Resume Next
Set nObj = CreateObject(ProgId)
TestForDLL = CBool(Err.Number <> 429)
End Function
Hier noch ein Beispiel für einen Start-Test, den Sie mit dem herunterladbaren Beispiel-Projekt ausprobieren können. Starten Sie einfach avbComponentTest.exe im Test-Verzeichnis und sie werden entsprechende Fehlermeldungen erhalten, da die beiden benötigten Komponenten zunächst noch nicht registriert sind. Registrieren Sie erst eine und dann die andere der beiden Komponenten und starten Sie die Test-EXE einmal zwischendurch. Erst wenn beide Komponenten registriert sind, wird das Hauptform der Test-Anwendung tatsächlich geöffnet, anderenfalls wird die Anwendung beendet.
Public Sub Main()
Dim nTestAll As Boolean
Dim nTest As Boolean
With frmTestComponents
nTest = .TestForDLL("avbComponentTestDLL.Class1")
If Not nTest Then
MsgBox "avbComponentTestDLL.Class1 nicht gefunden"
End If
nTestAll = nTest
nTest = .TestForCtl("avbComponentTestOCX.UserControl1")
If Not nTest Then
MsgBox "avbComponentTestOCX.UserControl1 nicht gefunden"
End If
nTestAll = nTestAll And nTest
End With
If nTestAll Then
frmTest.Show
Else
MsgBox "Anwendung wird nicht gestartet"
End If
End Sub
|