- PR -

InternetExplorerとHTMLDocumentについて

1
投稿者投稿内容
Collon
会議室デビュー日: 2004/03/07
投稿数: 12
投稿日時: 2006-03-28 00:39
VB.netよりShell.Applicationを用いて、その時点開いているウインドウの数分ループさせてWindowオブジェクトごとのDocumentを見比べてInternetExplorerを発見しようとしているのですが、なぜかIEのDocumentがHTMLDocumentを返さず、Explorerと同じComObjectとなります。
何かご存知の方いらっしゃいましたら、ご教授お願い致します。
loshell = CreateObject("Shell.Application")
lowindows = CallByName(loshell, "Windows", CallType.Method)
For liCnt = 0 To CInt(CallByName(lowindows, "Count", CallType.Get)) - 1

loexp = CallByName(lowindows, "Item", CallType.Get, liCnt)

lodocument = CallByName(loexp, "Document", CallType.Get)

If lodocument.GetType().Name Like "HTMLDocument*" Then
End IF
NEXT
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-03-28 01:02
.NET から見たレイトバインディングの COM オブジェクトってのはそんなもんです。
判断は Document じゃなくて FullName プロパティあたりで行うべきでしょう。

あと、COM オブジェクトの参照がだだ漏れですが、 Marshal.ReleaseComObject は大丈夫ですか?

[ メッセージ編集済み 編集者: Hongliang 編集日時 2006-03-28 01:02 ]
YAS
ベテラン
会議室デビュー日: 2006/02/15
投稿数: 59
投稿日時: 2006-03-28 03:12
Collonさん,こんばんは。
私は遅延バインディングはOption Strict Off派です。
Collonさんのとほとんど同じ処理ですが,以下のコードでうまくいきました。
(ListBoxにリストアップするコードです)

コード:

ListBox1.Items.Clear()
Dim Shell As Object = Nothing
Dim Windows As Object = Nothing
Try
Shell = CreateObject("Shell.Application")
Windows = Shell.Windows
For Each Obj As Object In Windows
If DirectCast(Obj.ReadyState, Integer) >= WebBrowserReadyState.Interactive Then
Dim Document As Object = Nothing
Try
Document = Obj.document
If TypeName(Document) Like "HTML*" Then
ListBox1.Items.Add(Obj.document.url)
End If
Finally
If Document IsNot Nothing Then Marshal.ReleaseComObject(Document)
End Try
End If
If Obj IsNot Nothing Then Marshal.ReleaseComObject(Obj)
Next
Finally
If Windows IsNot Nothing Then Marshal.ReleaseComObject(Windows)
If Shell IsNot Nothing Then Marshal.ReleaseComObject(Shell)
End Try



[ メッセージ編集済み 編集者: YAS 編集日時 2006-03-28 03:16 ]

[ メッセージ編集済み 編集者: YAS 編集日時 2006-03-28 03:16 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-28 07:22
ReleaseComObject パターンは、コードを書くのも面倒でしょうから、
こちらでもリンクしておいてください。(;^-^)

  COM オブジェクトを解放する

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Collon
会議室デビュー日: 2004/03/07
投稿数: 12
投稿日時: 2006-03-29 00:23
Hongliangさん、YASさん、じゃんぬねっとさんご回答ありがとうございます。
参考にコードの記述させて頂きます。

>COM オブジェクトの参照がだだ漏れですが、 Marshal.ReleaseComObject は大丈夫で すか?

すみません、Comオブジェクトの開放の記述の方は、ここへの記載は省かせていただきました。実際の機能には記述しております。(載せて頂いたサイトは、機能作成の際、私も参考にさせて頂きました)

話は変わるのですが、私の方で、いろいろと動作検証を行なっていたところ、
.NETをインストールしている環境において、私の記述で作成したものを実行すると
lodocument.GetType().Nameが「HTMLDocument」を取得しているのですが、
その環境から、.NETをアンインストールして同じものを再度実行すると
「_ComObject」となります。
この動きについて何かご存知ありませんでしょうか。
.NETが入っていない環境でも、「HTMLDocument」とするための
なにかを設定・インストールしなければならないのでしょうか。
ご意見宜しくお願い致します。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-29 07:18
引用:

Collonさんの書き込み (2006-03-29 00:23) より:

話は変わるのですが、私の方で、いろいろと動作検証を行なっていたところ、
.NETをインストールしている環境において、私の記述で作成したものを実行すると
lodocument.GetType().Nameが「HTMLDocument」を取得しているのですが、
その環境から、.NETをアンインストールして同じものを再度実行すると「_ComObject」となります。


TypeOf 〜 Is でもダメでしょうか?

というより、とりあえず System.Type.Name を使うのはやめましょう。
コンパイル解決できる TypeOf 〜 Is を使うべきです。
TypeName についても同様のことが言えます。
型の検証であって、文字列の検証ではないはず...

CallByName もコンパイル解決できていないので、おすすめしません。
遅延バインディングに関しても同様です。
変数の型が明記されている場所がないですが、型は明示化されていますか?

このプログラムは、その型のインスタンスが生成される保証がありません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-03-29 10:20
引用:

その環境から、.NETをアンインストールして同じものを再度実行すると
「_ComObject」となります。
この動きについて何かご存知ありませんでしょうか。



mshtml 用の PIA が外れちゃったのかな?

.NET Framework SDK を上書きインストールすると回復したりはしないですかね?
Collon
会議室デビュー日: 2004/03/07
投稿数: 12
投稿日時: 2006-03-30 13:15
レス遅くなりまして、すみません。
じゃんぬねっとさん、渋木宏明(ひどり)さん新たにご意見ありがとうございます。

>.NET Framework SDK を上書きインストールすると回復したりはしないですかね?

インストールして動作検証してみましたが、変化はありませんでした。


>コンパイル解決できる TypeOf 〜 Is を使うべきです。

TypeOf 〜 Is で記述してみます。


>変数の型が明記されている場所がないですが、型は明示化されていますか?

変数は、
    Dim loshell As Object
Dim lowindows As Object
Dim loexp As Object
Dim loexecution As Object
Dim lodocument As Object
Dim lolocationName As Object 
と一応定義はしています。(記載もれしてました。すみません。)
1

スキルアップ/キャリアアップ(JOB@IT)