Probleme Info Bridge..

Transcription

Probleme Info Bridge..
PG Airweb - Gruppe IE
1/3
Michael Weers, 05.04.2001
1 Technische Probleme mit IBM Bridge2Java
Folgende Probleme wurden bei Experimenten mit B2J gefunden (etwa nach Wichtigkeit
geordnet):
?? Unzureichende Stabilität. Abfragen des DHTML Object Model waren
unterschiedlich stabil in Abhängigkeit von der IE-Versionsnummer. Versionnen
vor dem IE 5.5 waren für uns nicht benutzbar.
Beispiel: Mit dem IE 5.0 konnten alle (HTML-)Elemente der Seite ausgelesen
werden, jedoch führte ein wiederholtes Auslesen oft zum Absturz. Das
Beispielprogramm dafür war analog zu einem C++-Beispiel von Microsoft
programmiert, das selbst ohne Probleme lief. Der Grund für den Fehler bleibt
völlig unverständlich.
Während beim IE 5.0 Abstürze in der MSHTML.DLL auftraten, passiert dies
beim IE 5.5 meist in einer B2J-eigenen DLL. Mit dem IE 5.5 sind die Fehler im
allgemeinen sehr gut reproduzierbar, s.u.
(Nach jetzigem Stand ist B2J für die PG benutzbar.)
?? B2J stürzt ab, wenn eine Methode im konkreten Fall einen Leerstring
zurückliefern muss. Beobachtet wurde dieses Verhalten u. a. bei:
IHTMLDocument2.get_referrer(), wenn kein Referrer existiert [insbes.
sagt die Dokumentation, dass bei nicht vorhandenem Referrer ein Leerstring
zurückgegeben wird];
IHTMLElement2.get_innerText() bei leeren HTML-Elementen.
(Workaround möglich)
?? B2J stürzt ab, wenn bei IHTMLElement.getAttribute() ein nicht
vorhandenes Attribut abgefragt wird. Früher als „Problem mit VARIANTs“
bezeichnet.
(Workarounds: Entweder die HTML-Seiten entsprechend gestalten, oder die
Kombination
IHTMLDOMNode.get_attributes()
IHTMLAttributeCollection
IHTMLDOMAttribute
benutzen (liefert allerdings nur Standard-HTML-Attribute), oder den Tag selbst
parsen (IHTMLElement.get_outerHTML())).
?? Aus der MSHTML.DLL wurde kein Wrapper für das ActiveX-Control
WebBrowser erzeugt. Ebenso fehlen Wrapper für Event-Klassen im Umfeld
von IWebBrowserEvents2.
(Stattdessen kann man WebBrowser_V1 verwenden; es ist leider nicht klar, ob
dies weitere Konsequenzen hat. Insbesondere stehen mit WebBrowser_V1 in
B2J nicht die Events von IWebBrowserEvents2 zur Verfügung, sondern nur
diejenigen von IWebBrowserEvents. Analog lassen sich Event- Listener auch nur
für diese Events registrieren).
?? An das Webbrowser-Ereignis IWebBrowserEvents2.DocumentComplete
kommt man mit Bridge2Java nicht heran, da die entsprechenden Wrapper nicht
generiert wurden (s.o.).
Die Dokumentation besagt dass: DocumentComplete wird als letztes Event
PG Airweb - Gruppe IE
2/3
Michael Weers, 05.04.2001
ausgelöst (nach NavigateComplete bzw. NavigateComplete2; nach
NavigateComplete ist die Seite zwar komplett geladen, aber erst nach
DocumentComplete kann man siche r auf das Dokument zugreifen (per
get_Document() etc.).
Für den Airweb AIRBrowser haben wir das Problem so gelöst, dass der Zustand
vom Programm gepollt wird (mittels WebBrowser_V1.get_Busy()). Nach
einem NavigateComplete wird halt so lange gewartet (gepollt), bis get_Busy()
wieder auf false steht.
?? Schon im mitgelieferten Beispielprogramm funktionieren Back/Forward nicht.
Der Browser zeigt danach ständig den Mauspfeil mit Sanduhr (IE 5.5). Eine
alternative Implementierung (history-Objekt) zeigt gleiches Verhalten.
?? Bei in einem Java-Applikationsfenster eingebetteter IE-GUI-Komponente trat
das Problem auf, dass ein Swing-Eingabefeld (JTextField) den Eingabefokus
häufig nicht wiederbekommen konnte, nachdem einmal auf die IE-Komponente
geklickt wurde. (Das TextF ield des AWT zeigt dieses Problem nicht.)
?? Die IE-GUI-Komponente verdeckt aufklappende Swing-Menüs.
?? Der Wrapper-Generator hat von den DLLs des IE 5.5 mindestens einen JavaWrapper erzeugt, die sich nicht kompilieren lies.
(Der Wrapper wird nicht benötigt)
2 Sonstiges
?? Für Bridge2Java ist sehr wenig Dokumentation vorhanden. Das Vorhandene ist
zwar ein guter Ansatzpunkt, jedoch hat die Erfahrung gezeigt, dass sie auch
unvollständig ist.
?? Das API des Internet Explorers ist sehr umfangreich; zusätzlich muss jeweils
überlegt werden, wie das API in Java programmiert werden kann. Die im Web
(MS Developer Network) vorhandene Dokumentation ist stellenweise sehr
knapp.
3 Kurzanleitung für Bridge2Java
Zwei Schritte:
1. Wrapper (Proxies im B2J-Sprachgebrauch) generieren mit dem
Proxygen.exe (nur nötig falls noch nicht vorhanden). Die Wrapper werden
generiert in einem eigenen Verzeichnis (z.B. MSHTML) und sind dem
gleichnamigen Java-Package zugeordnet. Man könnte zusätzlich das Verzeichnis
in eine Jar-Datei einpacken.
2. In den Classpath aufnehmen:
?? das Bridge2Java-Verzeichnis (für die Bridge2Java-Kernklassen)
?? die generierten Wrapper (wegen der Package- Zugehörigkeit das Verzeichnis,
in dem die Wrapper-Verzeichnisse enthalten sind, oder die Jar-Datei(en).
PG Airweb - Gruppe IE
3/3
Michael Weers, 05.04.2001
Zusätzlich dafür sorgen, dass die Bridge2Java.dll gefunden werden kann,
entweder in den PATH aufnehmen oder java.exe die Option
–Djava.library.path=(Pfad zur DLL) geben. (Auch in JBuilder möglich)
(oder die dritte Möglichkeit vermutlich: Kopieren ins Windows-Verzeichnis)
Die baseenv.bat-Datei ist ein guter Startpunkt dafür.
Für die Programmierung siehe Beispielprogramme (wie immer ;-) )
In meinem Privatverzeichnis sieht die Verzeichnisstruktur so aus:
Bridge2Java: Die B2J-Installation. Proxy-Generator, Kern-Klassen, DLL, Beispiele
b2j: Generierte Wrapper, Beispielprogramme (QuickIE...), baseenv.bat
Browserkomponente: für den AirBrowser (incl. JBuilder-Projekt)
4 Bridge2Java-Programmierung
Bridge2Java arbeitet nach dem Prinzip, dass für jede COM-Klasse ein Java-Wrapper
gleichen Namens generiert wird, über den dann gearbeitet wird. Das gilt auch für COMInterfaces.
COM-Interfaces haben nach Namenskonvention ein I vorn im Namen.
Für die Benutzung der Wrapper sollte man generell die Doku der jeweiligen COMKlassen als auch den Wrapper selbst zu Rate ziehen.
...