インターネット エクスプローラーの実行中のインスタンスに接続する方法

警告

廃止され、サポート対象外となった Internet Explorer 11 デスクトップ アプリケーションは、特定のバージョンの Windows 10 で Microsoft Edge の更新プログラムを通じて完全に無効になります。 詳細については、「Internet Explorer 11 デスクトップ アプリの廃止に関する FAQ」をご覧ください。

SHDocVw.ShellWindows コレクションを使用して、インターネット エクスプローラーの実行中のインスタンスに接続できます。

元の製品バージョン:インターネット エクスプローラー
元の KB 番号: 176792

詳細

通常、アプリケーションはテーブルを使用して別のアプリケーションの実行中のインスタンスに Running Object 接続します。 インターネット エクスプローラーは実行中のオブジェクト テーブルに登録されないため、別のメソッドが必要です。

ShellWindows コレクションは、インターネット クライアント SDK で次のように説明されています。

ShellWindows オブジェクトは、シェルに属する開いているウィンドウのコレクションを表します。 実際、このコレクションには、インターネット エクスプローラーと、シェルに属するその他のウィンドウ (Windows エクスプローラーなど) への参照が含まれています。

次の Visual Basic コードは、 ShellWindows コレクションへの参照を取得します。 コレクションが列挙され、リスト ボックスに追加される各オブジェクトの LocationName 。 オブジェクトに関連付けられているドキュメントの種類が HTMLDocument (Web ページ) の場合、ページのタイトルが別のリスト ボックスに追加されます。

次のコードを実行するには、Microsoft Internet Controls (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++ ネイティブ COM サポートは、簡潔にするためにここで使用されます。

Shdocvw.dll への参照を追加し、プロジェクトにMshtml.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 Integration がインストールされていない場合や、インターネット エクスプローラーで新しいプロセスで [参照] が選択されている場合は機能しません。

これらの要因を制御できない場合でも、動作する可能性のある方法が 1 つあります。 ブラウザー ヘルパー オブジェクトを記述して、実行中のオブジェクト テーブル (ROT) にインターネット エクスプローラーを登録できます。 ここでは、接続するインターネット エクスプローラーのインスタンスをアプリケーションがどのように決定するかに応じて、多くの実装が可能です。 考えられる解決策の 1 つにすぎません。ブラウザー ヘルパー オブジェクトは、起動したエクスプローラーのインスタンスのオブジェクト モデルにアクセスできるため、これが実行中のオブジェクト テーブルに登録するブラウザーのインスタンスであるかどうかを判断します。

コンシューマーが関心を持つインターフェイスは、RegisterActiveObject 関数とコンシューマーが認識するダミー CLSID を使用して ROT に登録できます。 エクスプローラーの複数のインスタンスを ROT に登録できるようにするもう 1 つの解決策は、ブラウザー ヘルパー オブジェクトが、インターネット エクスプローラーの各インスタンスに固有の GUID とデータの一部に基づいて Item モニカーを作成することです。 モニカーは、 メソッドを使用 IRunningObjectTable::Register して ROT に登録されます。 ここでも、コンシューマーはこのモニカーを認識する方法を知る必要があります。

関連情報

Windows Shell SDK の詳細については、「 Windows Shell」を参照してください。

インターネット エクスプローラーに固有の開発者を提供する方法の詳細については、「開発者向けインターネット エクスプローラー」を参照してください。