Comment se connecter à un instance en cours d’exécution d’Internet Explorer

Avertissement

L’application de bureau Internet Explorer 11, mise hors service et dont le support a pris fin, a été désactivée définitivement via une mise à jour Microsoft Edge sur certaines versions de Windows 10. Pour plus d’informations, consultez le forum aux questions sur la mise hors service de l’application de bureau Internet Explorer 11.

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

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

Plus d’informations

En règle générale, une application se connecte à un instance en cours d’exécution d’une autre application à l’aide de la Running Object table . Étant donné que Explorer Internet 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) client Internet comme suit :

L’objet ShellWindows représente une collection des fenêtres ouvertes qui appartiennent à l’interpréteur de commandes. En fait, cette collection contient des références aux Explorer Internet ainsi qu’à d’autres fenêtres appartenant à l’interpréteur de commandes, telles que le Explorer Windows.

Le code Visual Basic suivant obtient une référence à la collection ShellWindows . La collection est énumérée et le LocationName de chaque objet est 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 aux contrôles Microsoft Internet (Shdocvw.dll) et à la bibliothèque d’objets Microsoft HTML (Mshtml.dll) au 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 à peu près de la même façon. La prise en charge com native de Visual C++ est utilisée ici par souci 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 un instance d’un pointeur IShellWindows dans votre classe d’affichage :

SHDocVw::IShellWindowsPtr m_spSHWinds;

Créez un 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 affichage :

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 pour la connexion à un instance en cours d’exécution du Explorer Internet ne fonctionne pas si l’intégration 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 possible qui peut fonctionner. Un objet d’assistance de navigateur peut être écrit pour inscrire des Explorer Internet dans la table d’objets en cours d’exécution (ROT). Il existe ici de nombreuses implémentations possibles en fonction de la façon dont l’application détermine la instance de Explorer Internet avec laquelle se connecter. Une seule solution possible : l’objet d’assistance du navigateur, ayant accès au modèle objet du instance de Explorer qui l’a lancé, détermine s’il s’agit de la instance du navigateur qui doit être inscrite dans la table d’objets en cours d’exécution.

L’interface qui intéresse le consommateur peut être inscrite dans le ROT avec la fonction RegisterActiveObject et un CLSID factice que le consommateur reconnaîtra. Une autre solution, qui permettrait à plusieurs instances de l’explorateur d’être inscrites dans le ROT, consisterait à demander à l’objet Browser Helper de composer un moniker Item basé sur un GUID et des données propres à chaque instance de Explorer Internet. Le moniker est inscrit dans le ROT avec la IRunningObjectTable::Register méthode . Là encore, le consommateur devra savoir comment reconnaître ce moniker.

References

Pour plus d’informations sur le Kit de développement logiciel (SDK) Windows Shell, consultez Windows Shell.

Pour plus d’informations sur les fournit aux développeurs spécifiques à Internet Explorer, consultez Internet Explorer pour les développeurs.