[VB.net]WebBrowser内のすべての要素を参照するには

解決


チェリー  2007-01-01 17:05:09  No: 97582

初めて書き込みます。よろしくお願いいたします。
WebBrowserに読み込んだ要素をすべて参照したいのですが、
どうしてもうまく行きません。

http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200309/03090009.txt

↑現在こちらの魔界の仮面弁士さんの「2003/09/04(木) 12:10:30」を参考に
以下のようなコードを実行しています。

  Dim objDocument As Object     'As mshtml.HTMLDocument
  Dim objForm As Object     'As mshtml.HTMLFormElement
  Dim objElements As Object     'As mshtml.IHTMLElementCollection
  Dim objElement As Object

  objDocument = WB1.Document

  objForm = objDocument.forms(0)
  objElements = objForm.elements
  For Each objElement In objElements
    TestText.Text = TestText.Text & vbCr & objElement.tagName
  Next

このコードを実行すると、以下のエラーが出てしまうのです。
「'System.Runtime.InteropServices.MarshalDirectiveException' のハンドルされていない例外が mscorlib.dll で発生しました。

追加情報 : マーシャラの制約 : 文字列が長すぎます。」

なお、バージョンは .net 2003 です。
新年早々の質問で申し訳ありませんが、どなたかご教授よろしくお願いいたします。


ヤマ@文系  2007-01-02 10:36:54  No: 97583

この例外自体よくわからないのですが、
WB1がaxWebbrowserだとすると
他におかしなところは、
vbCrかなと思うので、
vbcrをvbcrlfにしてみてください。


チェリー  2007-01-02 12:53:38  No: 97584

ヤマ@文系さん、ご返答ありがとうございます。
ご指摘のようにvbCrをvbcrlfに変更してみましたが、同じエラーがでる状況です。
WB1は AxSHDocVw.AxWebBrowser です。

最初に書き込み忘れてしまったのですが、例外エラーがでるのは
For Each objElement In objElements
↑この行です。
テストのために開いているのはヤフーのトップページです。

VBに関しては、学校や教科書的な学習をしておらず、色々なサイトを参考に
見よう見まねでアプリケーションを作っているので、もしかしたらものすごく
基本的なところで誤ったことをやらかしているのかもしれません・・・


YAS  2007-01-02 19:01:14  No: 97585

解決策ではなくて申し訳ありませんが...

VB2005ですが,AxWebBrowser(WebBrowserコントロールではなく)を使って
上のコードをそのまま試しましたが動作しました。
(Yahoo!のトップページで試したらTextBoxに「INPUT」がたくさん表示され
  ました。)


ヤマ@文系  2007-01-03 04:46:55  No: 97586

2003でテストしてみました。
objForm = objDocument.forms(0)
というようには取れなくて
objform=objdocument.forms.item(0)
という感じになると思います。

        Dim objDocument As mshtml.HTMLDocument
        Dim objForm As mshtml.HTMLFormElement
        Dim objElement As Object

            objDocument = AxWebBrowser1.Document

            objForm = objDocument.forms.item(0)

            For Each objElement In objForm.all

                TestText.Text = TestText.Text & vbCrLf & 
            Next


ヤマ@文系  2007-01-03 04:47:46  No: 97587

TextBox1.Text = TextBox1.Text & vbCrLf & objElement.tagName
です。
すいません。


チェリー  2007-01-03 15:32:01  No: 97588

YASさん、VB2005での検証をどうもありがとうございます。

ヤマ@文系さん、教えていただいたコードで動きました。
本当にどうもありがとうございます。

これはVBのバージョンの違いで、オブジェクトの階層の持ち方が
異なるということなのでしょうか?
確かにネット上で見つけたコードをそのまま実行すると
例外エラーが発生することはこれまでにも何度かありました。

もしよろしければ、皆さんはこういった問題にどう対処しているのか
お尋ねしたいのですが、この掲示板では場違いな話題でしょうか・・・。
ヤマ@文系さんはどのような調べ方で上記のきちんと動作するコードに
たどり着きましたか?

VBやVB.netは、やりたいこと別にコードを調べるサイトもたくさんあるし、
私のような初心者が躓いたときに親切にサポートしてくださるこちらのような
掲示板も発達していて、プログラムの作法に必要以上に縛られることなく
「こういうアプリケーション作りたい!」という気持ちで作ることのできる
楽しい言語と認識しています。
その反面、C言語等のような体系的な学習がなかなかできず、
私に関していえば今回のような問題に突き当たったときには
「コードを少しずつ変更しては実行」「ネットで検索」「ネットで質問」
といった対処法しか持ち合わせていない状態です。

そろそろ次のステップ(が何かはわからないのですが)に進みたいのに
とっかかりがつかめずにいる感じ・・・。
なんだかうまく言えず、抽象的な長文になってしまって申し訳ありません。
もしも何かとっかかりを教えていただけると嬉しいです。


ヤマ@文系  2007-01-03 23:03:31  No: 97589

私自身も独学なので体系的に勉強しておらず
体系的に勉強したいと思っていました。
あまりDHTMLについて書かれている本など
は見かけたこと無いです。
(今回はVB6だと実現できたけど.netだとうまくいかないパターン?)

MSDNやサンプルコードなどを最初に探してみて
色々組み合わせてみました。
型をmshtml.HTMLFormElementにしたところ
forms(0)だとプロパティがないということなので、
forms.item(0)というサンプルコードをどこかで見つけて
変更してみました。

DHTMLなどDOM関係はVBに限定しなければかなりサンプルが多いと思います
form.allというのは以前作っていたときにとりあえず
allからアクセスする習慣がついていたためで、
それも、とりあえずallオブジェクトから参照していく方法が
どこかに書いてあったからテストしたと思います。
いきなり成功してはおらず、数回失敗しました^^;

「コードを少しずつ変更しては実行」「ネットで検索」「ネットで質問」
ということ自体間違っていないと思います。
体系的に解説されていない分野も多いので体系的なものがほしくなります。
私も体系的に勉強したいと思っていましたが、今のところできていません。
そんなときに掲示板で質問してみて、
みなさん、色々お付き合いいただいたのがきっかけで
回答もするようになりました。
(よく間違えて、フォローしてくださったりと
勉強になっています)

MSDNやヘルプや他のサイトのサンプルなどで
その都度調べることができるのが次のステップなのかもしれません。
私自身初心者でよくわかりませんが。

MSDNのDHTMLのリファレンス
'http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpisdk/dhtml/references/dhtmlrefs.asp


チェリー  2007-01-06 16:26:38  No: 97590

ヤマ@文系さん、丁寧なご返答をどうもありがとうございます。
私と似た状況にある方もいらっしゃると聞いて、
なんだか心強い気がします。

確かにMSDNという公式なリファレンスをきちんと使いこなせるようになるのは
とても重要なことですよね。
(これまで、文章のわかりにくさや「このページは移動しました」が多数存在するなどの使いにくさから敬遠しがちでした・・・反省)

私もこの掲示板で他の方の質問に答えられるレベルを目指して勉強してみたいと思います。
お互いにがんばっていきましょうね!


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

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






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