hWndを元にInternetExplorerオブジェクトを生成できますか?

解決


へろ  2010-02-01 22:04:18  No: 102197

ある状況下で、ShellからInternetExplorerオブジェクトを取得できないのに、
IEのウインドウは存在するという状態があり、
この"IFrame"や"TabWindowClass"のhWndからInternetExplorerオブジェクトを取得したいと考えています。
hWndを元にしてInternetExplorerオブジェクトを生成することは可能でしょうか?
またhWndからではなくとも、InternetExplorerオブジェクトが得られるなら何でもかまいません。
いくつか手段があるようでしたらそれらもお教え頂けたら幸いです。
(後述しますが、実際Shellオブジェクトからでは取得不可能でした)

想定状況はかなり特殊で「explorer.exeが一度強制終了された後」というものです。
この状況下においてIEを取得したいのですが・・・どうしたものかと考えあぐねています。

状況の再現は、タスクマネージャから強制的にexplorer.exeを落とし、
同じくタスクマネージャから再びexplorerを一度呼び出すことで再現できるようです。
(XPではexplorerが強制終了された場合、多くの場合新たなexplorer.exeが起動し自動的に復旧します)

この条件下では、まずShellからでは正しく情報が取得できませんでした。
この条件下に入ってから新たに起動されたIEであればそのすべてを取得できるのですが、
以前のexplore.exeの際にすでに作成されていたIEウインドウに関してはひとつも列挙されませんでした。

このため現在は他の方向、EnumWindowsやEnumChildWindowsからアプローチできないか試行錯誤している最中です。
IEFrameとTabWindowsClassのウインドウハンドルが取得出来る所までしか至っていません。
(その配下にあると思われるShell DocObject ViewとInternet Explorer_ServerのhWndはまだ取得できていませんが、
  得られないのは私の知識不足が原因でおそらく適切なAPIを用いれば取得可能であろうと考えています)

仮にInternetExprorerオブジェクトが取れなくとも、最悪でも現在開いているURLが取得できればいいのですが・・・。
テストしている環境はXPSP3です。
いろいろとおかしな条件を付けて申し訳ありません。
Windowsの仕組みに理解が足りないためご迷惑をおかけするかと思いますが、どうかよろしくお願いします。


オショウ  2010-02-01 22:31:28  No: 102198

http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200810/08100020.txt

参考になりませんか?

以上。


へろ  2010-02-01 23:59:52  No: 102199

レスありがとうございます。
>参考になりませんか?
一応全文とリンク先を読んで参りましたが、
「起動されているIEを取得する話」ではなく「新規起動の話」に終始しているようでした。
また手がかりとなりそうな手法も残念ながら見当たりませんでした。

些細な追加情報なのですが、前述していた"Shell DocObject View"と"Internet Explorer_Server"について
hWndを取得する事が出来ました。EnumChildWindowsで普通に取得出来ました。
(単にコードの誤りで、わざわざ見つけていたものを弾いていただけでしたorz)

また念のため「望む結果が得られないコード」を書いておきます。

    Dim Obj As Object
    Dim ColIEList As New Collection
    For Each Obj In CreateObject("Shell.Application").Windows
        If TypeName(Obj.Document) = "HTMLDocument" Then
            ColIEList.Add Obj
        End If
    Next

このコードでは、explorerの強制終了前に開かれたIEを補足出来ません。
よろしくお願いします。


魔界の仮面弁士  2010-02-02 03:19:46  No: 102200

> この"IFrame"や"TabWindowClass"のhWndからInternetExplorerオブジェクトを取得したいと考えています。

『Internet Explorer_Server』のハンドルからで良ければ、
以下のようにして取得できます。

Public Function GetWebBrowser2(ByVal hWnd As Long) As SHDocVw.IWebBrowser2
    Dim document As HTMLDocument
    Dim pUnk As olelib.IUnknown

    Dim IID_IServiceProvider As UUID
    CLSIDFromString "{6D5140C1-7436-11CE-8034-00AA006009FA}", IID_IServiceProvider
    Dim IID_IWebBrowser2 As UUID
    CLSIDFromString "{D30C1661-CDAF-11D0-8A3E-00C04FC9E26E}", IID_IWebBrowser2
    Dim SID_SWebBrowserApp As UUID
    CLSIDFromString SIDSTR_SWebBrowserApp, SID_SWebBrowserApp

    Dim dom As MSHTML.IHTMLDocument
    Set dom = WindowDOM(hWnd)
    Set pUnk = dom.parentWindow
    Dim pService As IServiceProvider
    pUnk.QueryInterface IID_IServiceProvider, pService
    pService.QueryService SID_SWebBrowserApp, IID_IWebBrowser2, GetWebBrowser2
End Function

上記の WindowDOM 関数は、下記のサンプルにある物を利用しています。
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200904/09040020.txt

また、参照設定として、
  Microsoft Internet Controls (SHDOCVW.DLL)
  Microsoft HTML Object Library (MSHTML.TLB)
  Edanmo's OLE interfaces & functions v1.81 (OLELIB.TLB)
を加えています。OLELIB.TLB は、下記のライブラリです。
http://www.mvps.org/emorcillo/en/code/vb6/index.shtml


へろ  2010-02-02 23:07:49  No: 102201

レスありがとうございます。
>『Internet Explorer_Server』のハンドルからで良ければ 取得できます。
うわ、すごい答えが・・・!w
これは、クラス定義から含めてオブジェクトを自力で作っている・・・という事でしょうか?
正直コード自体の意味がさっぱり解りませんが、手が空き次第試して報告したいと思います。


へろ  2010-02-24 03:43:53  No: 102202

レスが大変遅くなり申し訳ありません。
(メンテ中だったためか、何度書き込んでもレスが出来ませんでした)

提示して頂いた方法で例の限定条件下でも補足できる事を確認しました。
とても参考になりました、本当にありがとうございました。
(遅まきながら解決チェックを付けさせて頂きました)

稚拙ながら出来上がったコードを提示したいと考えましたが、エラー処理やら判定処理をふんだんに盛り込んで長大なってしまったので控えさせて頂こうと思います。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加