Cómo conectarse a una instancia en ejecución de Internet Explorer
Importante
La aplicación de escritorio Internet Explorer 11 está retirada y sin soporte a partir del 15 de junio de 2022 para determinadas versiones de Windows 10.
Todavía puede acceder a sitios antiguos heredados que requieren Internet Explorer con el modo Internet Explorer en Microsoft Edge. Obtenga más información.
La aplicación de escritorio Internet Explorer 11 se redirigirá progresivamente al explorador Microsoft Edge, más rápido y seguro. En última instancia, se deshabilitará a través de Windows Update. Deshabilite IE hoy.
Puede usar la colección SHDocVw.ShellWindows para conectarse a una instancia en ejecución de Internet Explorer.
Versión del producto original: Internet Explorer
Número 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 de la siguiente manera:
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 otras ventanas que pertenecen al shell, como Windows Explorer.
El siguiente Visual Basic obtiene una referencia a la colección ShellWindows. La colección se enumera 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 biblioteca de objetos HTML de Microsoft (Mshtml.dll) al proyecto 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 puede realizarse aproximadamente de la misma manera. Visual C++ Native COM Support se usa aquí en aras de la brevedad.
Agregue referencias aShdocvw.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 Examinar en un nuevo proceso está seleccionado 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). Hay muchas implementaciones posibles en función de cómo la aplicación determine la instancia de Internet Explorer con la que conectarse. Solo una solución posible: el objeto auxiliar del explorador, que tiene acceso al modelo de objetos de la instancia de Explorer 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 puede registrarse en la 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 la ROT, sería hacer que el objeto Auxiliar del explorador redacte 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 reconocer este moniker.
Referencias
Para obtener más información acerca Windows SDK del Shell, vea Windows Shell.
Para obtener más información sobre cómo proporciona desarrolladores específicos de Internet Explorer, vea Internet Explorer para desarrolladores.