|
Gegenseitige Bekanntschaften sind ja ganz nett. Doch Visual Basic lässt solche nicht zu - zumindest nicht zwischen zwei ActiveX-Komponenten. Es ist nämlich unmöglich, in beide einen Verweis auf die jeweils andere aufzunehmen - die Komponenten können sich nicht gegenseitig referenzieren. Dabei ist die Notwendigkeit einer solchen gegenseitigen Referenzierung gar nicht so abwegig.
Denken Sie nur einmal an eine ActiveX-EXE, die die Dienste einer ActiveX-DLL nutzen soll und daher üblicherweise und sinnvollerweise einen Verweis auf diese ActiveX-DLL enthält. Doch wenn bei Aufrufen der Methoden der ActiveX-DLL Objekte aus der ActiveX-EXE an die ActiveX-DLL übergeben werden sollen, endet die Freundschaft - nach VB-Regeln. Da Sie ja umgekehrt in die ActiveX-DLL keinen Verweis auf die ActiveX-EXE aufnehmen können, lassen sich auch keine Methoden-Parameter als Objekt-Datentypen der ActiveX-EXE deklarieren.
Ein denkbarer und nahe liegender Ausweg wäre, diese Parameter einfach als "As Object" zu deklarieren. Das funktioniert auch ohne Probleme. So lange es nur um die bloße Übergabe geht, ist das auch nicht allzu tragisch, auch wenn bereits an dieser Stelle der Vorteil der frühen Bindung verloren geht. Der Verlust der frühen Bindung kommt jedoch bei der Verwendung der übergebenen Objekte innerhalb der ActiveX-DLL zum Tragen. Es ist ja nicht nur so, dass Sie auf die Bequemlichkeit der IntelliSense-Unterstützung verzichten müssen. Sondern vor allem die Performance-Einbußen und der Verlust der durch frühe Bindung gewährleisteten Typsicherheit können sich spürbar auswirken.
Einen viel eleganteren Ausweg bietet die Definition einer Schnittstelle in einer dritten Komponente als Typbibliothek (bzw. in einer "echten" Typbibliothek). Unsere beiden Komponenten können problemlos einen Verweis auf diese Typbibliothek aufnehmen, ohne sich ins Gehege zu kommen. In beiden Komponenten implementieren diejenigen Objekte, die auf beiden Seiten bekannt sein sollen, Schnittstellen der Typbibliothek. Die Deklarationen von Methoden-Parametern und Datentypen von Eigenschaften als auch von Objekt-Variablen innerhalb der Komponenten können auf den Schnittstellen-Typen beruhen.
Da kaum alle Methoden und Eigenschaften der betreffenden Objekte auf beiden Seiten bekannt zu sein brauchen und verwendet werden, genügt es, die Schnittstellen nur mit den tatsächlich notwendigen Elementen auszustatten. Angenommen, das Objekt "ObjA" der ActiveX-EXE soll an die ActiveX-DLL übergeben werden, und dort soll die Methode "TuWas" dieses Objekts aufgerufen werden können.
Die Schnittstellen-Klasse (bzw. Schnittstelle in einer Typbibliothek) könnte nun so definiert werden:
' Klasse IObjA.cls in Schnittstellen-Komponente bzw. Typbibliothek
Public Sub TuWas()
'
End Sub
Neben der eigentlichen Methode "TuWas" enthält die Klasse ObjA in der ActiveX-EXE nun auch die Schnittstellen-Methode gleichen Namens:
' Klasse ObjA.cls in der ActiveX-EXE
Implements IObjA
Private Sub IObjA_TuWas()
Me.TuWas
End Sub
Public Sub TuWas()
MsgBox "Ich mach' ja schon...!"
End Sub
Auf der Seite der ActiveX-DLL könnte nun in einer Klasse (beispielsweise Diener.cls) einer Methode ein Objekt ObjA in der "Verkleidung" als IObjA übergeben und dort verwendet werden:
' Klasse Diener.cls in der ActiveX-DLL
Public Sub MachWasDamit(ObjA As IObjA)
ObjA.TuWas
End Sub
Und nun noch an beliebiger Stelle der Aufruf dieser Methode aus der ActiveX-EXE heraus:
Dim MeinDiener As Diener
Diener.MachWasDamit Me
Sie sehen: Mit einem Dritten im Bunde klappt es auch mit dem Nachbarn...
Noch einige weitere in diesem Zusammenhang mit Schnittstellen und Typbibliotheken interessante Hinweise und Tipps finden Sie unter "Typelibs by VB" und unter "Schnittstellen 'chamäleonieren'".
|