Reflection Terminal Emulator - Integration mit IE
-
03-07-2019 - |
Frage
Ich versuche, einige Integration zwischen einer Legacy-Anwendung zu implementieren in dem Reflection Terminal Emulator und eine Browser-basierte Anwendung läuft im Internet Explorer ausgeführt wird.
Ich bin mit Host-Initiated Scripts, so dass Wartung und Bereitstellung Probleme mit dem Legacy-App isoliert sind. Alle Skripte werden in der Legacy-Anwendung und übertragen Reflexion unter Verwendung von Escape-Sequenzen erzeugt werden.
Ich bin derzeit in der Lage zu:
- Starten Sie IE
- Stellen Sie die Optionen wie Decksymbolleisten
- Navigieren Sie zu einer URL
- Status Transmit Informationen zurück zum Legacy-App
- Warten auf einen "engen" -Signal von dem Legacy-App
- Schließen IE
Hier ist VBA-Code, das zu tun:
Sub Main
Dim CR as String
CR = CHR$(rcCR)
Dim objIE as Object
Set objIE = CreateObject("InternetExplorer.Application")
objIE.ToolBar = false
objIE.Navigate("http://www.google.com/")
objIE.Visible = true
Session.Transmit "OK" & CR
Session.WaitForString "CLOSE", 0, rcAllowKeystrokes
objIE.Quit
End Sub
Das Problem dabei ist, dass das Skript läuft weiter, bis er den Schließbefehl von dem Legacy-App bekommt.
Was ich tun möchte, ist ein Skript zu verwenden, um den Browser zu starten, und eine andere, um entweder schließen oder es wiederverwenden es für eine andere URL. Allerdings habe ich schon nicht in der Lage, einen Weg zu finden, um meine Bezugnahme auf IE über Skript Anrufe zu speichern. Deklarieren objIE als globale außerhalb Sub Main nicht helfen. Das Session-Objekt nicht über Skript Anrufe bestehen bleiben, aber es scheint nicht, eine Eigenschaft, die ich für diesen Zweck verwenden kann. (Session hat eine Userdata-Eigenschaft, aber das ist ein String, kein Objekt.)
Hier ist ein Beispiel dafür, was Ich mag würde tun:
Script 1 - Offen IE & Lassen Sie es öffnen:
Sub Main
Dim CR as String
CR = CHR$(rcCR)
Dim objIE as Object
Set objIE = CreateObject("InternetExplorer.Application")
objIE.ToolBar = false
objIE.Navigate("http://www.google.com/")
objIE.Visible = true
Session.Transmit "OK" & CR
End Sub
Script 2 - Senden original IE-Fenster auf eine neue URL
Sub Main
Dim CR as String
CR = CHR$(rcCR)
Dim objIE as Object
Set objIE = FindOriginalIE()
objIE.Navigate("http://www.stackoverflow.com/")
Session.Transmit "OK" & CR
End Sub
Script 3 - Close IE
Sub Main
Dim CR as String
CR = CHR$(rcCR)
Dim objIE as Object
Set objIE = FindOriginalIE()
objIE.Quit
Session.Transmit "OK" & CR
End Sub
Der Teil, ich kann nicht herausfinden, wie die FindOriginalIE () Funktion in Scripts 2 und 3 verwendet implementieren.
Ich habe versucht, mit GetObject () anstelle von Create (), aber das hat mich nicht weiter. GetObject () ein neues IE-Fenster nicht öffnen, oder einen bestehenden finden. Ich vermute, das liegt daran, dass ich unter Citrix renne, aber ich bin nicht sicher.
Meine einzige führt jetzt sind, zu versuchen, das ursprüngliche Fenster mit IE HWND zu verbinden, oder DDE zu verwenden anstelle von OLE. Ich habe nicht viel Glück mit einem von denen, jedoch hatte, vor allem wegen der fehlenden Dokumentation.
Also, meine Fragen sind:
- Ist das, was ich versuche möglich zu tun mit OLE? Das heißt, ist es eine Möglichkeit, meinen Griff IE zu bleiben in Host initiiert Skript Anrufe?
- Sollte ich erwarten GetObject () zu arbeiten, oder ist das eine Sackgasse?
- Ist es möglich, die Win32-API zu verwenden, in einem Host initiiert Skript wieder eine Verbindung zum IE HWND?
Alle Links zu verwandten Artikeln, Beispielcode oder andere Erkenntnisse sind sehr geschätzt.
Lösung
AFAIK GetObject ist nicht nur für das Internet Explorer-Objekt unterstützt. Dies ist jedoch nicht das Ende :) Unter vielen anderen Möglichkeiten Sie können es aus dem Fenster Sammlung von shell32 zerren. Für das Beispiel-Code (von Code in den Link oben angepasst) arbeiten Sie einen Verweis auf die folgenden festlegen müssen:
- Microsoft-Internetsteuer
- Microsoft HTML Object Library
- Microsoft Shell Bedienelemente und Automation
Public Sub RunMeFirst()
Dim objIE As SHDocVw.InternetExplorer
Set objIE = New SHDocVw.InternetExplorer
objIE.Visible = True
objIE.navigate "http://www.google.com/"
Do Until objIE.readyState = READYSTATE_COMPLETE
DoEvents
Loop
End Sub
Public Sub RunMeSecond()
Dim objIE As SHDocVw.InternetExplorer
Dim doc As MSHTML.HTMLDocument
Set objIE = GetIEByURL("http://www.google.com/")
Set doc = objIE.document
MsgBox doc.body.innerText
End Sub
Private Function GetIEByURL(ByVal URL As String) As SHDocVw.InternetExplorer
Dim objShell As Shell32.Shell
Dim objExplorer As Shell32.ShellFolderView
Dim obj As Object
Set objShell = New Shell
For Each obj In objShell.Windows
If TypeOf obj Is SHDocVw.InternetExplorer Then
If StrComp(obj.LocationURL, URL, vbTextCompare) = 0& Then
Exit For
End If
End If
Next obj
Set GetIEByURL = obj
End Function
ich denke, es könnte sich lohnen zu diskutieren, was Sie aber versuchen zu erreichen. Roboting IE ist ein ziemlich kludgey Ansatz (von denen ich bin oft schuldig), aber es könnte ein besserer, weniger ressourcenintensiv Weg sein.