VBScritpでIEにConnectObjectしたい

解決


ワンダユウ  2007-09-09 21:28:48  No: 99409

VBScritpですでに起動しているInternet ExplorerにConnectObjectを設定し、イベントの取得をできるようにしたいのです。
しかし少し調べるとWSHのバグでIEには接続できないようなのです。
何か代替の方法はないものでしょうか?

よろしくお願いします。


あん  2007-09-10 18:57:05  No: 99410

>しかし少し調べるとWSHのバグでIEには接続できないようなのです。
根拠になるソースはありますか?
実際コードを書いて試しましたか?


ワンダユウ  2007-09-11 00:13:13  No: 99411

>根拠になるソースはありますか?
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list157.shtml
2006年 06月 03日 06時 18分 16秒 の記事

http://hyons.hp.infoseek.co.jp/scr/scr001.shtml

>実際コードを書いて試しましたか?
試しました。
他のオブジェクトには接続できるのに、IEの場合だけ「接続できません」とエラーがでます。


あん  2007-09-11 18:11:27  No: 99412

失敗するというソースは出せないの?


ワンダユウ  2007-09-11 19:20:11  No: 99413

>失敗するというソースは出せないの?
なぜ失敗するかとかは聞いてませんよ、代替の方法があるかを質問しているんです。
某掲示板からの流用ですが、一応コード張っておきます。

Set Shell = CreateObject("Shell.Application")
Set ies = Shell.Windows
Found = False

For Each ie In ies
     If TypeName(ie.Document) = "HTMLDocument" Then
          Found = True
    WScript.ConnectObject ie, "ie_"
          Exit For
     End If
Next

If Not Found Then
     WScript.Quit
End If

ie_OnQuitCalled = False
Do While True
     WScript.Sleep 100
     If ie_OnQuitCalled Then
          WScript.Quit
     End If
Loop

Function ie_OnQuit
     MsgBox "ie_OnQuit"
     ie_OnQuitCalled = True
End Function


K.J.K.  2007-09-11 19:58:06  No: 99414

なぜ失敗するのか、は、IProvideClassInfoを備えていないから、
だったと思います。

で、あんさんの言ってることは、再現できるコードを提示してくれ、
ということであって、「なぜ」を尋ねてはいないでしょう。

で、VBScript単体じゃ難しいのではないか、とは思います。
代わりに同様の作業をしてくれるオブジェクトも一般的には
見当たらないようですし。

もちろん、そういう作業をするオブジェクトを独自に作る、という
手はありますが、それはVBScript以外の多言語で行うものでしょうし。


ワンダユウ  2007-09-12 00:07:14  No: 99415

>なぜ失敗するのか、は、IProvideClassInfoを備えていないから、
だったと思います。
で、あんさんの言ってることは、再現できるコードを提示してくれ、
ということであって、「なぜ」を尋ねてはいないでしょう。

そうですね、でも質問はあくまでも代替方法があるか?
ですから再現するソースを提示する必要はないですよね。

>で、VBScript単体じゃ難しいのではないか、とは思います。

はい、難しいと思います。
でも前にとあるサイトでVBScriptで実行できたという話を読んだので、おそらく方法はあると思います。
ただ残念ながらそのサイトがすでに消えてしまっているんです。


K.J.K.  2007-09-12 01:33:52  No: 99416

提示された掲示板の内容を読む限りは、ラッピングするクラスである
"WrapWithClassInfo"は他の言語で作られているように読めますが、
どうなんでしょうね。作成者のAKAさんが他に作ったものには
"WSH互換スクリプトホスト"もありますが、これはスクリプトで作った
とは考えにくいですし。

で、再現するソースが提示されないと、ほとんどの人は関わる気には
ならないでしょう。また、意味の取り違えを防ぐ、という意味合いも
ありますし。


魔界の仮面弁士  2007-09-12 02:11:11  No: 99417

IProvideClassInfo という話は、私の専門外なので、よくわかりませんが、
VBScript から IE を制御するときって、
> ConnectObject
を使ってイベント割り当てをするのではなく、
CreateObject の第二引数を使って制御する必要がありますよね。
ですから、そのままでは無理な気がします。

> 何か代替の方法はないものでしょうか?
監視対象が OnQuit イベントだけなら、WMI の Win32_Process クラスで
代替してみては如何でしょう。


スクリプトプログラマ  2007-09-12 02:46:03  No: 99418

>魔界の仮面弁士 2007/09/11(火) 17:11:11 <常連> 
>> ConnectObject
>を使ってイベント割り当てをするのではなく、
>CreateObject の第二引数を使って制御する必要がありますよね。

なので、ConnectObjectするのでなく、
CreateObjectしたieに元のieの情報をセットして、元のieを消すとか?

>監視対象が OnQuit イベントだけなら、WMI の Win32_Process クラスで
>代替してみては如何でしょう。

ieの終了でプロセスが終了するとは限らないので、
TypeName(ie)の変化を監視でしょうね。

いずれにせよ、ieのeventはVBScriptでByRef引数の設定ができないなど
無理があるので、いろいろやるならVBでしょう。


K.J.K.  2007-09-12 03:14:51  No: 99419

ちなみに、元に質問された場所では、既に回答が出ています。
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/index.shtml

で、それはそれとして、IEのイベント関連の話ですが、VBでも
捕らえきれないものがあったような。NewWindow3やWindowStateChanged
イベントは取り扱えませんよね。こういう点ではむしろVBScriptのが
有利かも。


ワンダユウ  2007-09-14 17:42:34  No: 99420

皆様ありがとうございました。

他掲示板で教えてもらったのですが、
GetRef関数を使用することで、IE内部のhmlイベントにはConnectできました。


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

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






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