- ベストアンサー
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がそのまま取得できるものなのでしょうか? どなたか、分かる方がおられましたら、ご教授下さい。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
HttpQueryInfoの第3引数の定義がNG http://www.google.com/search?q=Declare+Function+HttpQueryInfo
その他の回答 (1)
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
2度目の質問ですよね? 前回の質問の時も興味があったのですが、VB6環境が客先に無いことと、WinInetの経験があまりないために、発言を控えておりました。 しかし面白そうなので、可能な限りお付き合いしたいと思っております。 現在の公開されている情報の中に、APIの宣言が、どのように切られているかが記されておりません。 APIの宣言に対し利用方法が適していない場合、単に文字列のアドレスが入る場合もありますし、文字コードを変換するだけで済む場合もあります。 またこちらの環境で再現させるためにも、APIを発行している部分だけではなく InternetOpen InternetConnect HttpOpenRequest HttpSendRequest HttpQueryInfo の「各宣言」と、その「利用している部分のソース」を抜粋でもよいので載せてください。 (もちろん定数部は不要です。)
補足
返信ありがとうございます。 一連の動作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 以上です。 長文となってしまいましたが、何か間違った記述等分かれば、ご教授お願いいたします。
お礼
ありがとうございます。 第3引数の定義を ByVal sBuffer As Any と修正したところ、正しく値が取得できました。 ありがとうございます。