Comment se connecter à une instance en cours d’Internet Explorer

Vous pouvez utiliser la collection shdocvw. ShellWindows pour vous connecter à une instance d’Internet Explorer en cours d’exécution.

Version du produit d’origine :   Internet Explorer
Numéro de la base de connaissances initiale :   176792

Plus d’informations

En règle générale, une application se connecte à une instance en cours d’exécution d’une autre application à l’aide de la Running Object table. Étant donné qu’Internet Explorer ne s’inscrit pas dans la table d’objets en cours d’exécution, une autre méthode est nécessaire.

La collection ShellWindows est décrite dans le kit de développement logiciel (SDK) du client Internet comme suit :

L’objet ShellWindows représente une collection de fenêtres ouvertes qui appartiennent à l’environnement de commande Exchange Management Shell. En fait, cette collection contient des références à Internet Explorer ainsi que d’autres fenêtres appartenant au shell, telles que l’Explorateur Windows.

Le code Visual Basic suivant obtient une référence à la collection ShellWindows . La collection est énumérée et LocationName de chaque objet ajouté à une zone de liste. Si le document associé à l’objet est de type HtmlDocument (une page Web), le titre de la page est ajouté à une autre zone de liste.

Pour exécuter le code suivant, il est nécessaire d’ajouter une référence à Microsoft Internet Controls (Shdocvw.dll) et à la bibliothèque d’objets Microsoft HTML (Mshtml.dll) dans le projet Visual Basic :

Dim SWs As New SHDocVw.ShellWindows
Dim IE As SHDocVw.InternetExplorer

Private Sub Form_Load()
    Dim Doc
    List1.Clear
    List2.Clear

    Text1.Text = SWs.count

    For Each IE In SWs
        List1.AddItem IE.LocationName

        Set Doc = IE.Document
        If TypeOf Doc Is HTMLDocument Then
            'if this is an HTML page, display the title
            'may or may not be the same as LocationName
            List2.AddItem Doc.Title
        End If
    Next
End Sub

En C++, une connexion peut être effectuée de la même façon. La prise en charge de Visual C++ native COM est utilisée ici à des fins de concision.

Ajoutez des références à Shdocvw.dll et Mshtml.dll au projet :

#import <mshtml.dll> // Internet Explorer 4.0x
#import <mshtml.tlb> // Internet Explorer 5
#import <shdocvw.dll>

Déclarez une instance d’un pointeur IShellWindows dans votre classe d’affichage :

SHDocVw::IShellWindowsPtr m_spSHWinds;

Créez une instance d’un objet ShellWindows dans le constructeur de votre vue :

m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows));

Utilisez l’objet ShellWindows dans la fonction OnInitialUpdate de votre vue :

void CConnectIEView::OnInitialUpdate()
{
    CFormView::OnInitialUpdate();

    ASSERT(m_spSHWinds != NULL);

    CString strCount;
    long nCount = m_spSHWinds->GetCount();

    strCount.Format("%i", nCount);
    m_strWinCount = strCount;

    UpdateData(FALSE);

    IDispatchPtr spDisp;
    for (long i = 0; i < nCount; i++)
    {
        _variant_t va(i, VT_I4);
        spDisp = m_spSHWinds->Item(va);

        SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
        if (spBrowser != NULL)
        {
            m_ctlListLoc.AddString(spBrowser->GetLocationName());

            MSHTML::IHTMLDocument2Ptr spDoc(spBrowser->GetDocument());
            if (spDoc != NULL)
            {
                m_ctlListTitle.AddString(spDoc->Gettitle());
            }
        }
    }
}

La méthode précédente de connexion à une instance en cours d’exécution d’Internet Explorer ne fonctionne pas si l’intégration du shell n’est pas installée ou si l’option Parcourir dans un nouveau processus est sélectionnée dans Internet Explorer.

Si ces facteurs ne peuvent pas être contrôlés, il existe toujours une méthode susceptible de fonctionner. Un objet d’assistance de navigateur peut être écrit pour inscrire Internet Explorer dans la table ROT (Running Object Table). Il existe de nombreuses implémentations possibles en fonction de la façon dont l’application est utilisée pour déterminer l’instance d’Internet Explorer avec laquelle se connecter. Une solution possible : l’objet d’assistance du navigateur, ayant accès au modèle objet de l’instance de l’Explorateur qui l’a lancé, détermine s’il s’agit de l’instance du navigateur qui doit être inscrite dans la table objet en cours d’exécution.

L’interface qui intéresse le consommateur peut être inscrite dans la table ROT avec la fonction RegisterActiveObject et un CLSID factice reconnu par le consommateur. Une autre solution, qui permettrait à plusieurs instances de l’Explorateur d’être inscrites dans la table ROT, serait de faire en sorte que l’objet d’assistance du navigateur compose un moniker basé sur un GUID et un élément de données propres à chaque instance d’Internet Explorer. Le moniker est enregistré dans la table ROT avec la IRunningObjectTable::Register méthode. Encore une fois, le consommateur doit savoir comment reconnaître ce moniker.

Références

Pour plus d’informations sur le kit de développement logiciel Windows Shell, voir Windows Shell.

Pour plus d’informations sur les services de développeur spécifiques à Internet Explorer, consultez la rubrique Internet Explorer pour les développeurs.