表1 IE'enの主な機能

IE'enのプログラム・コード

 IE'enはリモートPC上のIEと接続し,IEが現在アクセスしているURLリストを表示したり,Webサイトに送信したデータを取得する機能を提供する。ここではIE'enが提供する主な機能について,実現するためのソースコードを紹介する。IE'enが提供する主な機能は,表1[拡大表示]の通りである。

 以下では,表1の機能を実現する方法を,サンプル・プログラムを示しながら説明していこう。

URLの取得

リスト2 リモートPC上でShellWindowsコンポーネントを起動し,IShellWindowsインタフェースへの参照を取得するコード
 IEはIWebBrowser2という名前のCOMインタフェースを実装している。IE'enは,リモートPC上のIE(遠隔操作するIE)からこのインタフェースへの参照を取得してデータを得る。IWebBrowser2インタフェースを取得するには,ShellWindowsという名前のCOMコンポーネントを,遠隔操作するリモートPC上で起動する必要がある。ShellWindowsもまたCOMコンポーネントで,IShellWindowsインタフェースを提供する。IShellWindowsインタフェースは,PC上で現在開かれているIEウインドウのリストを提供する機能を提供する。

リスト2[拡大表示]は,リモートPC上でShellWindowsコンポーネントを起動し,IShellWindowsインタフェースへの参照を取得するためのコードである。最初にCOSERVERINFO構造体を作成する。これはあとに続くCoCreateInstanceExの引数としてリモートPCのIPアドレスをセットするための構造体である。CoCreateInstanceExは,COMコンポーネントを起動するためのAPIである。最初の引数には,起動したいCOMコンポーネントを特定するクラスIDを設定する。MULTI_QIは,インタフェースへの参照を受け取るための構造体である。

 次に,起動したIShellWindowsインタフェースを使用して,IWebBrowser2インタフェースを取得する。リスト3[拡大表示]に示すコードでは,最初にget_Countメソッドを使ってリモートPC上に存在するIEウインドウの数を取得し,次にItemメソッドによりIEのIWebBrowser2インタフェースを取得している。なお,Itemメソッドの引数として渡すIDispachインタフェースは,IWebBrowser2インタフェースの上位インタフェースであり,以下に続くQueryInterfaceメソッドによりIWebBrowser2インタフェースへの変換を行っている。

 IWebBrowser2インタフェースには,IEを制御するためのさまざまなメソッドがメンバーとして存在する。IEのウインドウが現在表示しているWebページのURLを取得するには,get_LocationNameメソッドを使用する(リスト4[拡大表示])。

リスト3 IShellWindowsインタフェースを使用して,IWebBrowser2インタフェースを取得するコード
リスト4 IEのウインドウが現在表示しているWebページのURLを取得するコード

Cookie情報およびHTML文書の内容の取得

 IEがWebサイトから受信したCookie情報やHTML文書そのものにアクセスする方法を紹介する。

 IEがWebサイトから受信した情報は,IEによってIHTMLDocument2インタフェースを実装するCOMコンポーネントのインスタンスとして保持されている。IEからIHTMLDocument2インタフェースを取得するには,IWebBrowser2インタフェースのメンバー・メソッドの一つである,get_Documentメソッドを使用する(リスト5[拡大表示])。

 IHTMLDocument2インタフェースは,get_Cookieという名前のメンバー・メソッドを持つ。Cookie情報を取得するには,単純にこのget_Cookieメソッドを呼び出せばよい(リスト6[拡大表示])。

 HTML文書の内容にアクセスするには,少し複雑な手続きが必要だ。HTML文書中の各要素は,IHTMLElementインタフェースを実装するCOMコンポーネントのインスタンスの集合として保持されている。このうち,<body>タグに囲まれた部分を取り出すには,リスト7[拡大表示]のようにIHTMLDocumentインタフェースのget_bodyメソッドを使用してIHTMLElementインタフェースへの参照を取得し,次にget_outerHTMLメソッドを使用して,この<body>タグで囲まれたHTML文書の内容を文字列化する。

リスト5 IEからIHTMLDocument2インタフェースを取得するコード
リスト6 Cookie情報を取得するコード
リスト7 HTML文書の<body>タグに囲まれた部分を取り出すコード

IEがWebサイトへ送信するデータの取得

 IEはブラウズ先のURLが変更される際に,イベントを発行する。このイベントを受信するためには,アプリケーション内でイベントを受信するためのインタフェースを実装するCOMコンポーネントをイベント・ハンドラとしてインスタンス化し,このインタフェースへの参照をリモートPC上のIEに提供する必要がある(図3[拡大表示])。

 Microsoftは,IEが発行するイベントを受け取るためのインタフェースとして,DWebBrowserEventsという名前のCOMインタフェースを定義している。このインタフェースは表2[拡大表示]のようなメンバー・メソッドを持つ。

 IEはURLが変更されたときにイベント・ハンドラのBeforeNavigateメソッドを呼び出す。メソッドの引数として新しいブラウズ先のURLとPOSTパラメータが渡される(リスト8[拡大表示])。

 リモートPC上のIEに対して,イベント・ハンドラのDWebBrowserEventsインタフェースを提供するためのコードをリスト9[拡大表示]に示す。最初に,先に取得したIWebBrowser2インタフェースを使用して,IConnectionPointContainerインタフェースを取得する。次にFindConnectionPointメソッドを使用して,DWebBrowserEventsインタフェースを提供するためのコネクション・ポイント(IConnectionPointインタフェースへの参照)を取得する。最後に,イベント・ハンドラのインスタンスを作成し,このイベント・ハンドラのIDispatchインタフェースへの参照を,IConnectionPointインタフェースのAdviseメソッドを使用して,IEに提供する。

図3 イベントの受信
表2 DWebBrowserEventsインタフェースが持つメンバー・メソッド
リスト8 BeforeNavigateメソッドにブラウズ先のURLとPOSTパラメータを渡す
リスト9 リモートPC上のIEに対してイベント・ハンドラのDWebBrowserEventsインタフェースを提供するコード

ブラウズページの変更

 IEがブラウズページを制御するには,単純にIWebBrowser2インタフェースのNavigateメソッドを呼び出せばよい。引数にURL文字列を渡してやると,IEはそのURLの示すWebページにジャンプする。

リスト10 新しいIEのウインドウを作成するコード

IEウインドウの可視・不可視

 IWebBrowser2インタフェースのset_Visibleメソッドを,引数にfalseを与えて呼び出すと,リモートPC上のIEのウインドウを見えなくすることができる。逆に,trueを渡すと見えなくなったウインドウが再表示される。

新しいウインドウの作成

 新しいIEのウインドウを作成するには,ShellWindowsコンポーネントを起動するときに使用したCoCreateInstanceEx APIを使う。第1引数に,IEのクラスIDを与えて呼び出せばよい(リスト10[拡大表示])。