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. ...