Microsoft.XMLHTTPをつかって、非同期でサーバにリクエストしたとき、responseBodyを受け取る方法がわかりません。
同期ならば、リクエストしたあとにresponseBodyにサーバから帰ってきたデータが入っていますが、非同期の場合、responseBodyを参照するとエラーになってしまいます。
非同期でデータを受け取る方法を教えてください。よろしくお願いします。
(VB6 WindowsXP)
こんな感じです。
Sub test()
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "http://www.google.co.jp/"
.send
Do
DoEvents
Loop While .readyState <> 4
Debug.Print .responsetext
End With
End Sub
では別の方法を
参考:http://support.microsoft.com/kb/303322/ja
メニューの「プロジェクト」-「参照設定」よりMicrosoft XML, version 2.0 をチェックしOKを押す
'Class1
' -- メニューの「ツール」-「プロシージャの属性」でOnReadyStateChangeを選択
' -- 「詳細」を押してプロシージャIDを (既定) に設定し,OKを押す
Option Explicit
Dim xmlhttp As XMLHTTPRequest
Public Sub Initialize(ByVal xmlhttp_ref As XMLHTTPRequest)
Set xmlhttp = xmlhttp_ref
End Sub
Public Sub OnReadyStateChange()
Debug.Print "ReadyState="; xmlhttp.readyState
End Sub
'Form1
Option Explicit
Dim xmlhttp As XMLHTTPRequest
Private Sub Form_Load()
Dim Handler As Class1
Set xmlhttp = New XMLHTTPRequest
Set Handler = New Class1
Call Handler.Initialize(xmlhttp)
xmlhttp.OnReadyStateChange = Handler
xmlhttp.open "GET", "http://www.google.co.jp", True
xmlhttp.send
End Sub
これで実行.
イミディエイトウィンドウに以下の内容が表示される
ReadyState= 1
ReadyState= 1
ReadyState= 2
ReadyState= 3
ReadyState= 4
ご回答ありがとうございます。
熊谷さんとガッさんのご回答を見て、疑問が出ました。
私は、
CreateObject("Microsoft.XMLHTTP")
を使って通信を行っていますが、お二人は違いますよね。
疑問1
CreateObject("Microsoft.XMLHTTP")は、Msxml.dllを利用しているのでしょうか?
その場合、
http://support.microsoft.com/kb/269238/ja
を見ると、Msxml.dllにはたくさんのバージョンがあるようですが、これは常に最新のものを使ったほうがよろしいのでしょうか?
疑問2
いままで、メニューの「プロジェクト」-「参照設定」から、Microsoft XML などを参照していませんでしたが、参照しなくてもいいのでしょうか。それとも参照しなければならないのでしょうか。
作成したプログラムが、他のパソコンで動かず、通信の部分でエラーを出しているようなので、この部分に問題があるのではないのかと思いますが、はっきりした原因がわかりません。
特に、疑問2の参照をしなかったからエラーが起きたのかなとも考えていますが、どうなのかわかりません。
よろしくお願いします。
> 疑問1
> CreateObject("Microsoft.XMLHTTP")は、Msxml.dllを利用しているのでしょうか?
いいえ。そうとは限りません。環境に依存しています。(ADO もそうですよね)
Msxml.dll が利用される環境もありますし、Msxml3.dll の場合もあるでしょう。
レジストリエディタで、
HKEY_CLASSES_ROOT\Microsoft.XMLHTTP\CLSID
の値を調べると、恐らく、"{ED8C108E-4349-11D2-91A4-00C04F7969E8}" が
得られるかと思います。その後、それに相当するキー
HKEY_CLASSES_ROOT\CLSID\{ED8C108E-4349-11D2-91A4-00C04F7969E8}\InProcServer32
を見ると、DLL のパスを調べることができるかと思います。
> これは常に最新のものを使ったほうがよろしいのでしょうか?
MSXML の追加配布を省略する目的で、意図的に 2.0 や 2.5 が
使われる場合もあるかと思いますので、あまり気にせずとも良いかもしれません。
ただし、下記の「2004-06-14 16:10:17」の投稿のように、
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list108.shtml
特定バージョンでのみ起こる不具合などもあり得ますので、
できれば、最新の物にしておいた方が無難だと思います。
(古いバージョンは、幾つかの脆弱性が報告されています)
なお、MSXML4 以降のバージョンは、サイド バイ サイドで配置されますので、
レイトバインドで使う場合には、CreateObject 時の ProgID を、
バージョン別の物に差し替える必要があります。
> 疑問2
> いままで、メニューの「プロジェクト」-「参照設定」から、Microsoft XML などを
> 参照していませんでしたが、参照しなくてもいいのでしょうか。
どちらでも構いません。参照設定してもしなくとも、
どちらでも使えるように設計されています。
> 通信の部分でエラーを出しているようなので
たとえば、PC の時刻が大幅にずれていたために SSL チェックで失敗したり、
プロキシの設定の問題で通信が失敗する場合などが考えられます。
可能であれば、エラーの内容を提示してみてください。
> 作成したプログラムが、他のパソコンで動かず、通信の部分でエラーを出しているようなので、この部分に問題があるのではないのかと思いますが、はっきりした原因がわかりません。
> 特に、疑問2の参照をしなかったからエラーが起きたのかなとも考えていますが、どうなのかわかりません。
実際のエラー内容が不明ではそもそも、こちらには伝わりませんね。
OnResponseFinishedイベントが利用できるWinHttpを使ってみるとか。
(要Microsoft WinHTTP Services, version 5.1 参照設定)
WinHttpRequest Object (Windows)
http://msdn.microsoft.com/en-us/library/aa384106(VS.85).aspx
Windows HTTP Services (Windows)
http://msdn.microsoft.com/en-us/library/aa384273(VS.85).aspx
IWinHttpRequestEvents::OnResponseFinished Event Event (Windows)
http://msdn.microsoft.com/en-us/library/aa383946(VS.85).aspx
ご回答ありがとうございます。
実行時のエラーについて
エラーが起きたパソコンには、このプログラムのexe形式のファイルしかなく、デバッグ画面が見れないので、このMicrosoft.XMLHTTPと関係があるかどうかわかりませんが、起きたエラーは、
msinei.ocxからコントロールinetをロードできません。msinetのバージョンが最新のものではありません。
というエラーです。
このエラーの起きたパソコンで、プログラムをインストールしたあと、ベクターのサイトで見つけたランタイム更新ソフトを入れてみましたが、エラーは防げませんでした。
このエラーは、Microsoft.XMLHTTPと関係があるのでしょうか?
1:プログラム中でInetコントロールを使っている
2:実行環境にmsinet.ocxが入ってない
基本ランタイムには入ってませんから別からインストールしましょう
ツイート | ![]() |