2009-03-02 6 views
1

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 fonctionnant dans IE. J'utilise des scripts initiés par l'hôte pour que les problèmes de maintenance et de déploiement soient isolés de l'ancienne application. Tous les scripts seront générés dans l'application héritée et transmis à Reflection en utilisant des séquences d'échappement.Émulateur de terminal de Reflection - Intégration avec IE

Je suis actuellement en mesure de:

  1. Lancer IE
  2. Définir les options telles que les barres d'outils cacher
  3. Naviguer vers une URL
  4. informations sur l'état de transmission de retour à l'application héritée
  5. d'attente pour un signal de "fermeture" de l'application existante
  6. Fermer IE

est ici 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 est que le script continue de fonctionner jusqu'à ce qu'il obtienne la commande de fermeture de l'application héritée. Ce que je veux faire est d'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 d'enregistrer ma référence à IE à travers les appels de script. Déclarer objIE comme Global à l'extérieur de Sub Main n'a pas aidé. L'objet Session persiste à travers les appels de script, mais il ne semble pas avoir de propriété que je puisse utiliser à cette fin. (Session a une propriété UserData, mais c'est une chaîne, pas un objet.)

Voici un exemple de ce que je voudrais faire:

Script 1 - Ouvrez Internet Explorer & laisser 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 - Envoyer fenêtre d'origine IE à 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 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 partie que je ne peux pas comprendre est comment implémenter la fonction FindOriginalIE() utilisé dans les scripts 2 et 3.

J'ai essayé d'utiliser GetObject() au lieu de CreateObject(), mais cela m'a fait nulle part. GetObject() n'ouvrira pas une nouvelle fenêtre IE ou n'en trouvera pas une existante. Je pense que c'est parce que je cours sous Citrix, mais je ne suis pas sûr. Mes seules pistes pour l'instant sont d'essayer d'utiliser IE hWND pour se reconnecter à la fenêtre d'origine, ou d'utiliser DDE au lieu de OLE. Cependant, je n'ai pas eu beaucoup de chance avec l'un ou l'autre de ces problèmes, principalement en raison d'un manque de documentation.

Alors, mes questions sont les suivantes:

  1. Est-ce que je suis en train de faire possible avec OLE?En d'autres termes, existe-t-il un moyen de maintenir mon adresse IP à 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 se reconnecter à IE à l'aide de hWND?

Tous les liens vers des articles connexes, un exemple de code ou d'autres informations sont grandement appréciés.

Répondre

1

AFAIK GetObject n'est simplement pas pris en charge pour l'objet InternetExplorer. Cependant, ce n'est pas la fin :) Parmi many other ways vous pouvez le retirer de la collection windows de shell32. Pour le code exemple (adapté du code dans le lien ci-dessus) fonctionne, vous devez définir une référence aux suivantes:

  1. Microsoft Internet Controls
  2. Microsoft HTML Object Library
  3. Microsoft Controls Shell et automatisation

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 qu'il pourrait être utile de discuter de ce que vous essayez d'accomplir bien. Roboting IE est une approche assez simple (dont je suis souvent coupable), mais il pourrait y avoir une meilleure façon, moins gourmande en ressources.