Verbinding maken met een actief exemplaar van Internet Explorer

Waarschuwing

De buiten gebruik gestelde, niet meer ondersteunde Internet Explorer 11-desktoptoepassing is permanent uitgeschakeld via een Microsoft Edge-update op bepaalde versies van Windows 10. Raadpleeg Veelgestelde vragen over de beëindiging van de desktoptoepassing voor Internet Explorer 11 voor meer informatie.

U kunt de verzameling SHDocVw.ShellWindows gebruiken om verbinding te maken met een actief exemplaar van Internet Explorer.

Oorspronkelijke productversie: Internet Explorer
Origineel KB-nummer: 176792

Meer informatie

Normaal gesproken maakt een toepassing verbinding met een actief exemplaar van een andere toepassing met behulp van de Running Object tabel. Omdat Internet Explorer zichzelf niet registreert in de actieve objecttabel, is een andere methode nodig.

De ShellWindows-verzameling wordt als volgt beschreven in de Internet Client SDK:

Het ShellWindows-object vertegenwoordigt een verzameling van de geopende vensters die deel uitmaken van de shell. In feite bevat deze verzameling verwijzingen naar Internet Explorer en andere vensters die deel uitmaken van de shell, zoals Windows Verkenner.

Met de volgende Visual Basic-code krijgt u een verwijzing naar de ShellWindows-verzameling . De verzameling wordt geïnventariseerd en de LocationName voor elk object toegevoegd aan een keuzelijst. Als het document dat aan het object is gekoppeld van het type HTMLDocument (een webpagina), wordt de titel voor de pagina toegevoegd aan een andere keuzelijst.

Als u de volgende code wilt uitvoeren, moet u een verwijzing naar Microsoft Internet Controls (Shdocvw.dll) en Microsoft HTML Object Library (Mshtml.dll) toevoegen aan het Visual Basic-project:

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++ kan een verbinding op ongeveer dezelfde manier tot stand worden gebracht. Visual C++ Native COM-ondersteuning wordt hier gebruikt voor de beknoptheid.

Voeg verwijzingen naar Shdocvw.dll en Mshtml.dll toe aan het project:

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

Declareer een exemplaar van een IShellWindows-aanwijzer in uw weergaveklasse:

SHDocVw::IShellWindowsPtr m_spSHWinds;

Maak een exemplaar van een ShellWindows-object in de constructor van uw weergave:

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

Gebruik het ShellWindows-object in de functie OnInitialUpdate van uw weergave:

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

De vorige methode voor het maken van verbinding met een actief exemplaar van Internet Explorer werkt niet als Shell-integratie niet is geïnstalleerd of als Bladeren in een nieuw proces is geselecteerd in Internet Explorer.

Als deze factoren niet kunnen worden gecontroleerd, is er nog steeds één mogelijke methode die kan werken. Een browserhulpobject kan worden geschreven om Internet Explorer te registreren in de actieve objecttabel (ROT). Er zijn hier veel implementaties mogelijk, afhankelijk van hoe de toepassing het exemplaar van Internet Explorer moet bepalen waarmee verbinding moet worden gemaakt. Slechts één mogelijke oplossing: het browserhelperobject, dat toegang heeft tot het objectmodel van het exemplaar van Explorer dat het heeft gestart, bepaalt of dit het exemplaar van de browser is dat moet worden geregistreerd in de actieve objecttabel.

De interface waarin de consument geïnteresseerd is, kan worden geregistreerd in de ROT met de functie RegisterActiveObject en een dummy CLSID die de consument zal herkennen. Een andere oplossing, waarmee meerdere exemplaren van de verkenner kunnen worden geregistreerd in de ROT, is om het Browser Helper-object een item moniker te laten opstellen op basis van een GUID en gegevens die uniek zijn voor elk exemplaar van Internet Explorer. De moniker wordt geregistreerd in de ROT met de IRunningObjectTable::Register methode. Nogmaals, de consument moet weten hoe hij deze moniker moet herkennen.

Verwijzingen

Zie Windows Shell voor meer informatie over Windows Shell SDK.

Zie Internet Explorer voor ontwikkelaars voor meer informatie over mogelijkheden voor ontwikkelaars die specifiek zijn voor Internet Explorer.