Das LogWeb/Ajax API lässt sich in Visual Basic Anwendungen einfach integrieren.
In beiden Fällen muss LogWeb/Ajax in die Objekte geladen sein, um das API verwenden zu können.
Für den Zugriff auf das API ist die IHTMLWindows2 Schnittstelle erforderlich, die man über HTMLDocument.parentWindow beziehen kann.
Variablen, und Methoden referenzieren Sie wie in der Beschreibung zu LogWeb/Ajax API gezeigt, setzen aber vor die Methode noch den Namen Ihres IHTMLWindows2 Objekts. So lautet der Aufruf zur Abfrage der Zeile, in der sich der Cursor befindet: engine.lwh.current.field.row, wobei engine das IHTMLWindow2 Objekt bezeichnet.
An parameterlose JavaScript Funktionen müssen Sie einen Parameter übergeben, damit die Scripting Engine die Methode ausführt, anstatt deren Namen zurück zu liefern.
Sie können mit der Funktion execScript der IHTMLWindow2 Schnittstelle eigene JavaScript Codefragmente im HTMLDocument ausführen lassen.
In seltenen Fällen ist es notwendig, das API anzupassen, um z. B. Probleme bei der Typumwandlung insbesondere für Rückgabewerte aufzulösen. Das kann notwendig sein, wenn ein Rückgabewert ein Objekt-Typ ist, der in Visual Basic keine Entsprechung hat. Dazu definieren Sie eine JavaScript Funktion, die sie über execScript im HTMLDocument deklarieren. Diese Funktion hat die Aufgabe die original API Methode zu kapseln und die Visual Basic konforme Typumwandlung vorzunehmen. Diese neue Methode können Sie nun wie jede andere LogJava/Ajax API-Funktion verwenden.
Callback-Funktionen können implementiert werden, indem der JavaScript
Funktionsvariablen ein Visual Basic Objekt zugewiesen wird. Die Besonderheit
dabei ist,
dass es sich um eine Instanz einer Visual Basic Klasse handelt und diese Klasse
eine default-Methode besitzen muss. Das liegt daran, dass die Scripting
Engine den Wert einer Variablen ermittelt indem sie - vereinfacht ausgedrückt
- jede Variable als Objekt betrachtet und zur Ermittlung des Wertes
die default Methode dieser Variablen aufruft.
Visual Basic muss dazu aus der Klassendeklaration ein COM-Objekt generieren.
Um die nötigen Properties setzen zu können ist ein Visual Basic Project vom Typ
ActiveX erforderlich. Für eine GUI Applikation müssen Sie in den Project Properties
die Startmethode deklarieren und im Component-Tab die Eigenschaft Start Mode
auf "Standard" setzen.
Die Klasse bekommt das Attribut "Instancing=2 PublicNotCreatable", sodass sie als COM Objekt sichtbar wird, aber doch nicht instanziiert werden kann.
Um die default Procedure ID der Methode zu setzen, öffnen Sie das Code Fenster der Klasse und weisen über Menü->Tools->Procedure Attributes der Methode die default ID zu.
Die Verwendung des LogWeb/Ajax API in Visual Basic .NET Anwendungen unterscheidet sich nur geringfügig von der Verwendung in Visual Basic 6 Anwendungen. Der größte Unterschiede dürfte die Differenzierung zwischen managed und unmanaged Code und die Beachtung des Threadingmodels sein.
Funktionen der LogWeb/Ajax API können problemlos aus der managed code Umgebung aufgerufen werden. Die Common Language Runtime (CLR) führt selbständig data marshaling und unmarshaling durch und erzeugt, falls nötig, on the fly Proxy-COM Objekte.
Callbacks aus dem LogWeb/Ajax API bedürfen besonderer Vorkehrung, da die CLR für die Verarbeitung von Callback-Methoden einen Thread aus seinem Threadpool heranzieht und dieser in der Regel im default, multithreaded apartment (MTA) läuft. IHTMLWindow2 Objekte benötigen, wie auch Windows GUI Objekte, die single threaded-apartment (STA) Umgebung. Ein simples Ändern der Threadproperty "ApartmentState" ist nicht möglich, da sich diese Eigenschaft nachträglich nicht ändern lässt. Daher wird im Beispiel ein dedizierter Workerthread verwendet, an den alle callback Aufrufe delegiert werden, um die Verarbeitung im STA zu gewährleisten.
Im Gegensatz zu VB6 werden für Klassen keine COM-Interfaces erzeugt, da die Instanzen im Regelfall ausschliesslich im managed code Kontext existieren. Für die Callbacks werden jedoch Proxy-COM Objekte für den unmanaged Code Teil benötigt. So muss die COM-Schnittstelle explizit deklariert und im zugehörigen managed code diese Schnittstelle schliesslich implementiert werden. Wie in VB6 auch erhält die default Methode das Attribut <DispID(0)>, damit die Scripting Engine diese auch verwendet.
Zu beachten ist, daß der Schnittstellenname mit '_' beginnen und die zugehörige Klasse wie die Schnittstelle ohne '_' heißen muss.
<InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> Public Interface _CallbackOnInput <DispId(0)> Sub onKeyInput(ByVal aChar As String) End Interface
<ClassInterface(ClassInterfaceType.None)> Public Class CallbackOnInput Implements _CallbackOnInput Public Sub onKeyInput(ByVal aChar As String) Implements _CallbackOnInput.onKeyInput ... End Sub End Class
Aus Sicherheitsgründen wird der callback von LogWeb/Ajax unterbunden und die CLR wirft eine SecurityException. Um dies zu vermeiden müssen die System.Security.Permissions geändert bzw. die Anwendung signiert werden.