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))


 手続き部分は、順番も含めて上記の通りです。
 これ以外のことはやっていません。

 これ以外にやっておかなければいけないことや、上記のやり方ではよくない部分などありましたら、ご教授いただけると助かります。

 よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

12029の意味を調べてみましたか?


ERROR_INTERNET_CANNOT_CONNECT
The attempt to connect to the server failed.
サーバー接続が失敗ということですが、セキュリティソフトの影響は考えられませんか?

> Dim tmpURL As String * 255
Dim tmpURL As String
でいいのでは?
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qwininetで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;
}

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: */*...続きを読む

Aベストアンサー

なるほど、第2引数と第4引数で指定されたものはそのように出力されるのですか…。
第2引数では追加のリクエストヘッダ(複数の場合はおそらく\r\nで結合して)を、第4引数ではHTTPBodyに相当するものを…ですか。

MSDNによると…
第3引数は
>dwHeadersLength
>[in] Size of the additional headers, in TCHARs. If this parameter is -1L and lpszHeaders is not NULL, the function assumes that lpszHeaders is zero-terminated (ASCIIZ), and the length is calculated. See Remarks for specifics.
ということでTCHAR単位で、第5引数は
>dwOptionalLength
>[in] Size of the optional data, in bytes. This parameter can be zero if there is no optional data to send.
ということでByte単位で渡す必要があるようです。

sizeof( param )
では、param[]には'\0'も含まれるので14になったようです。
wchar_t配列ではなく、charの配列でstrlen()でよいのではないでしょうか?

なるほど、第2引数と第4引数で指定されたものはそのように出力されるのですか…。
第2引数では追加のリクエストヘッダ(複数の場合はおそらく\r\nで結合して)を、第4引数ではHTTPBodyに相当するものを…ですか。

MSDNによると…
第3引数は
>dwHeadersLength
>[in] Size of the additional headers, in TCHARs. If this parameter is -1L and lpszHeaders is not NULL, the function assumes that lpszHeaders is zero-terminated (ASCIIZ), and the length is calculated. See Remarks for specifics.
とい...続きを読む

QHTTPサーバーへPOST要求を送信について

はじめまして、ひろです。
VisualBasic 2008 .NETでHTTPサーバーへPOST要求を送信する
プログラムを作成しているのですが、うまく動作しません。
仕様書でクライアントからサーバーへ
要求URL:https://ABC.co.jp
要求HEADER:POST https://ABC.co.jp HTTP/1.0
要求BODY:A=1234
POST要求するよう指示されているのですが、
下記のようなプログラムではERRORが返ってきます。
問題ある箇所がわかる方いらっしゃたら、
教えてほしいのですが。
よろしくお願いします。

Sub aaabbb()
Dim objXML As Object
Dim strXMLDoc As String
Dim intRet As Integer
Dim strURL As String
Dim strKey As String

strURL = "https://ABC.co.jp"
strKey = "A=1234"

objXML = CreateObject("MSXML2.ServerXMLHTTP")
objXML.open("POST", strURL, False)
objXML.send(strKey)
strXMLDoc = objXML.responseText
intRet = objXML.status
objXML = Nothing
End Sub

はじめまして、ひろです。
VisualBasic 2008 .NETでHTTPサーバーへPOST要求を送信する
プログラムを作成しているのですが、うまく動作しません。
仕様書でクライアントからサーバーへ
要求URL:https://ABC.co.jp
要求HEADER:POST https://ABC.co.jp HTTP/1.0
要求BODY:A=1234
POST要求するよう指示されているのですが、
下記のようなプログラムではERRORが返ってきます。
問題ある箇所がわかる方いらっしゃたら、
教えてほしいのですが。
よろしくお願いします。

Sub aaabbb()
Dim objXML As ...続きを読む

Aベストアンサー

>下記のようなプログラムではERRORが返ってきます。

どこで、どのようなエラーが帰ってくるのでしょうか?

httpsと言うことなので、公開鍵証明書(cer)が必要なんじゃないかな。

QHTTPエラー 12029

すいません、会社PCなのですが表題通り
《HTTPエラー 12029》がでてIEが使えません
メール等は接続確認できてます。
XPの診断プログラムでHTTPのみエラーがでてます。

どなたか原因と対策をご教授ください。
複数人使用するPCなので誰が何をしたか不明です
HTTPエラーコード表等、検索サイトで見て廻ったのですが
のっているのは500番台まで><

よろしくお願いします

Aベストアンサー

会社のPCということですので、proxyの設定が無効になっている可能性があります。
IEのツールからインターネットオプションの接続タブの下にある
LANの設定をクリックして、プロキシーサーバの所の
LANにプロキシーサーバを使用するにチェックが入っているか確認してください。

参考URL:http://email.biglobe.ne.jp/outmail/faq2.html

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

現在、VB6.0にてWinInet.dllを利用したHTTP通信のプログラムを作成しております。
WEBサーバに対してリクエストを送るところまでは正常に動作しているのですが、リクエストに対するWEBサーバからの応答の取得がうまく動作しません。

具体的には、
HttpSendRequest(hUrl, vbNullString, 0, StrPtr(~), UBound(~))
でデータを送り、この応答を取得するために、
HttpQueryInfo(hUrl, HTTP_QUERY_STATUS_CODE, strBuffer, lngLength, 0)
を記述しています。
これを実行した際、LngLengthには3が戻ってくる...続きを読む

Aベストアンサー

HttpQueryInfoの第3引数の定義がNG

http://www.google.com/search?q=Declare+Function+HttpQueryInfo

QFTPを使わないファイルアップロード

「とほほのWWW入門」にある、wwwupl2 を使ってブラウザからWWWサーバへ
ファイルをアップロードしています。
http://tohoho.wakusei.ne.jp/how2/tec1.htm#upload

VB からこの CGI へ命令(?)を渡し、ユーザには VB の画面だけを表示させておいて、
裏で CGI によるファイルのアップロードをさせることはできるのでしょうか?
つまり、ファイルを指定して送信ボタンを押すという動作を自動化+非表示にさせたいのです。

FTP を使えば解決するのですが、FTPアカウントは 1つしか無い為、
VB 中にアカウント情報を記述するのが怖いのです。
開発環境はVB6、サーバはレンタルサーバです。
よろしくお願い致します。

Aベストアンサー

ブラウザを使用したアップロードは、httpのputです。

なのでVBで実現可能です。

Q動的配列が存在(要素が有る)か否かを判定できますか?

VBAで、「For ループが初期化されていません」エラーが発生します。
動的配列が要素0の時に発生するようです。
動的配列の要素が生成された場合だけ、Forループしたいのですが、
どうやって判定すればよいのでしょうか?
-------------------------------
Dim 配列() As Integer
Dim i As Integer
i = 0
If (i < 0) Then ' 本当は真になったり偽になったり
ReDim 配列(0 To i)
配列(i) = a + b
i = i + 1
End If

'' if ★★★ then '' 配列が有るか確認
For Each c In 配列
MsgBox c
Next
'' end if
-------------------------------

Aベストアンサー

こんにちは。

動的配列の要素が生成された時だけ、For ~Loop するなら、#2 さんのご指摘のように、動的配列を生成したときに、フラグを立てるのが一番簡単ですね。配列変数を、Integerと最初から宣言してしまっていますから、それ自体が変化したことを、値を取り出す方法以外には、チェックできませんね。

以下は未知の変数の配列を調べる場合、VBAでは以下のような方法を使います。

 On Error Resume Next
 dummy = 配列(0)
 Err.Clear  'プロシージャ内で、使いまわしする場合は、必要
 On Error GoTo 0
 If dummy <> Empty Then
  For Each c In 配列
   MsgBox c
  Next
 End If
 dummy = Empty 'dummy を使いまわしする場合は、一旦空にする。

Q[VB6.0] Inet OpenURLのエラー検出

VB6.0

InetコントロールでOpenURLを実行した時、404(File Not Found)等のエラーを検出する方法はありますか?

Aベストアンサー

すみません、ResponseCode や ResponseInfo はクライアント側のエラーでした。
GetHeaderでHTTPレスポンスのヘッダを取得できます。
HTTPヘッダの1行目がHTTPステータスなので、「HTTP/1.0 404 Not Found」などが入ります。

以下を試してみてください。

-----------------------------------
Private Sub Command1_Click()

  Dim strURL As String

  '存在しないアドレス
  strURL = "http://www.msn.co.jp/hadfhg.htm"

  Inet1.OpenURL strURL
  Debug.Print Inet1.GetHeader

End Sub
-----------------------------------
※存在しないURL「http://www.msn.com/hadfhg.htm」は、msn.comサーバーの仕様なのか、なぜかバイナリデータを返してくるようです。
バイナリを受け取るようにすれば良いと思いますが、上記ではとりあえずmsn.co.jpにしてあります。

すみません、ResponseCode や ResponseInfo はクライアント側のエラーでした。
GetHeaderでHTTPレスポンスのヘッダを取得できます。
HTTPヘッダの1行目がHTTPステータスなので、「HTTP/1.0 404 Not Found」などが入ります。

以下を試してみてください。

-----------------------------------
Private Sub Command1_Click()

  Dim strURL As String

  '存在しないアドレス
  strURL = "http://www.msn.co.jp/hadfhg.htm"

  Inet1.OpenURL strURL
  Debug.Print Inet1.GetHeader

E...続きを読む

QVB6で配列を文字列に変換する方法?

VisualBasic6を使っております。

Dim ary() As Byte
Dim s as String

配列を文字列に変換したり、文字列を配列にしたいのですが
どのようにすれば良いのでしょうか?

Aベストアンサー

VBでは、そのまま変数に入れるだけです。

Dim ary() As Byte
Dim s as String

ary = "文字列"
s = ary

'ウォッチウィンドウで変数を見てください。
'以下のように表示されます
ary
ary(0)=135
ary(1)=101
ary(2)=87
ary(3)=91
ary(4)=23
ary(5)=82
s="文字列"

Q「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」の機能を使って実現している様な事を
聞きました。いったい、何が違うのでしょう。

何方か、私のこの疑問を解消して頂けないでしょうか?
よろしくお願いいたします。

最近「VB6」から「VB 2008 Express Edition」へプログラミング環境を
移行したものです。

VB6では「Active X コントロール:インターネットトランスファ(Inet)の
OpenURLメソッド」を使用してHTTPファイルを取得していました。
環境の移行を機に「Windows Internet(WinInet.dll)の機能」を使用して、
VB6の「Inet.OpenURLメソッド」と同様の処理を行おうと考えました。
しかしいざ実行すると、「Inet.OpenURL」だと正常にファイルを取得できるのに、
「WinInet.dll」では異常終了してしまうケースがあり...続きを読む

Aベストアンサー

使ったことも無いので間違ってるかもしれませんが、
System.NET.WebRequest や System.Net.WebResponse を使って実現できませんかね。
http://www.divakk.co.jp/aoyagi/csharp_winexe_05.html


人気Q&Aランキング

おすすめ情報