Internet Explorer の実行中のインスタンスに接続する方法
警告
廃止され、サポート対象外となった Internet Explorer 11 デスクトップ アプリケーションは、特定のバージョンの Windows 10 で Microsoft Edge の更新プログラムを通じて完全に無効になります。 詳細については、「Internet Explorer 11 デスクトップ アプリの廃止に関する FAQ」をご覧ください。
SHDocVw.ShellWindows コレクションを使用して、Internet Explorer の実行中のインスタンスに接続できます。
元の製品バージョン: Internet Explorer
元の KB 番号: 176792
詳細
通常、アプリケーションは、 Running Object
テーブルを使用して、別のアプリケーションの実行中のインスタンスに接続します。 Internet Explorer は実行中のオブジェクト テーブルに自身を登録しないため、別のメソッドが必要です。
ShellWindows コレクションは、インターネット クライアント SDK で次のように説明されています。
ShellWindows オブジェクトは、シェルに属する開いているウィンドウのコレクションを表します。 実際、このコレクションには、 Internet Explorer および Windows エクスプローラーなどのシェルに属する他のウィンドウへの参照が含まれています。
次の Visual Basic コードは、 ShellWindows コレクションへの参照を取得します。 コレクションが列挙され、リスト ボックスに追加された各オブジェクトの LocationName 。 オブジェクトに関連付けられているドキュメントの種類が HTMLDocument (Web ページ) の場合、ページのタイトルが別のリスト ボックスに追加されます。
次のコードを実行するには、Visual Basic プロジェクトに Microsoft Internet Controls (Shdocvw.dll) および Microsoft HTML オブジェクト ライブラリ (Mshtml.dll) への参照を追加する必要があります。
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());
}
}
}
}
Internet Explorer の実行中のインスタンスに接続する前の方法は、シェル統合がインストールされていない場合、または新しいプロセスで Browse が選択されている場合は機能しません。
これらの要因を制御できない場合でも、動作する可能性のある方法が 1 つあります。 ブラウザー ヘルパー オブジェクトを記述して、Internet Explorer を実行中のオブジェクト テーブル (ROT) に登録できます。 アプリケーションが接続先の Internet Explorer のインスタンスを決定する方法に応じて、多くの実装が可能です。 考えられる解決策の 1 つに過ぎません。ブラウザー ヘルパー オブジェクトは、起動した Explorer のインスタンスのオブジェクト モデルにアクセスできるため、これが実行中のオブジェクト テーブルに登録する必要があるブラウザーのインスタンスであるかどうかを判断します。
コンシューマーが関心を持つインターフェイスは、RegisterActiveObject 関数とコンシューマーが認識するダミー CLSID を使用して ROT に登録できます。 エクスプローラーの複数のインスタンスを ROT に登録できるようにするもう 1 つの解決策は、ブラウザー ヘルパー オブジェクトに、Internet Explorer の各インスタンスに固有の GUID とデータに基づくアイテム モニカーを作成することです。 モニカーは、 IRunningObjectTable::Register
メソッドを使用して ROT に登録されます。 ここでも、コンシューマーはこのモニカーを認識する方法を知っている必要があります。
関連情報
Windows シェル SDK の詳細については、「 Windows シェル」を参照してください。
Internet Explorer に固有の開発者向けの詳細については、「 開発者向けInternet Explorer」を参照してください。