- PR -

[解決]COMオブジェクトのコレクションのオブジェクトを事前バインディングしたい

1
投稿者投稿内容
YAS
ベテラン
会議室デビュー日: 2006/02/15
投稿数: 59
投稿日時: 2006-02-25 19:35
件名が難解で申し訳ありません。

mshtml.IHTMLDOMNodeインターフェイスのChildNodesプロパティはオブジェクト型の
プロパティです。中身はHTMLElementやTextNodeのコレクションです。
遅延バインディングなら下のようなコードでコレクションの要素にアクセスすること
ができますが,事前バインディングでコレクションの要素にアクセスするにはどう
したらよいのでしょうか。

コード:

Dim Node As mshtml.IHTMLDOMNode
Dim ChildNodes As Object

ChildNodes = Node.childNodes

For Each cNode As mshtml.IHTMLDOMNode In ChildNodes
 〜 処理 〜
Next

〜 COMオブジェクトの解放処理 〜



[ メッセージ編集済み 編集者: YAS 編集日時 2006-02-26 22:33 ]
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-02-25 23:20
[quote]
遅延バインディングなら下のようなコードでコレクションの要素にアクセスすること
ができますが,事前バインディングでコレクションの要素にアクセスするにはどう
したらよいのでしょうか。
[quote]

もともと IDispatch* を返してくるプロパティなので、Object 型以外に事前バインディングのしようがありません。

適切なインターフェース型、この場合は IHTMLDOMChildrenCollection かな?でキャストしてください。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
YAS
ベテラン
会議室デビュー日: 2006/02/15
投稿数: 59
投稿日時: 2006-02-25 23:52
渋木宏明(ひどり)様,ありがとうございます。
やりたかったことができました!
最初のコードだとOption Strict Onにするとエラーになるので困っていたのです。
「IHTMLDOMChildrenCollection」はヘルプで一覧の中に見えていたはずなのに,
言われるまで気がつきませんでした。

コード:
Dim Node As mshtml.IHTMLDOMNode
Dim ChildNodes As mshtml.IHTMLDOMChildrenCollection

ChildNodes = DirectCast(Node.childNodes, mshtml.IHTMLDOMChildrenCollection)

For Each cNode As mshtml.IHTMLDOMNode In ChildNodes
 〜 処理 〜
Next

〜 COMオブジェクトの解放処理 〜



バインディングについても教えて頂きありがとうございます。
今考えると質問の仕方が間違っていたと思います。
「childNodesが代入できるインターフェイスを教えてください」というのが
本質でした。

ところで,私は上のような状態になったことを「事前バインディング」ととらえて
いたのですが,違っていたのでしょうか...

でも,「In ChildNodes」のところは,前はObject型で,それがコレクション型か
どうかもわからなかったのに,今はコレクション型であることがわかっています。
ここのところは遅延バインディングから事前バインディングになったといえない
でしょうか。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-02-26 00:24
引用:

ところで,私は上のような状態になったことを「事前バインディング」ととらえて
いたのですが,違っていたのでしょうか...



前の登校でも書きましたが、chidlNodes プロパティは元々 IDispatch* 型なので、事前バインディングをしても Object 型になります。

引用:

でも,「In ChildNodes」のところは,前はObject型で,それがコレクション型か
どうかもわからなかったのに,今はコレクション型であることがわかっています。



「知識」として「コレクションを返すはずである」ことが分かったので、正しい型にキャストできただけだと思います。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-26 10:38
型を強く意識してコンパイル解決をある程度 (For Each ステートメントで) 図れているので、
Object 型をそのまま使うよりは良いでしょうね。

引用:

For Each cNode As mshtml.IHTMLDOMNode In ChildNodes
 〜 処理 〜
Next

〜 COMオブジェクトの解放処理 〜


本当にこのままのロジックであれば、ちょっと危険に思えます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
YAS
ベテラン
会議室デビュー日: 2006/02/15
投稿数: 59
投稿日時: 2006-02-26 12:16
渋木宏明(ひどり)様,じゃんぬねっと様,ありがとうございます。
引用:

「知識」として「コレクションを返すはずである」ことが分かったので、正しい型にキャストできただけだと思います。


引用:

型を強く意識してコンパイル解決をある程度 (For Each ステートメントで) 図れているので、Object 型をそのまま使うよりは良いでしょうね。


「正しい型にキャスト」「事前バインディング」「コンパイル解決」についてもう一度調べ,理解したいと思います。
引用:

本当にこのままのロジックであれば、ちょっと危険に思えます。


と,おっしゃいますのは...?

私がもしかして危険かもしれないと考えるのは,
・ChildNodesのコレクションの要素を1つ1つ解放する処理がない
・For Eachの要素にCOMオブジェクトを使っているがループの中で解放する処理がない
くらいなのですが,他に危険なところがありますでしょうか。

最初の質問から逸れてしまって申し訳ありません。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-26 21:20
引用:

YASさんの書き込み (2006-02-26 12:16) より:

私がもしかして危険かもしれないと考えるのは,
・ChildNodesのコレクションの要素を1つ1つ解放する処理がない
・For Eachの要素にCOMオブジェクトを使っているがループの中で解放する処理がない
くらいなのですが,他に危険なところがありますでしょうか。


それを「保証する」機構をプラスすると完璧ですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
YAS
ベテラン
会議室デビュー日: 2006/02/15
投稿数: 59
投稿日時: 2006-02-26 22:29
引用:

それを「保証する」機構をプラスすると完璧ですね。


重ねてご指導ありがとうございました。
じゃんぬねっと様の「C#, VB.NET 入門」をよく読んで
COMオブジェクトの解放について確認してみます。

1

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