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

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

Original Version des Produkts:   Internet Explorer
Ursprüngliche KB-Nummer:   176792

Weitere Informationen

Normalerweise stellt eine Anwendung mithilfe der Tabelle eine Verbindung mit einer ausgeführten Instanz einer anderen Anwendung her Running Object . Da sich Internet Explorer nicht in der ausgeführten Objekttabelle registriert, ist eine andere 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. In der Tat enthält diese Auflistung Verweise auf Internet Explorer sowie andere Fenster, die zur Shell gehören, beispielsweise den Windows-Explorer.

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

Zum Ausführen des folgenden Codes müssen Sie einen Verweis auf Microsoft Internet Controls (Shdocvw.dll) und Microsoft HTML Object Library (Mshtml.dll) zum Visual Basic-Projekt hinzufügen:

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 in etwa auf die gleiche Weise ausgeführt werden. Visual C++ Native COM-Unterstützung wird hier aus Gründen der Kürze 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 ihrer View-Klasse:

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 des Internet Explorer funktioniert nicht, wenn die Shell-Integration nicht installiert ist oder wenn in Internet Explorer die Option zum Durchsuchen eines neuen Prozesses ausgewählt ist.

Wenn diese Faktoren nicht gesteuert werden können, gibt es noch eine mögliche Methode, die funktionieren kann. Ein Browser Helper-Objekt kann geschrieben werden, um Internet Explorer in der laufenden Objekttabelle (rot) zu registrieren. Es sind zahlreiche Implementierungen möglich, je nachdem, wie die Anwendung die Instanz von Internet Explorer bestimmt, mit der eine Verbindung hergestellt werden soll. Nur eine mögliche Lösung: das Browser-Hilfsobjekt, das Zugriff auf das Objektmodell der Instanz des Explorers hat, das es gestartet hat, würde ermitteln, ob es sich dabei um die Instanz des Browsers handelt, die in der ausgeführten Objekttabelle registriert werden sollte.

Die Schnittstelle, an der der Consumer interessiert ist, kann in der Fäulnis mit der RegisterActiveObject-Funktion und einer Dummy-CLSID registriert werden, die vom Consumer erkannt wird. Eine andere Lösung, mit der mehrere Instanzen des Explorers in der rot registriert werden können, wäre, dass das Browser-Hilfsobjekt einen Element Moniker erstellt, der auf einer GUID und einem datenstück basiert, das für jede Instanz von Internet Explorer eindeutig ist. Der Moniker würde mit der-Methode in der Fäulnis registriert IRunningObjectTable::Register . Auch hier müsste der Consumer wissen, wie dieser Moniker erkannt wird.

Informationsquellen

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

Weitere Informationen zu bereitgestellten Entwicklern für Internet Explorer finden Sie unter Internet Explorer for Developers.