いつもお世話になっています。
仕事で使ったことがない我流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バイトしか(?)読めなくて、失敗して戻ってきます。
どこに問題があって、改善したら良いのでしょうか。
経験のある方がおられたら、よろしくおねがいします。
問題が再現可能なコードを書いてもらわないと回答が難しいと思います。
すみません、以下のような処理をしています。
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)
> どこに問題があって、改善したら良いのでしょうか。
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 のいずれであっても、構文エラーとなるはずです。
ご教示ありがとうございます。
Dim WebClient As New System.Net.WebClient
WebClient.DownloadFile(JPG_URL, FileName)
上記2行で、目的が達成できました
どうもありがとうございました。
どうもありがとうございました
ちなみにここは、VB2-VB6 専用の掲示板です。
VB.NET は、隣の掲示板での扱いとなりますので、次回からはそちらにどうぞ。
# まぁ、今更ですけれども。
ツイート | ![]() |