DOBON.NET DOBON.NETプログラミング掲示板過去ログ

メソット・引数のエラーにつきまして

環境/言語:[Windows XP]
分類:[.NET]

htmlファイルサイズの取得の定数の宣言につきましては、
ご指導して頂き解決する事ができました。
申し訳有りませんが同サンプルプログラムについて
引き続き投稿させてもらいました。宜しくお願い致します。

エラーになります。
@ABはAs Char に対する引数が多すぎます。
@INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0
A"http://www.goo.ne.jp/", "Accept: */*", -1, INTERNET_FLAG_DONT_CACHE, 0
BvbNullString, 0, hConn, 0
CはHttpQueryInfo  式はメソットではありません。

いろいろ行ってみましたが、4個のエラーになります。
.NETの覚え中でありますので基本的な事も身についてい無いところが有ります。
何か考えられる事がありましたら、ご指導して頂ければと願います。
宜しくお願いいたします。


Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Const cAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"

Dim hINet As Long
Dim hConn As Long
Dim nSize As Long
Dim nLen As Long
Dim Buf() As Byte
Dim HttpSendRequest As String
Dim HttpQueryInfo As String
Dim InternetOpenUrl As String
Dim InternetOpen As String

Const INTERNET_OPEN_TYPE_DIRECT As Long = 1 'すべてのホスト名をローカルに解決する。
Const INTERNET_FLAG_NO_CACHE_WRITE = &H4000000 ' don't write this item To the cache
Const INTERNET_FLAG_DONT_CACHE = INTERNET_FLAG_NO_CACHE_WRITE
Const HTTP_QUERY_FLAG_NUMBER = &H20000000
Const HTTP_QUERY_CONTENT_LENGTH = 5
Const INTERNET_FLAG_RELOAD = &H80000000 ' retrieve the original item

@ hINet = InternetOpen(cAgent, INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0)
  A  hConn = InternetOpenUrl(hINet, "http://www.goo.ne.jp/", "Accept: */*", -1, INTERNET_FLAG_DONT_CACHE, 0)
B If HttpSendRequest(hConn, vbNullString, 0, hConn, 0) Then
nSize = 0
nLen = Len(nSize)
C HttpQueryInfo(hConn, HTTP_QUERY_CONTENT_LENGTH + HTTP_QUERY_FLAG_NUMBER, nSize, nLen, 0)
End If

End Sub
End Class
> 分類:[.NET] 

そもそも、何故 VB.NET で INet APIs を P/INVOKE してるんですか?

そんな面倒なことをしなくても、WebClient クラスや HttpWebRequest クラスを使う方がはるかに簡単だと思うんですが、それでは駄目なのでしょうか?
返信下さいましてありがとうございます。
すみません INet APIs ・ P/INVOKE 言葉そのものがよく分かって
いないレベルです。WebClient クラスや HttpWebRequest クラスで
簡単済むのであればクラスを使用したいと思います。各 クラスを
検索してみました。投稿する前に基本的な事を学んでから投稿する
必要を感じました。各クラスについてこれから学んでみたいと思って
います。
> すみません INet APIs ・ P/INVOKE 言葉そのものがよく分かって
> いないレベルです。

INet APIs は、Windows でインターネット接続やプロトコルを扱うための API 群の名称です。

P/INVOKE は、.NET から Windows API を呼び出すための技術の名称です。
渋木宏明(ひどり)さま
度々ご指導下さいまして有り難うございました。
今回はいろいろと学ぶ事ができました。お礼を申します。
よろしくお願いします。
クラスを使う方がはるかに簡単とのご指摘を受けました。
そこでHttpWebRequest クラスに変更しました。
クラスを使うWebページをダウンロードする
VB.NETの目的に近いサンプル・プログラムを見つけ出せました。
http://www.atmarkit.co.jp/fdotnet/dotnettips/311webreqres/webreqres.html
CType(WebRequest.Create(url), HttpWebRequest)は"リモート サーバー"に
接続の所までは分かりましたが、ファイルサイズ(バイト)の取得する場合に
何処かを変更・追加すれば取得が出来そうな感がしました。
もし取得が可能でしたらご指導を願えればと思います。
よろしくお願いします。
> そこでHttpWebRequest クラスに変更しました。

ファイルサイズを取得するだけなら、WebClient クラスでいいんじゃないでしょうか。

WebClient.OpenRead() した直後にレスポンスヘッダに長さが入っていればそれが、入っていなければ OpenRead() で返って来た Stream の末端まで読み込めるだけ読み込んだ結果がファイルサイズです。
度々、ご回答下さいましてお礼を申し上げます。
WebClient クラス等についての知識はこれからですが
ご指導して頂きましたWebClient クラスの
WebClient.OpenRead() で行ってみます。
返信ありがとうございました。
よろしくお願いします。
WebClient.OpenRead()を含むサンプルプログラムがありましたので
WebClient.OpenRead()に当てはめてみました。
http://dobon.net/vb/dotnet/internet/webclientopenread.html

'WebClientオブジェクトの作成
Dim WebClient As New System.Net.WebClient()
'streamを開く
Dim st As System.IO.Stream = WebClient.OpenRead("http://www.yahoo.com")
'読み込む
Dim sr As New System.IO.StreamReader(st)
'最後まで読み込む
Console.WriteLine(sr.ReadToEnd())
'streamを閉じる
st.Close()

デバッグしますと 'System.IO.IOException' の初回例外が System.dll で発生しました。
http://72.14.207.104/search?q=cache:FOYexZYdk1YJ:www.users.gr.jp/ml/Archive/viewer.aspx%3Fname%3Dcs%26no%3D4135+%E5%88%9D%E5%9B%9E%E4%BE%8B%E5%A4%96%E3%81%8C+System.dll+%E3%81%A7%E7%99%BA%E7%94%9F%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82&hl=ja&gl=jp&ct=clnk&cd=2

Visual Studio .NET 2002では例外は起きません。
ランタイムバージョンの違いによるものですとありました。
.NET 2005の為に例外が System.dll で発生するのでしょうか。?
.NETは十分でないので、その点につきまして宜しくお願い致します。
初回例外が System.dll で発生につきましては
デバッグ時に発生しますが、深刻でないと判断しましたので
初回例外・・・は一応クリアとしました。
よろしくお願いします。
初回例外が System.dll で発生するのは、使用している間に良くなっていました。
読み込んだ結果のファイルサイズをTextBox1に表示させたいのですが、
よく分かりませんでした。ご存知の方がいましたらよろしくお願いします。
渋木宏明(ひどり) さん
大変お世話になりました。色々とアドバイス及び
ご指導して下さいまして心よりお礼を申します。

Console.WriteLine(sr.ReadToEnd())
       ↓
TextBox1.Text = sr.ReadToEnd()

に変更する事で表示ができる様になりました。
また、初回例外が System.dll で発生するのは
変更前で発生することが分かりました。
変更後では発生しなくなりました。
お陰様で何とか解決する事ができました。
本当に有り難うございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板