InternetReadFile で web 上のjpgを取り込み

解決


わかりたい、  2008-09-08 18:31:15  No: 101049

いつもお世話になっています。
仕事で使ったことがない我流vbユーザーです。

例えば、web上の
http://i.yimg.jp/images/mlb/y_top/matsui_2.jpg
の画像をieでは「ファイル」-「名前を付けて保存」でファイルに落とすことができます。

それを
Public Declare Function InternetReadFile Lib "wininet.dll" _
(ByVal hFile As Long, _
ByVal sBuffer As Byte, _
ByVal lNumBytesToRead As Long, _
ByVal lNumberOfBytesRead As Long) As Long

を使って、ファイルに読み込もうとすると、0バイトしか(?)読めなくて、失敗して戻ってきます。

どこに問題があって、改善したら良いのでしょうか。

経験のある方がおられたら、よろしくおねがいします。


  2008-09-08 19:02:41  No: 101050

問題が再現可能なコードを書いてもらわないと回答が難しいと思います。


わかりたい  2008-09-08 19:19:02  No: 101051

すみません、以下のような処理をしています。

Dim FileName As String
Dim FileNumber As Integer
Dim hOpen As Long
Dim hConnect As Long
Dim buf() As Byte 
Dim dwSize As Long

FileNumber = FreeFile()
FileOpen(FileNumber, FileName, OpenMode.Binary)
call hOpen = InternetOpen(UserAgent, INTERNET_OPEN_TYPE_DIRECT,vbNullString, vbNullString, 0)

call hConnect = InternetOpenUrl(hOpen, URL, vbNullString, 0,                               INTERNET_FLAG_RELOAD, 0)
Do
       '動的配列の大きさを定義
        ReDim buf(1024)
        '配列の先頭要素を渡す
        InternetReadFile( hConnect, buf(1), 1024, dwSize)
        'データ取得サイズを見て終了を判断
        If dwSize = 0 Then
            Exit Do
        Else
            '動的配列の大きさを再定義
            ReDim Preserve buf(1 To dwSize)
            'ファイルへ書き込み
            FilePutObject(FileNumber, bytArray)
        End If
        '配列を消去
        Erase buf
    Loop
call InternetCloseHandle hConnect
call InternetCloseHandle hOpen
FileClose(FileNumber)


魔界の仮面弁士  2008-09-09 01:45:49  No: 101052

> どこに問題があって、改善したら良いのでしょうか。
VB2005/VB2008 であれば、API を使わずとも、
  My.Computer.Network.DownloadFile(URL, "C:\matsui2.jpg")
とするだけで取得できますよ。

あるいは、System.Net.WebRequest を使って取得することもできます。

> を使って、ファイルに読み込もうとすると、
ByVal/ByRef の使い分けが正しく無いようです。それでは、
VB.NET でも VB6/VBA でも、期待動作とはならないでしょう。

VB.NET であれば、こんな感じ。

'Imports System.Runtime.InteropServices
Private Declare Unicode Function InternetReadFile Lib "wininet" _
  (ByVal hFile As IntPtr, _
   <MarshalAs(UnmanagedType.LPArray)> ByVal lpBuffer() As Byte, _
   ByVal dwNumberOfBytesToRead As UInteger, _
   ByRef lpdwNumberOfBytesRead As UInteger _
  ) As <MarshalAs(UnmanagedType.Bool)> Boolean

VB6/VBA であれば、こんな感じ。

Private Declare Function InternetReadFile Lib "wininet" Alias "InternetReadFileA" _
  (ByVal hFile As Long, _
   ByRef lpBuffer As Byte, _
   ByVal dwNumberOfBytesToRead As Long, _
   ByRef lpdwNumberOfBytesRead As Long _
  ) As Long

> すみません、以下のような処理をしています。
Declare や Const なども一緒に書いてください。(不足情報があると、試すことができませんので)
第三者が貼り付けてそのまま実行できる、『問題を再現可能なコード』を掲載してください。

> FileOpen(FileNumber, FileName, OpenMode.Binary)
この構文は、VB.NET の物ですね。

> call hOpen = InternetOpen(UserAgent, INTERNET_OPEN_TYPE_DIRECT,vbNullString, vbNullString, 0)
実際に使っているコードを掲載してください。提示されたコードでは、
VB.NET/VB6/VBA/VBScript のいずれであっても、構文エラーとなるはずです。


わかりたい  2008-09-09 02:36:07  No: 101053

ご教示ありがとうございます。

        Dim WebClient As New System.Net.WebClient

        WebClient.DownloadFile(JPG_URL, FileName)

上記2行で、目的が達成できました

どうもありがとうございました。


わかりたい  2008-09-09 02:37:05  No: 101054

どうもありがとうございました


魔界の仮面弁士  2008-09-09 03:17:22  No: 101055

ちなみにここは、VB2-VB6 専用の掲示板です。
VB.NET は、隣の掲示板での扱いとなりますので、次回からはそちらにどうぞ。

# まぁ、今更ですけれども。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加