Question

J'essaie d'implémenter une certaine intégration entre une application existante exécutée dans l'émulateur de terminal Reflection et une application basée sur un navigateur exécutée dans IE.

J'utilise des scripts lancés par l'hôte afin que les problèmes de maintenance et de déploiement soient isolés dans l'application héritée. Tous les scripts seront générés dans l'application existante et transmis à Reflection à l'aide de séquences d'échappement.

Je suis actuellement en mesure de:

  1. Lancer IE
  2. Définissez des options telles que le masquage des barres d'outils
  3. Accédez à une URL
  4. Transmettre les informations d'état à l'application existante
  5. Attendez un " fermer " signal de l'application héritée
  6. Fermer IE

Voici le code VBA pour le faire:


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

Le problème, c'est que le script continue de s'exécuter jusqu'à ce qu'il obtienne la commande de fermeture de l'application héritée.

Ce que je veux faire, c'est utiliser un script pour lancer le navigateur et un autre pour le fermer ou le réutiliser pour une autre URL. Cependant, je n'ai pas été en mesure de trouver un moyen de sauvegarder ma référence à IE dans les appels de script. Déclarer objIE en tant que Global en dehors de Sub Main n'a pas aidé. L'objet Session persiste dans les appels de script, mais il ne semble pas avoir de propriété que je puisse utiliser à cette fin. (La session a une propriété UserData, mais c'est une chaîne, pas un objet.)

Voici un exemple de ce que j'aimerais faire:

Script 1 - Ouvrez IE & amp; Laissez-le ouvert:


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 - Envoi de la fenêtre IE d'origine à une nouvelle 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 - Fermer Internet Explorer


Sub Main
  Dim CR as String
  CR = CHR$(rcCR)
  Dim objIE as Object
  Set objIE = FindOriginalIE()
  objIE.Quit
  Session.Transmit "OK" & CR
End Sub

Ce que je ne comprends pas, c'est comment implémenter la fonction FindOriginalIE () utilisée dans les scripts 2 et 3.

J'ai essayé d'utiliser GetObject () au lieu de CreateObject (), mais cela ne m'a conduit nulle part. GetObject () n'ouvrira pas une nouvelle fenêtre IE ni ne trouvera une fenêtre existante. J'imagine que c'est parce que je cours sous Citrix, mais je ne suis pas sûr.

Mon seul objectif actuel consiste à essayer d'utiliser le hWND d'IE pour se reconnecter à la fenêtre d'origine ou à utiliser DDE au lieu de OLE. Cependant, je n'ai pas eu beaucoup de chance avec ces solutions, principalement à cause d'un manque de documentation.

Mes questions sont donc les suivantes:

  1. Est-ce que j'essaie de faire possible en utilisant OLE? C'est, y a-t-il un moyen persister ma poignée à IE à travers appels de script initiés par l'hôte?
  2. Devrais-je m'attendre à ce que GetObject () fonctionne, ou est-ce une impasse?
  3. Est-il possible d'utiliser l'API Win32 dans un script initié par l'hôte pour reconnecter à IE en utilisant hWND?

Tous les liens vers des articles connexes, des exemples de code ou d'autres informations sont les bienvenus.

Était-ce utile?

La solution

AFAIK GetObject n'est tout simplement pas pris en charge pour l'objet InternetExplorer. Cependant, ce n’est pas la fin :) Parmi de nombreuses autres manières vous pouvez le retirer de la collection windows de shell32. Pour que l'exemple de code (adapté du code dans le lien ci-dessus) fonctionne, vous devez définir une référence à ce qui suit:

  1. Contrôles Microsoft Internet
  2. Bibliothèque d'objets Microsoft HTML
  3. Contrôles et automatisation Microsoft Shell

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

Je pense cependant que cela pourrait valoir la peine de discuter de ce que vous essayez d'accomplir. Roboting IE est une approche plutôt discrète (dont je suis souvent coupable), mais il existe peut-être une méthode plus efficace, utilisant moins de ressources.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top