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:

  1. Avvia IE
  2. Imposta opzioni come nascondere le barre degli strumenti
  3. Passa a un URL
  4. Trasmetti le informazioni sullo stato all'app legacy
  5. Attendi un " chiudi " segnale dall'app legacy
  6. 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:

  1. È 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?
  2. Dovrei aspettarmi che GetObject () funzioni, o è un vicolo cieco?
  3. È 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.

È stato utile?

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:

  1. Controlli Internet di Microsoft
  2. Libreria di oggetti HTML Microsoft
  3. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top