• ベストアンサー

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がそのまま取得できるものなのでしょうか? どなたか、分かる方がおられましたら、ご教授下さい。

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

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.2

HttpQueryInfoの第3引数の定義がNG http://www.google.com/search?q=Declare+Function+HttpQueryInfo

cio238
質問者

お礼

ありがとうございます。 第3引数の定義を ByVal sBuffer As Any と修正したところ、正しく値が取得できました。 ありがとうございます。

その他の回答 (1)

回答No.1

2度目の質問ですよね? 前回の質問の時も興味があったのですが、VB6環境が客先に無いことと、WinInetの経験があまりないために、発言を控えておりました。 しかし面白そうなので、可能な限りお付き合いしたいと思っております。 現在の公開されている情報の中に、APIの宣言が、どのように切られているかが記されておりません。 APIの宣言に対し利用方法が適していない場合、単に文字列のアドレスが入る場合もありますし、文字コードを変換するだけで済む場合もあります。 またこちらの環境で再現させるためにも、APIを発行している部分だけではなく InternetOpen InternetConnect HttpOpenRequest HttpSendRequest HttpQueryInfo の「各宣言」と、その「利用している部分のソース」を抜粋でもよいので載せてください。 (もちろん定数部は不要です。)

cio238
質問者

補足

返信ありがとうございます。 一連の動作PGを掲載します。 hOpen = InternetOpen(Code, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0&) hCon = InternetConnect(hOpen, Server, INTERNET_DEFAULT_HTTP_PORT, vbNullString, vbNullString, INTERNET_SERVICE_HTTP, 0&, 0&) hUrl = HttpOpenRequest(hCon, "POST", ServerAdress, "HTTP/1.1", vbNullString, 0, INTERNET_FLAG_NO_CACHE_WRITE, 0) sHeader = "Accept: image/jpeg" & vbCrLf & vbNullString hReq = HttpAddRequestHeaders(hUrl, sHeader, Len(sHeader), HTTP_ADDREQ_FLAG_REPLACE Or HTTP_ADDREQ_FLAG_ADD) sHeader = "Accept-Language: ja" & vbCrLf & vbNullString hReq = HttpAddRequestHeaders(hUrl, sHeader, Len(sHeader), HTTP_ADDREQ_FLAG_REPLACE Or HTTP_ADDREQ_FLAG_ADD) sHeader = "Content-Type:-----1234567890abc" & vbCrLf & vbNullString hReq = HttpAddRequestHeaders(hUrl, sHeader, Len(sHeader), HTTP_ADDREQ_FLAG_REPLACE Or HTTP_ADDREQ_FLAG_ADD) sHeader = "Connection: Keep-Alive" & vbCrLf & vbNullString hReq = HttpAddRequestHeaders(hUrl, sHeader, Len(sHeader), HTTP_ADDREQ_FLAG_REPLACE Or HTTP_ADDREQ_FLAG_ADD) sHeader = "Cache-Control: no-cache" & vbCrLf & vbNullString hReq = HttpAddRequestHeaders(hUrl, sHeader, Len(sHeader), HTTP_ADDREQ_FLAG_REPLACE Or HTTP_ADDREQ_FLAG_ADD) sHeader = "Proxy-Connection: Keep-Alive" & vbCrLf & vbNullString hReq = HttpAddRequestHeaders(hUrl, sHeader, Len(sHeader), HTTP_ADDREQ_FLAG_REPLACE Or HTTP_ADDREQ_FLAG_ADD) ReDim filebuf(1 To FileLen(filename)) As Byte fNum = FreeFile() Open filename For Binary As fNum Get fNum, , filebuf Close fNum Call AddMimeField("Content-Disposition: form-data; name=""" & fname & """; filename=""" & filename & """" & vbCrLf _ & "Content-Type: text/plain", filebuf) hReq = HttpSendRequest(hUrl, vbNullString, 0, StrPtr(mimedata), UBound(mimedata)) Dim strBuffer As String * 1024 Dim lngLength As Long lngLength = 1024 strBuffer = vbNullString hReq = HttpQueryInfo(hUrl, HTTP_QUERY_STATUS_CODE, strBuffer, lngLength, 0) ------------------- Private Function AddMimeField(fheader As String, fdata As Variant) mimedata = mimedata & StrConv(“-----1234567890abc” & vbCrLf & fheader & vbCrLf & vbCrLf, vbFromUnicode) & fdata & StrConv(vbCrLf, vbFromUnicode ) & StrConv(“-----1234567890abc --" & vbCrLf, vbFromUnicode) End Function --------------------- Public Declare Function InternetConnect Lib "wininet.dll" _ Alias "InternetConnectA" _ (ByVal hInternetSession As Long, _ ByVal sServerName As String, _ ByVal nServerPort As Integer, _ ByVal sUsername As String, _ ByVal sPassword As String, _ ByVal lService As Long, _ ByVal lFlags As Long, _ ByVal lContext As Long) As Long Public Declare Function HttpOpenRequest Lib "wininet.dll" _ Alias "HttpOpenRequestA" _ (ByVal hHttpSession As Long, _ ByVal sVerb As String, _ ByVal sObjectName As String, _ ByVal sVersion As String, _ ByVal sReferer As String, _ ByVal something As Long, _ ByVal lFlags As Long, _ ByVal lContext As Long) As Long Public Declare Function HttpSendRequest Lib "wininet.dll" _ Alias "HttpSendRequestA" _ (ByVal hHttpRequest As Long, _ ByVal sHeaders As String, _ ByVal lHeadersLength As Long, _ ByVal sOptional As Any, _ ByVal lOptionalLength As Long) As Integer Public Declare Function HttpQueryInfo Lib "wininet.dll" _ Alias "HttpQueryInfoA" _ (ByVal hHttpRequest As Long, _ ByVal lInfoLevel As Long, _ ByRef sBuffer As String, _ ByRef lBufferLength As Long, _ ByRef lIndex As Long) As Integer 以上です。 長文となってしまいましたが、何か間違った記述等分かれば、ご教授お願いいたします。

関連するQ&A

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

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

  • 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))  手続き部分は、順番も含めて上記の通りです。  これ以外のことはやっていません。  これ以外にやっておかなければいけないことや、上記のやり方ではよくない部分などありましたら、ご教授いただけると助かります。  よろしくお願いします。

  • 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がアップデートされてしまうことは通常ないと考えていてよいものでしょうか? ご教授下さいますよう、よろしくお願いします。

  • 「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」の機能を使って実現している様な事を 聞きました。いったい、何が違うのでしょう。 何方か、私のこの疑問を解消して頂けないでしょうか? よろしくお願いいたします。

  • 「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 リクエストヘッダの取得方法について

    表記の内容についてご存知の方がいらっしゃい ましたら、ご教授いただけませんでしょうか。 HTTPのリクエストヘッダに付与されている 環境変数「HTTP_IV_USER」 もしくは 「IV_USER」を 取得する方法について教えて頂けませんでしょうか。  [実行環境]  OS:Windows2000 Server  Webサーバ:Oracle Application Server 9.0.2 その他にOracleのCDに入っているP/L SQLの WebToolkitがインストールされてます。 当方としては取得したリクエストヘッダの 値をP/L SQLのプログラムを通してOracleの データベースに書込みたいと思っております。 何卒どうぞよろしくお願い致します。

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

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

  • wininetでPOSTで値を渡せません

    winnetを使ってPOST形式でサーバにパラメータを渡そうとしていますが、パラメータが渡せずに困っています。 HttpOpenRequestかHttpSendRequestがおかしいと思うのですが、自分では見当がつきません。 よければ何処に問題があるのか教えてください。 環境:vc++2005 int DoHttpRequest( void ) { HINTERNET hInet, hSession, hRequest; DWORD dwTotal = 0; wchar_t param[] = L"type=1"; wchar_t header[] = L"Content-Type: application/x-www-form-urlencoded"; wchar_t accept[] = L"Accept: */*"; // 使ってない BOOL flag; Console::WriteLine( "Http接続START" ); //インターネット(WinInet)初期化 hInet = InternetOpen( NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); if (hInet == NULL) { Console::WriteLine( "エラー1" ); return -1; } // サーバへ接続 hSession = InternetConnect( hInet, L"192.168.11.25", 9999, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0 ); if( hSession == NULL ) { Console::WriteLine( "エラー2" ); InternetCloseHandle(hInet); return -1; } //HTTPセッションの開始, 指定のURLオープン hRequest = HttpOpenRequest( hSession, L"POST", L"/sample/service.php", NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0 ); if (hRequest == NULL) { Console::WriteLine( "エラー3" ); InternetCloseHandle(hSession); InternetCloseHandle(hInet); return -1; } // 送信 flag = HttpSendRequest( hRequest, header, wcslen( header ), param, wcslen( param )); if( flag == FALSE ) { Console::WriteLine( "エラー4" ); InternetCloseHandle(hRequest); InternetCloseHandle(hSession); InternetCloseHandle(hInet); return -1; } //インターネットハンドルの解放 InternetCloseHandle( hRequest ); InternetCloseHandle( hSession ); InternetCloseHandle( hInet ); Console::WriteLine( "Http接続END" ); return 0; }

  • HTTPリクエストのリクエスト行部とデータ本体部

    HTTPリクエストには (1)「HTTPリクエスト行」 (2)「HTTPヘッダー」 (3)「データ本体」の3つのパートがあると思います。 これらのうち、「データ本体」について質問です。 クライアント側から、 formのinputタグにリクエストパラメータをセットしてsubmitしたとき、 サーブレット側ではgetParameterで値を取得していますが、 これは、(3)「データ本体」から取っているのでしょうか? (1)「HTTPリクエスト行」から取っているのでしょうか?

    • ベストアンサー
    • Java
  • wininetのSendRequestでエラー

    すみませんが、自分の知識不足の為に原因が分からない為、質問させてもらいます。 現在、こちらで作成しているプログラムで、WininetでHTTP通信をしているプログラムがあるのですが、本処理で以下の事象が発生しています。 事象発生のプログラム処理概要 (1)以下の処理でセッション生成 CInternetSession* g_pSession = new CInternetSession(); (2)上記処理後、以下の順で通信処理実施 CHttpConnection* pConn = g_pSession->GetHttpConnection(サーバ名, ポート番号); CHttpFile* lpHttpFile = pConn->OpenRequest(CHttpConnection::HTTP_VERB_POST, 相対パス); BOOL bRet = lpHttpFile->SendRequest(ヘッダ, データ, データ長); この後、接続したサーバに対して、一定間隔で空データで通信を行い、相手側の生死チェックを行っているのですが、一定時間通信をしていると、ERROR_INVALID_HANDLE(ハンドル無効)のエラーが出て、セッションを張り直すまで回復しない(ハンドル無効が出続ける)状態になります。 言語はC++で作成しており、動作環境はWindows7SP1になります。 この手の通信は、同じハンドルを使用し続けるとダメだとか、そういう制約や問題は聞いたことがなかったため、このような事象に心当たりがある方がいたら、教えて頂けますでしょうか。

専門家に質問してみよう