Come connettersi a un'istanza in esecuzione di Internet Explorer

Avviso

L'applicazione desktop Internet Explorer 11, ritirata e fuori supporto, è stata disabilitata in modo permanente tramite un aggiornamento di Microsoft Edge su alcune versioni di Windows 10. Per altre informazioni, vedere Domande frequenti sul ritiro delle app desktop di Internet Explorer 11.

È possibile utilizzare l'insieme SHDocVw.ShellWindows per connettersi a un'istanza in esecuzione di Internet Explorer.

Versione originale del prodotto: Internet Explorer
Numero KB originale: 176792

Ulteriori informazioni

In genere, un'applicazione si connette a un'istanza in esecuzione di un'altra applicazione usando la Running Object tabella . Poiché Internet Explorer non si registra nella tabella degli oggetti in esecuzione, è necessario un altro metodo.

L'insieme ShellWindows è descritto in Internet Client SDK come indicato di seguito:

L'oggetto ShellWindows rappresenta un insieme delle finestre aperte che appartengono alla shell. Questa raccolta contiene infatti riferimenti a Internet Explorer e ad altre finestre appartenenti alla shell, ad esempio Esplora risorse.

Il codice Visual Basic seguente ottiene un riferimento all'insieme ShellWindows . L'insieme viene enumerato e locationName per ogni oggetto aggiunto a una casella di riepilogo. Se il documento associato all'oggetto è di tipo HTMLDocument (una pagina Web), il titolo della pagina viene aggiunto a un'altra casella di riepilogo.

Per eseguire il codice seguente, è necessario aggiungere un riferimento a Microsoft Internet Controls (Shdocvw.dll) e Microsoft HTML Object Library (Mshtml.dll) al progetto 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

In C++ una connessione può essere eseguita approssimativamente nello stesso modo. Il supporto COM nativo di Visual C++ viene usato qui per motivi di brevità.

Aggiungere riferimenti a Shdocvw.dll e Mshtml.dll al progetto:

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

Dichiarare un'istanza di un puntatore IShellWindows nella classe di visualizzazione:

SHDocVw::IShellWindowsPtr m_spSHWinds;

Creare un'istanza di un oggetto ShellWindows nel costruttore della visualizzazione:

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

Usare l'oggetto ShellWindows nella funzione OnInitialUpdate della visualizzazione:

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

Il metodo precedente per la connessione a un'istanza in esecuzione di Internet Explorer non funziona se l'integrazione shell non è installata o se l'opzione Sfoglia in un nuovo processo è selezionata in Internet Explorer.

Se questi fattori non possono essere controllati, esiste ancora un metodo possibile che può funzionare. È possibile scrivere un oggetto helper del browser per registrare Internet Explorer nella tabella degli oggetti in esecuzione . Esistono molte implementazioni possibili in questo caso a seconda di come l'applicazione deve determinare l'istanza di Internet Explorer con cui connettersi. Una sola possibile soluzione: l'oggetto helper del browser, con accesso al modello a oggetti dell'istanza di Explorer che l'ha avviata, determinerebbe se si tratta dell'istanza del browser che deve essere registrata nella tabella degli oggetti in esecuzione.

L'interfaccia a cui il consumer è interessato può essere registrata nel rot con la funzione RegisterActiveObject e un fittizio CLSID che il consumer riconoscerà. Un'altra soluzione, che consentirebbe la registrazione di più istanze di Explorer nel ROT, sarebbe quella di fare in modo che l'oggetto Helper browser comporsi un moniker Item basato su un GUID e una parte di dati univoci per ogni istanza di Internet Explorer. Il moniker verrà registrato nel rot con il IRunningObjectTable::Register metodo . Anche in questo caso, il consumer dovrebbe sapere come riconoscere questo moniker.

Riferimenti

Per altre informazioni su Windows Shell SDK, vedere Shell di Windows.

Per altre informazioni su fornisce sviluppatori specifici di Internet Explorer, vedere Internet Explorer per sviluppatori.