Emulatore di terminale di riflessione - Integrazione con IE
-
03-07-2019 - |
Domanda
Sto cercando di implementare una certa integrazione tra un'app legacy in esecuzione nell'emulatore di Reflection Terminal e un'app basata su browser in esecuzione in IE.
Sto utilizzando Host Initiated Scripts in modo che i problemi di manutenzione e distribuzione siano isolati all'app legacy. Tutti gli script verranno generati nell'app legacy e trasmessi a Reflection utilizzando sequenze di escape.
Sono attualmente in grado di:
- Avvia IE
- Imposta opzioni come nascondere le barre degli strumenti
- Passa a un URL
- Trasmetti le informazioni sullo stato all'app legacy
- Attendi un " chiudi " segnale dall'app legacy
- Chiudi IE
Ecco il codice VBA per farlo:
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
Il problema è che lo script continua a essere eseguito fino a quando non ottiene il comando di chiusura dall'app legacy.
Quello che voglio fare è usare uno script per avviare il browser e un altro per chiuderlo o riutilizzarlo per un altro URL. Tuttavia, non sono stato in grado di trovare un modo per salvare il mio riferimento a IE attraverso le chiamate di script. Dichiarare objIE come globale fuori da Sub Main non ha aiutato. L'oggetto Session persiste per tutte le chiamate di script, ma non sembra avere una proprietà che posso usare per questo scopo. (La sessione ha una proprietà UserData, ma questa è una stringa, non un oggetto.)
Ecco un esempio di cosa mi piacerebbe fare:
Script 1 - Apri IE & amp; Lasciare aperto:
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: invia la finestra originale di IE a un nuovo 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 - Chiudi 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 che non riesco a capire è come implementare la funzione FindOriginalIE () utilizzata negli script 2 e 3.
Ho provato a usare GetObject () invece di CreateObject (), ma non mi ha portato da nessuna parte. GetObject () non aprirà una nuova finestra di IE o non ne troverà una esistente. Sospetto che ciò avvenga perché sono in esecuzione su Citrix, ma non ne sono sicuro.
Il mio unico vantaggio in questo momento è provare a utilizzare hWND di IE per riconnettermi alla finestra originale o utilizzare DDE anziché OLE. Tuttavia, non ho avuto molta fortuna con nessuno dei due, principalmente a causa della mancanza di documentazione.
Quindi, le mie domande sono:
- È ciò che sto cercando di fare possibile usando OLE? Cioè, c'è un modo per mantenere il mio controllo su IE chiamate di script avviate dall'host?
- Dovrei aspettarmi che GetObject () funzioni, o è un vicolo cieco?
- È possibile utilizzare l'API Win32 in uno script avviato dall'host a riconnetterti a IE usando hWND?
Tutti i collegamenti ad articoli correlati, codice di esempio o altri approfondimenti sono molto apprezzati.
Soluzione
AFAIK GetObject non è supportato per l'oggetto InternetExplorer. Comunque questa non è la fine :) Tra molti altri modi puoi strapparlo dalla collezione windows di shell32. Affinché il codice di esempio (adattato dal codice nel link sopra) funzioni, è necessario impostare un riferimento a quanto segue:
- Controlli Internet di Microsoft
- Libreria di oggetti HTML Microsoft
- Controlli e automazione della shell di Microsoft
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
Penso che valga la pena discutere di ciò che stai cercando di realizzare. Roboting IE è un approccio piuttosto clandestino (di cui sono spesso colpevole), ma potrebbe esserci un modo migliore, meno dispendioso in termini di risorse.