XMLHTTPの非同期通信で、サーバからデータを受信するには


HTTP  2008-06-27 10:59:03  No: 100846

Microsoft.XMLHTTPをつかって、非同期でサーバにリクエストしたとき、responseBodyを受け取る方法がわかりません。

同期ならば、リクエストしたあとにresponseBodyにサーバから帰ってきたデータが入っていますが、非同期の場合、responseBodyを参照するとエラーになってしまいます。

非同期でデータを受け取る方法を教えてください。よろしくお願いします。

(VB6 WindowsXP)


熊谷隆史  2008-06-27 20:43:38  No: 100847

こんな感じです。
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


ガッ  2008-06-27 20:58:11  No: 100848

では別の方法を
参考: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


HTTP  2008-07-10 20:44:32  No: 100849

ご回答ありがとうございます。

熊谷さんとガッさんのご回答を見て、疑問が出ました。
私は、
CreateObject("Microsoft.XMLHTTP")
を使って通信を行っていますが、お二人は違いますよね。

疑問1
CreateObject("Microsoft.XMLHTTP")は、Msxml.dllを利用しているのでしょうか?
その場合、
http://support.microsoft.com/kb/269238/ja
を見ると、Msxml.dllにはたくさんのバージョンがあるようですが、これは常に最新のものを使ったほうがよろしいのでしょうか?

疑問2
いままで、メニューの「プロジェクト」-「参照設定」から、Microsoft XML  などを参照していませんでしたが、参照しなくてもいいのでしょうか。それとも参照しなければならないのでしょうか。

作成したプログラムが、他のパソコンで動かず、通信の部分でエラーを出しているようなので、この部分に問題があるのではないのかと思いますが、はっきりした原因がわかりません。
特に、疑問2の参照をしなかったからエラーが起きたのかなとも考えていますが、どうなのかわかりません。

よろしくお願いします。


魔界の仮面弁士  2008-07-10 23:20:26  No: 100850

> 疑問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 チェックで失敗したり、
プロキシの設定の問題で通信が失敗する場合などが考えられます。
可能であれば、エラーの内容を提示してみてください。


熊谷隆史  2008-07-11 19:19:09  No: 100851

> 作成したプログラムが、他のパソコンで動かず、通信の部分でエラーを出しているようなので、この部分に問題があるのではないのかと思いますが、はっきりした原因がわかりません。
> 特に、疑問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


HTTP  2008-07-14 05:11:55  No: 100852

ご回答ありがとうございます。

実行時のエラーについて

エラーが起きたパソコンには、このプログラムのexe形式のファイルしかなく、デバッグ画面が見れないので、このMicrosoft.XMLHTTPと関係があるかどうかわかりませんが、起きたエラーは、
msinei.ocxからコントロールinetをロードできません。msinetのバージョンが最新のものではありません。
というエラーです。

このエラーの起きたパソコンで、プログラムをインストールしたあと、ベクターのサイトで見つけたランタイム更新ソフトを入れてみましたが、エラーは防げませんでした。

このエラーは、Microsoft.XMLHTTPと関係があるのでしょうか?


通ってみた  2008-07-14 13:40:28  No: 100853

1:プログラム中でInetコントロールを使っている
2:実行環境にmsinet.ocxが入ってない

基本ランタイムには入ってませんから別からインストールしましょう


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

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






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