Herstellen einer Verbindung mit einer ausgeführten Instanz von Internet Explorer

Wichtig

Die Internet Explorer 11-Desktopanwendung wird für bestimmte Versionen von Windows 10 eingestellt und ab dem 15. Juni 2022 nicht mehr unterstützt.

Sie können mit dem Internet Explorer-Modus in Microsoft Edge weiterhin auf ältere Websites zugreifen, für die Internet Explorer erforderlich ist. Anleitung.

Die Internet Explorer 11-Desktopanwendung wird schrittweise an den schnelleren, sichereren Microsoft Edge-Browser umgeleitet und letztendlich über Windows Update deaktiviert werden. Deaktivieren von IE heute.

Sie können die SHDocVw.ShellWindows -Auflistung verwenden, um eine Verbindung mit einer ausgeführten Instanz von Internet Explorer herzustellen.

Ursprüngliche Produktversion:   Internet Explorer
Ursprüngliche KB-Nummer:   176792

Weitere Informationen

In der Regel stellt eine Anwendung mithilfe der Tabelle eine Verbindung mit einer ausgeführten Instanz einer anderen Anwendung Running Object her. Da sich Internet Explorer nicht selbst in der ausgeführten Objekttabelle registriert, ist eine weitere Methode erforderlich.

Die ShellWindows-Auflistung wird im Internet Client SDK wie folgt beschrieben:

Das ShellWindows-Objekt stellt eine Auflistung der geöffneten Fenster dar, die zur Shell gehören. Tatsächlich enthält diese Auflistung Verweise auf Internet Explorer sowie auf andere Fenster, die zur Shell gehören, z. B. Windows Explorer.

Der folgende Visual Basic Code ruft einen Verweis auf die ShellWindows -Auflistung ab. Die Auflistung wird aufgezählt, und der LocationName für jedes Objekt, das einem Listenfeld hinzugefügt wurde. Wenn das dem Objekt zugeordnete Dokument vom Typ HTMLDocument (eine Webseite) ist, wird der Titel der Seite einem anderen Listenfeld hinzugefügt.

Zum Ausführen des folgenden Codes muss dem Visual Basic Projekt ein Verweis auf Microsoft Internet Controls (Shdocvw.dll) und die Microsoft HTML-Objektbibliothek (Mshtml.dll) hinzugefügt werden:

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

In C++ kann eine Verbindung ungefähr auf die gleiche Weise hergestellt werden. Visual C++ Native COM-Unterstützung wird hier aus Platzgründen verwendet.

Fügen Sie Dem Projekt Verweise auf Shdocvw.dll und Mshtml.dll hinzu:

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

Deklarieren Sie eine Instanz eines IShellWindows-Zeigers in der Ansichtsklasse:

SHDocVw::IShellWindowsPtr m_spSHWinds;

Erstellen Sie eine Instanz eines ShellWindows-Objekts im Konstruktor Ihrer Ansicht:

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

Verwenden Sie das ShellWindows-Objekt in der OnInitialUpdate-Funktion Ihrer Ansicht:

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());
            }
        }
    }
}

Die vorherige Methode zum Herstellen einer Verbindung mit einer ausgeführten Instanz von Internet Explorer funktioniert nicht, wenn die Shell-Integration nicht installiert ist oder wenn "Durchsuchen in einem neuen Prozess" in Internet Explorer ausgewählt ist.

Wenn diese Faktoren nicht gesteuert werden können, gibt es noch eine mögliche Methode, die möglicherweise funktioniert. Ein Browserhilfsobjekt kann geschrieben werden, um Internet Explorer in der aktiven Objekttabelle (ROT) zu registrieren. Je nachdem, wie die Anwendung die Instanz von Internet Explorer ermittelt, mit der eine Verbindung hergestellt werden soll, sind hier viele Implementierungen möglich. Nur eine mögliche Lösung: Das Browserhilfsobjekt, das Zugriff auf das Objektmodell der Instanz von Explorer hat, die es gestartet hat, würde ermitteln, ob dies die Instanz des Browsers ist, die in der ausgeführten Objekttabelle registriert werden soll.

Die Schnittstelle, an der der Verbraucher interessiert ist, kann in rot mit der RegisterActiveObject-Funktion und einer Pseudo-CLSID registriert werden, die der Consumer erkennt. Eine weitere Lösung, mit der mehrere Instanzen des Explorers im ROT registriert werden können, besteht darin, dass das Browserhilfsobjekt einen Item-Moniker basierend auf einer GUID und daten eindeutig für jede Instanz von Internet Explorer erstellt. The moniker would be registered in the ROT with the IRunningObjectTable::Register method. Auch hier müsste der Verbraucher wissen, wie dieser Moniker erkannt werden kann.

References

Weitere Informationen zu Windows Shell SDK finden Sie unter Windows Shell.

Weitere Informationen zu Internet Explorer-spezifischen Entwicklern finden Sie unter Internet Explorer für Entwickler.