如何連線到 Internet Explorer 的執行中實例

警告

已淘汰、不受支援的 Internet Explorer 11 傳統型應用程式已於特定 Windows 10 版本透過 Microsoft Edge 更新永久停用。 如需詳細資訊,請參閱 Internet Explorer 11 傳統型應用程式淘汰常見問題集 (英文)。

您可以使用 SHDocVw.ShellWindows 集合來連線到執行中的 Internet Explorer 實例。

原始產品版本: Ie
原始 KB 編號: 176792

其他相關資訊

一般而言,應用程式會使用 資料表連接到另一個應用程式的執行中實 Running Object 例。 由於 Internet Explorer 不會在執行中的對象數據表中註冊本身,因此需要另一個方法。

ShellWindows 集合會在 Internet Client SDK 中描述,如下所示:

ShellWindows 物件代表屬於殼層之開啟視窗的集合。 事實上,此集合包含 Internet Explorer 的參考,以及其他屬於殼層的視窗,例如 Windows 檔案總管。

下列 Visual Basic 程式代碼會取得 ShellWindows 集合的參考。 集合會列舉,而且每個物件的 LocationName 都會新增至清單框。 如果與對象相關聯的檔類型為 HTMLDocument (網頁) ,則頁面的標題會新增至另一個清單框。

若要執行下列程式代碼,必須將 Microsoft 因特網控件 (Shdocvw.dll) 和 Microsoft HTML 物件庫的參考 (Mshtml.dll) 至 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

在 C++ 中,連線的完成方式大致相同。 為了簡潔起見,這裡使用Visual C++ Native COM支援。

將參考新增至 專案Shdocvw.dllMshtml.dll

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

在您的檢視類別中宣告 IShellWindows 指標的實例:

SHDocVw::IShellWindowsPtr m_spSHWinds;

在檢視的建構函式中建立 ShellWindows 物件的實例:

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

在檢視的 OnInitialUpdate 函式中使用 ShellWindows 物件:

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

如果未安裝 Shell 整合,或是在 Internet Explorer 中選取 [在新 進程中流覽 ],則連線到執行中 Internet Explorer 實例的先前方法將無法運作。

如果無法控制這些因素,仍有一個可能的方法可以運作。 瀏覽器協助程式物件可以寫入,以在執行中的對象數據表中註冊 Internet Explorer (ROT) 。 根據應用程式如何判斷要連線的 Internet Explorer 實例,這裡可能會有許多實作。 只有一個可能的解決方案:瀏覽器協助程式物件可以存取啟動它之 Explorer 實例的物件模型,可判斷這是否為應在執行中對象數據表中註冊的瀏覽器實例。

取用者感興趣的介面可以在 ROT 中向 RegisterActiveObject 函式註冊,以及取用者將辨識的虛擬 CLSID。 另一個可讓多個檔案總管實例在 ROT 中註冊的解決方案,是讓 Browser Helper 對象根據 GUID 撰寫 Item Moniker,以及每個 Internet Explorer 實例唯一的數據片段。 Moniker 會使用 方法在 ROT IRunningObjectTable::Register 中註冊。 同樣地,取用者必須知道如何辨識此Moniker。

參考資料

如需 Windows Shell SDK 的詳細資訊,請參閱 Windows Shell

如需提供 Internet Explorer 專屬開發人員的詳細資訊,請參閱 適用於開發人員的 Internet Explorer