Reflection Terminal Emulator - Integración con IE
-
03-07-2019 - |
Pregunta
Estoy tratando de implementar alguna integración entre una aplicación heredada que se ejecuta en el Reflection Terminal Emulator y una aplicación basada en navegador que se ejecuta en IE.
Estoy usando secuencias de comandos iniciadas por el host para que los problemas de mantenimiento e implementación queden aislados de la aplicación heredada. Todos los scripts se generarán en la aplicación heredada y se transmitirán a Reflection mediante secuencias de escape.
Actualmente puedo:
- Inicia IE
- Establecer opciones como ocultar barras de herramientas
- Navega a una URL
- Transmitir información de estado a la aplicación heredada
- Espera a que " cerrar " señal de la aplicación heredada
- cierra IE
Aquí está el código VBA para hacer eso:
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
El problema con esto es que la secuencia de comandos continúa ejecutándose hasta que obtiene el comando de cierre de la aplicación heredada.
Lo que quiero hacer es usar una secuencia de comandos para iniciar el navegador y otra para cerrarla o reutilizarla para otra URL. Sin embargo, no he podido encontrar una manera de guardar mi referencia a IE a través de llamadas de script. Declarar objIE como Global fuera de Sub Main no ayudó. El objeto Session persiste en las llamadas de script, pero no parece tener una propiedad que pueda usar para este propósito. (La sesión tiene una propiedad UserData, pero es una cadena, no un objeto).
Aquí hay un ejemplo de lo que me gustaría hacer:
Script 1 - Abre IE & amp; Déjalo abierto:
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: envía la ventana original de IE a una nueva 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 - Cerrar 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
La parte que no puedo entender es cómo implementar la función FindOriginalIE () utilizada en las secuencias de comandos 2 y 3.
Intenté usar GetObject () en lugar de CreateObject (), pero eso no me llevó a ninguna parte. GetObject () no abrirá una nueva ventana de IE ni buscará una existente. Sospecho que esto se debe a que estoy ejecutando bajo Citrix, pero no estoy seguro.
Mis únicas pistas ahora son intentar usar el hWND de IE para volver a conectarse a la ventana original, o usar DDE en lugar de OLE. No he tenido mucha suerte con ninguno de estos, sin embargo, principalmente debido a la falta de documentación.
Por lo tanto, mis preguntas son:
- Es lo que estoy tratando de hacer posible. utilizando OLE? Es decir, ¿hay una manera para persistir mi manejo a través de IE ¿Las llamadas de script iniciadas por el host?
- ¿Debo esperar que GetObject () funcione, ¿O es un callejón sin salida?
- ¿Es posible utilizar la API de Win32? en un script iniciado por el host para ¿volver a conectarse a IE utilizando hWND?
Cualquier enlace a artículos relacionados, código de muestra u otras ideas son muy apreciados.
Solución
AFAIK GetObject simplemente no es compatible con el objeto InternetExplorer. Sin embargo, este no es el fin :) Entre muchas otras formas Puedes sacarlo de la colección de windows de shell32. Para que el código de ejemplo (adaptado del código en el enlace anterior) funcione, debe establecer una referencia a lo siguiente:
- Controles de Internet de Microsoft
- Biblioteca de objetos HTML de Microsoft
- Microsoft Shell Controls and 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
Sin embargo, creo que vale la pena discutir lo que estás tratando de lograr. Roboting IE es un enfoque bastante delicado (del que a menudo soy culpable), pero podría haber una forma mejor y menos intensiva de recursos.