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:

  1. Inicia IE
  2. Establecer opciones como ocultar barras de herramientas
  3. Navega a una URL
  4. Transmitir información de estado a la aplicación heredada
  5. Espera a que " cerrar " señal de la aplicación heredada
  6. 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:

  1. 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?
  2. ¿Debo esperar que GetObject () funcione, ¿O es un callejón sin salida?
  3. ¿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.

¿Fue útil?

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:

  1. Controles de Internet de Microsoft
  2. Biblioteca de objetos HTML de Microsoft
  3. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top