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:

  1. Starten Sie IE
  2. Stellen Sie die Optionen wie Decksymbolleisten
  3. Navigieren Sie zu einer URL
  4. Status Transmit Informationen zurück zum Legacy-App
  5. Warten auf einen "engen" -Signal von dem Legacy-App
  6. 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:

  1. 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?
  2. Sollte ich erwarten GetObject () zu arbeiten, oder ist das eine Sackgasse?
  3. 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.

War es hilfreich?

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:

  1. Microsoft-Internetsteuer
  2. Microsoft HTML Object Library
  3. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top