WinInet.dllを使用してHTTPサーバーからの応答を取得する方法とエラーコードの詳細

このQ&Aのポイント
  • WinInet.dllを使用してHTTPサーバーからの応答を取得する方法
  • HttpSendRequestのエラーコード997の詳細調査方法
  • HttpSendRequest後にHttpQueryInfoで応答を取得するまで待つ方法
回答を見る
  • ベストアンサー

WinInet.dll にてHTTPサーバからの応答を取得

WinInet.dll にてHTTPサーバからの応答を取得するプログラムを作っています。 HttpSendRequest を実行して Err.LastDllError の値を見ると 997 が帰ってきて、 直後に HttpQueryInfo で応答を取得しても期待する値が帰ってきません。 ただ、HttpSendRequest の後にブレイクポイントやsleepで少し待って HttpQueryInfo で応答を取得すると期待した値が取得できます。 この場合もHttpSendRequestのエラーコードは 997 です。 Webサーバー側の問題かと思い、別のサイトでも試しましたが結果は同じです。 値が正しく取得できているので関数の使い方は正しいと思うのですが、2点質問があります。 ・HttpSendRequest の後、HttpQueryInfo で取得できる状態まで待つ方法 ・HttpSendRequest のエラーコード 997 の詳細を調べる方法 どちらか一方でもご回答いただけると助かります。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

>・HttpSendRequest のエラーコード 997 の詳細を調べる方法 「WinInet エラーコード 997」で調べると、「ERROR_IO_PENDING」が見つかり、それをググると「非同期I/O」の問題とわかります。基本的には、待機していれば解消されるので、エラーとは言えないようです。 念のため「InternetOpen」のフラグで「INTERNET_FLAG_ASYNC」を指定していないか確認してください。 ただ、こちらでも非同期っぽい動きが見られたようです。どうもすっきりとした解決法は見つかりませんでした。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1161422

wds32862
質問者

お礼

ご回答ありがとうございます。 「HttpSendRequest 997」にいろいろキーワードを加えて何度もググっていたんですけど、 「HttpSendRequest」は検索ワードとして邪魔だったみたいですね。 再度試すと当Q&Aが1件目にでました。 おっしゃる通り「InternetOpen」のフラグで「INTERNET_FLAG_ASYNC」を指定していました。 私の見たサイトでは非同期ではなく「サーバーから取得します」とコメントがあったので こちらを指定していました。試しに0で実行してみると、期待した動作になりました。 ありがとうございました。

関連するQ&A

  • WinInet.dllを利用したHttpQueryInfoの取得

    現在、VB6.0にてWinInet.dllを利用したHTTP通信のプログラムを作成しております。 WEBサーバに対してリクエストを送るところまでは正常に動作しているのですが、リクエストに対するWEBサーバからの応答の取得がうまく動作しません。 具体的には、 HttpSendRequest(hUrl, vbNullString, 0, StrPtr(~), UBound(~)) でデータを送り、この応答を取得するために、 HttpQueryInfo(hUrl, HTTP_QUERY_STATUS_CODE, strBuffer, lngLength, 0) を記述しています。 これを実行した際、LngLengthには3が戻ってくるのですが、strBufferに戻る値が、3桁ではありません。 文字コードかデータ型の違いかで全く読み取れない値が帰ってきます。 通常であればstrBufferに入る値は何も変換なく読み取れるものなのでしょうか? 今回だと、200や404がそのまま取得できるものなのでしょうか? どなたか、分かる方がおられましたら、ご教授下さい。

  • 「Active X Inet」と「WinInet.dll」の違いについて

    最近「VB6」から「VB 2008 Express Edition」へプログラミング環境を 移行したものです。 VB6では「Active X コントロール:インターネットトランスファ(Inet)の OpenURLメソッド」を使用してHTTPファイルを取得していました。 環境の移行を機に「Windows Internet(WinInet.dll)の機能」を使用して、 VB6の「Inet.OpenURLメソッド」と同様の処理を行おうと考えました。 しかしいざ実行すると、「Inet.OpenURL」だと正常にファイルを取得できるのに、 「WinInet.dll」では異常終了してしまうケースがあります。 私の経験不足から、その原因を突き止めることができません。 よろしくお願いいたします。 ◎HTTPファイルを取得するまでの WinInet.dll で行っている処理[1] (1) InternetOpen ↓ (2) InternetConnect ↓ (3) HttpOpenRequest ↓ (4) HttpSendRequest ↓ (5) HttpQueryInfo ↓ (6) InternetReadFile ◎HTTPファイルを取得するまでの WinInet.dll で行っている処理[2] (1) InternetOpen ↓ (2) InternetOpenUrl ↓ (3) HttpQueryInfo ↓ (4) InternetReadFile ◎ 上記、処理[1]で正常にファイルが取得できるURL 上記、処理[1]では失敗するが処理[2]で正常にファイルが取得できるURL 上記、処理[1]でも処理[2]でも失敗するが、「Inet.OpenURL」で正常に ファイルが取得でいるURLの、3通りのURLが存在します。 この差はどこから生じるのでしょう。 処理[1]、処理[2]で失敗する場合は、 「InternetConnect」、「HttpSendRequest」または、「InternetOpenUrl」で 異常終了し、「エラーコード:2(ERROR_FILE_NOT_FOUND: The system cannot find the file specified.)」が返ってきます。 「ファイルが見つからない」というのは、「該当のURLが存在しない」と いう事なのかもしれませんが、「Inet.OpenURL」で、正常にファイルが 取得できるのは腑に落ちないです。 「Inet.OpenURL」自体も「WinInet.dll」の機能を使って実現している様な事を 聞きました。いったい、何が違うのでしょう。 何方か、私のこの疑問を解消して頂けないでしょうか? よろしくお願いいたします。

  • wininet.dllとwsock32.dllについて

    クライアントのVBAから、サーバにHTTPで文字データを送信しようとしています。 1. WinAPIの"InternetOpenURL"(wininet.dll)が使えると思いましたが、MSDNLibraryではWinCE用と英語で言っているようでした。W2Kの自PCにも上記DLLは入っていますが、W2Kで使うのは一般的ではないのでしょうか? 2. クライアントのIPアドレスも送信したいので、wsock32.dllのAPIで取得しようとしています。wininetやwsock32が、いつインストールされるものなのか(OS入れた時か、Officeか、IEか等)を調べる手段はあるでしょうか?また、MS社以外の製品によって、これらのDLLがアップデートされてしまうことは通常ないと考えていてよいものでしょうか? ご教授下さいますよう、よろしくお願いします。

  • WinInet.dll で HTTPS へ POST できません

     WinInet.dll を使って、HTTPS サーバーへデータを POST するプログラムを作っています。開発言語は VB6 です。  HttpSendRequest で 12029 エラーとなり原因が分かりません。  HTTP 通信テストツールの RESTTEST を使ったテストでは正常に終了しています(HTTPステータス 200 が返っている)ので、回線やインターネット設定(ファイヤーウォールの問題など)は問題ないと思われます。  ソースから手続きの部分だけ抜き出して、下記に示します。  (エラーチェックなどはソース上にはありますが、ここでは省いています)  手続き上何か抜けが無いかご指摘いただけると助かります。   'インターネットサービスをオープンする   lngWinINet = InternetOpen(vbNullString, _                INTERNET_OPEN_TYPE_PRECONFIG, _                vbNullString, _                vbNullString, _                0)   'HTTPサーバへ接続   lngHttpHnd = InternetConnect(lngWinINet, _                  "www.test.jp", _                  INTERNET_DEFAULT_HTTPS_PORT, _                  vbNullString, _                  vbNullString, _                  INTERNET_SERVICE_HTTP, _                  0, _                  0)   'リクエストを初期化   Dim tmpURL As String * 255   Dim lngSecFlag As Long   lngSecFlag = INTERNET_FLAG_SECURE Or _          INTERNET_FLAG_IGNORE_CERT_CN_INVALID Or _          INTERNET_FLAG_IGNORE_CERT_DATE_INVALID   tmpURL = "/testdir/test.php"   lngReqHnd = HttpOpenRequest(lngHttpHnd, _                 "POST", _                 tmpURL, _                 "HTTP/1.1", _                 vbNullString, _                 0, _                 INTERNET_FLAG_RELOAD Or lngSecFlag, _                 0)   'リクエストを送信   Dim strHeader As String   Dim strPostData As String   strHeader = "Content-Type: application/x-www-form-urlencoded"   strPostData = "TEST1=aaa&TEST2=bbbbb"   Call HttpSendRequest(lngReqHnd, _              strHeader, _              Len(strHeader), _              strPostData, _              Len(strPostData))  手続き部分は、順番も含めて上記の通りです。  これ以外のことはやっていません。  これ以外にやっておかなければいけないことや、上記のやり方ではよくない部分などありましたら、ご教授いただけると助かります。  よろしくお願いします。

  • iexplore.exeのエラーとwininet.dllについて

    IEを立ち上げると「問題が発生したため、iexplore.exe を終了します。 ご不便をおかけして申し訳ありません。」と言うメッセージが突然出るようになりました。必ず表示されます。 「閉じる」を押すとそのまま閉じてしまうのですが、エラーメッセージを放置しておくとそのまま使用可能です。でも常に一番前に表示されるので邪魔でどうしようもありません。 マイクロソフトの下記ページも見てみたのですが、私の場合はModule name の欄に「wininet.dll」と表示されています。 http://support.microsoft.com/kb/831432/ja 他のブラウザを使ってもいいのですが、Live Messengerやその他のチャットソフトもログインするとほぼ毎回強制終了されてしまったり、ログイン画面すら立ち上がらないこともあって困っています。Messengerソフトに関しては10回に1回くらいはエラーが出ません。やはりModule name の欄に「wininet.dll」とあります。 IEの設定でHTTP1.1を使用しないようにするという方法も試してみたり、テンポラリファイルの削除もしましたが同じです。 IEの問題ではないように思っているのですが、解決方法がありましたら教えて下さい。IEのバージョンは6.0でXPはSP2です。 よろしくお願いします。

  • 「HttpSendRequest」の異常終了の原因について

    プログラム環境は「WinXP SP3 + VB2008 Express Edition」です。 Webサーバ上のファイルを取得するプログラムを作成しています。 「VB6」で「Inet/OpenURL」を使用して実現していた機能を「WinInet.dll」を使用して実現したいと思っています。 その処理の途中の「HttpSendRequest」で異常終了してしまいます。 「エラーコード:2(ERROR_FILE_NOT_FOUND:The system cannot find the file specified.)」です。 「Wireshark」でPCとサーバの交信をチェックしたところ、「Inet/OpenURL」でうまくいった時と、「HttpSendRequest」でうまくいかない時に違いが見当たりません。「HTTP:GET」に対して「HTTP:200 OK」が返ってきます。TCPでも「SYN-->ACK」で始まって、「FIN-->ACK」で終っています。交信は正常に行われているのに、「HttpSendRequest」の内部の処理でエラーにしているように見えます。(例えば、「HTTP:GET」~「HTTP:200 OK」でPCとサーバの間でパケットのやり取りがありますが、その回数が限界値を超えたため、エラーにしてしまうような処理があれば、エラーになりそうです。このあたりがわかりませんでした。) また、この「HttpSendRequest」が異常終了する事態は「GET」の対象が「*.php」の場合に発生します。「GET」の対象が「*.html」「*.jpg」「*.zip」の場合には、正常終了して、ファイルが正常に取得できます。「GET」の対象が「*.php」の場合に「HttpSendRequest」を実行する前に何か設定が必要なのでしょうか? よろしく、お願いいたします。

  • HTTPストリーミングによるデータの取得方法

    QuickTime のようなHTTPストリーミングを行うアプリの開発を検討しております。 おそらく、MFCのWinInetクラスを使って実装可能と思うのですが、QucikTimeは、サーバからダウンロードしたデータを取得しながら再生していますが、同様にデータを一括取得ではなく、取得しながら逐次的にデータを処理するようなしくみを実現する方法について、ご教示いただければと思います。もしありましたら、サンプルプログラムをお願い致します。

  • HTTPヘッダの取得方法

    PerlにてHTTPヘッダの情報を取得したいと考えています。 通常ならば、 $ENV{'<ヘッダ名称>'} で取得できるはずなのですが、 今回取得しようとしているヘッダはHTTPの標準ヘッダではありません。 proxyサーバにてログインを行い認証されますと、 そのproxyサーバが独自にHTTPヘッダに値を追加する仕様になっています。 テストではJavaですとproxyが設定したヘッダ情報を取得できるのですが、 ことPerlになると取得することができません。 ※Javaと今回動かすPerlは同一サーバで動かします。 HTTP標準以外のヘッダ情報はどのように取得すれば良いのでしょうか? なお、PerlのVerは5.6.1、OSはLinuxです。

  • サーバが落ちているときのエラー取得。

    WinNT4+PWSでASPプログラムを作っています。 サーバが落ちていて接続できない状態のエラーを取得できずに困っております。 Errでは取得することは出来ないのでしょうか?よろしくお願いします。

  • wininet.dllのInternetOpenの同期、非同期について

    wininet.dllのInternetOpenの同期、非同期について お世話になります。 VBAでFTPの転送をする際に、InternetOpenを使うのですが同期させたいと思います。 以下サイトなどでいろいろ調べたのですがdwFlagsの指定の仕方について質問です。 1.dwFlags に 0 が指定された場合は、同期すると考えて宜しいでしょうか? 2.dwFlags に、文字列で INTERNET_FLAG_ASYNC を指定すると非同期となるということでよいでしょうか? 3.複数を組合せの時はどのように記述しますか? 以上、宜しくお願い致します。 <参考サイト> http://www.red.oit-net.jp/tatsuya/vb/WinInet.htm#InternetOpen ●参考サイトより抜粋 Public Declare Function InternetOpen Lib "Wininet.DLL" Alias "InternetOpenA" _ (ByVal lpszAgent As String, ByVal dwAccessType As Long, ByVal lpszProxyName As String, _ ByVal lpszProxyBypass As String, ByVal dwFlags As Long) As Long dwFlags : オプション。以下のパラメータの組み合わせを指定します。 INTERNET_FLAG_ASYNC サーバーから取得する(非同期)。 INTERNET_FLAG_FROM_CACHE キャッシュから取得する。 INTERNET_FLAG_OFFLINE INTERNET_FLAG_FROM_CACHEと同じ。