none
windowsAPI(wininet.dll)を利用したファイルダウンロードについて RRS feed

  • 質問

  • お世話になっております。

    ハンディ端末の開発をしており、xmlファイルやexeファイルをダウンロードするアプリケーションを作成しようとしています。

    使用するハンディ端末の性質上、webRequestでのファイルダウンロードができず、InternetReadFileによるダウンロードを行いましたが、ファイルの取得がうまくできません。

    各関数ごとのハンドルは、必ず何かしらの値が返され、Err.LastDllErrorの戻値も0(正常)で返ってきますが、InternetReadFileで受取のファイルサイズが0になり、受信バッファにも何も格納されていませんでした。

    ご教授願い致します。

    開発環境:visual Studio 2008(.NET Compact Framework 3.5)

    実行環境:windowsCE 6.o

    処理の大まかな流れ

    ’宣言

    Private Declare Function InternetReadFile Lib "wininet.dll" _
            (ByVal hFile As Integer, _
            ByRef llpBuffer As Byte, _
            ByVal dwNumberOfBytesToRead As Integer, _
            ByRef lpdwNumberOfBytesRead As Integer) As Boolean

     Private Declare Function InternetOpen Lib "wininet.dll" Alias _
            "InternetOpenW" (ByVal sAgent As String, _
                             ByVal lAccessType As Integer, _
                             ByVal sProxyName As String, _
                             ByVal sProxyBypass As String, _
                             ByVal lFlags As Integer) As Integer
        Private Declare Function InternetConnect  Lib "wininet.dll" _
                  Alias "InternetConnectW" _
                 (ByVal hInternet As Integer _
                , ByVal lpszServerName As String _
                , ByVal nServerPort As Integer _
                , ByVal lpszUsername As String _
                , ByVal lpszPassword As String _
                , ByVal dwService As Integer _
                , ByVal dwFlags As Integer _
                , ByVal dwContext As Integer) As Integer    
        Private Declare Function HttpOpenRequest Lib "wininet.dll" _
                  Alias "HttpOpenRequestW" _
                 (ByVal hConnect As Integer _
                , ByVal lpszVerb As String _
                , ByVal lpszObjectName As String _
                , ByVal lpszVersion As String _
                , ByVal lpszReferer As String _
                , ByVal lpszAcceptTypes As Integer _
                , ByVal dwFlags As Integer _
                , ByVal dwContext As Integer) As Integer

        '(General)(Declarations)へ記述します
        Private Declare Function HttpSendRequest _
                    Lib "wininet.dll" _
                  Alias "HttpSendRequestW" _
                 (ByVal hRequest As Integer _
                , ByVal lpszHeaders As String _
                , ByVal dwHeadersLength As Integer _
                , ByVal lpOptional As String _
                , ByVal dwOptionalLength As Integer) As Integer


    ’インターネットサービスオープン

    hInet = InternetOpen("WININET", INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)

    ’サーバーへ接続

    hConnect = InternetConnect(hInet, "[IPアドレス]", INTERNET_DEFAULT_HTTP_PORT, Nothing, Nothing, INTERNET_SERVICE_HTTP, 0, 0)

    ’HTTPリクエストの作成

    Dim st As String = ("[URL]").PadRight(255, " "c) '半角スペースで埋める

    hInternetRequest = HttpOpenRequest(hConnect, "GET", st, "HTTP/1.1", "", 0, INTERNET_FLAG_RELOAD, 0)

    ’HTTPリクエストを送信

    hSendRequest = HttpSendRequest(hInternetRequest, vbNullString, 0, vbNullString, 0)

    ’ファイルを取得

    Dim bytRecvData() As Byte
    ReDim bytRecvData(2048)      '受信バッファ確保

    Dim ret As Boolean = InternetReadFile(hInternetRequest , bytRecvData(p), SIZE_RECV_BUFFER, intSizeRecv)

    エラーコード取得

     fcConnect = Err.LastDllError

    2013年9月11日 5:45

回答

すべての返信

  • Windows CE 6.0 で試したことはないので外しているかもしれません。

    なぜ、st を半角スペースで埋めているのでしょうか?
    HttpOpenRequest の 第 3 引数 は null-terminated string であり、空白パディングが必要に見えなかったためです。

    2013年9月11日 14:09
    モデレータ
  • vb.netでの、資料が少なくVBAを参考にして今回作成しました。

    参考にさせていただいたサイトに

    >なお、ここに指定する内容は「255文字の固定長文字列」にしましょう。

    との記述がありました。

    実際、255文字の固定長文字列の場合はHttpOpenRequestの後にfcConnect = Err.LastDllErrorでエラー情報を調べたら、0(正常)が返ってきましたが、空白埋めをしていない状態でHttpOpenRequestを呼ぶと122(

    システムコールに渡されたデータ領域が小さすぎます。)の値が返ってきてしまったためです
    2013年9月12日 0:34
  • 違いましたか。失礼しました。
    次に打つ手があるとすれば、HttpQueryInfo で STATUS_CODE を採ってみて、200 など、正常系の値が取得できているかどうかを確認するところでしょうか。

    • 回答の候補に設定 星 睦美 2013年9月20日 2:23
    • 回答としてマーク 星 睦美 2013年9月25日 7:26
    2013年9月12日 14:49
    モデレータ
  • フォーラム オペレーターの星 睦美です。
    ayumickey さん、こんにちは

    引き続き返信がないようですので、今回はAzulean さんからのアドバイスでトラブルシューティングの糸口が見つかったのではないかと思います。私のほうで[回答の候補に設定]のマークをしましたが、引き続き質問がありましたら遠慮なく[回答の候補の設定解除] をして返信いただけます。

    ※ユーザー同士の情報交換がより活発になりますように、参考になる回答には投稿者から[回答としてマーク]をお願いします。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2013年9月20日 2:37