Conexión a una instancia en ejecución de Internet Explorer

Advertencia

Se ha programado la deshabilitación permanente de la aplicación de escritorio retirada y sin soporte de Internet Explorer 11 a través de una actualización de Microsoft Edge en ciertas versiones de Windows 10. Para obtener más información, consulte Preguntas frecuentes sobre la retirada de la aplicación de escritorio de Internet Explorer 11.

Puede usar la colección SHDocVw.ShellWindows para conectarse a una instancia en ejecución de Internet Explorer.

Versión original del producto: Internet Explorer
Número de KB original: 176792

Más información

Normalmente, una aplicación se conecta a una instancia en ejecución de otra aplicación mediante la Running Object tabla . Dado que Internet Explorer no se registra en la tabla de objetos en ejecución, es necesario otro método.

La colección ShellWindows se describe en el SDK de cliente de Internet como se indica a continuación:

El objeto ShellWindows representa una colección de las ventanas abiertas que pertenecen al shell. De hecho, esta colección contiene referencias a Internet Explorer , así como a otras ventanas que pertenecen al shell, como El Explorador de Windows.

El siguiente código de Visual Basic obtiene una referencia a la colección ShellWindows . Se enumera la colección y locationName para cada objeto agregado a un cuadro de lista. Si el documento asociado al objeto es de tipo HTMLDocument (una página web), el título de la página se agrega a otro cuadro de lista.

Para ejecutar el código siguiente, es necesario agregar una referencia a Microsoft Internet Controls (Shdocvw.dll) y Microsoft HTML Object Library (Mshtml.dll) al proyecto de 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++, una conexión se puede realizar aproximadamente de la misma manera. La compatibilidad con COM nativa de Visual C++ se usa aquí en aras de la brevedad.

Agregue referencias a Shdocvw.dll y Mshtml.dll al proyecto:

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

Declare una instancia de un puntero IShellWindows en la clase de vista:

SHDocVw::IShellWindowsPtr m_spSHWinds;

Cree una instancia de un objeto ShellWindows en el constructor de la vista:

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

Use el objeto ShellWindows en la función OnInitialUpdate de la vista:

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

El método anterior para conectarse a una instancia en ejecución de Internet Explorer no funciona si la integración de Shell no está instalada o si se selecciona Examinar en un nuevo proceso en Internet Explorer.

Si estos factores no se pueden controlar, todavía hay un método posible que puede funcionar. Se puede escribir un objeto auxiliar del explorador para registrar Internet Explorer en la tabla de objetos en ejecución (ROT). Aquí se pueden realizar muchas implementaciones en función de cómo la aplicación determine la instancia de Internet Explorer con la que conectarse. Una solución posible: el objeto auxiliar del explorador, que tiene acceso al modelo de objetos de la instancia del Explorador que lo inició, determinaría si se trata de la instancia del explorador que debe registrarse en la tabla de objetos en ejecución.

La interfaz que le interesa al consumidor se puede registrar en el ROT con la función RegisterActiveObject y un CLSID ficticio que el consumidor reconocerá. Otra solución, que permitiría registrar varias instancias del explorador en el ROT, sería que el objeto asistente del explorador redactara un moniker Item basado en un GUID y un fragmento de datos únicos para cada instancia de Internet Explorer. El moniker se registraría en la ROT con el IRunningObjectTable::Register método . De nuevo, el consumidor tendría que saber cómo reconocer este moniker.

Referencias

Para obtener más información acerca del SDK de Windows Shell, vea Windows Shell.

Para obtener más información sobre los desarrolladores específicos de Internet Explorer, consulte Internet Explorer para desarrolladores.