"ダウンローダーを作る"
はじめに
大きなファイルなどをダウンロードする時に便利かもしれない、ダウンローダーを作っていこうと思います。壁紙チェンジャー以来の連載ものです。 |
最終更新日 2001 09/09
第一回 とりあえずダウンロード
IE3以降がインストール済みでなければダメなのですが、WinInet.dllを利用します。これをもちいれば、比較的簡単に、httpやftpが利用可能です。で、今回使用するAPIの定義を以下にしめします。 |
Declare Function InternetOpen Lib
"wininet.dll" Alias
"InternetOpenA" _ (ByVal sAgent As String, _ ByVal lAccessType As Long, _ ByVal sProxyName As String, _ ByVal sProxyBypass As String, _ ByVal lFlags As Long) As Long Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" _ (ByVal hInternetSession As Long, _ ByVal sUrl As String, _ ByVal sHeaders As String, _ ByVal lHeadersLength As Long, _ ByVal lFlags As Long, _ ByVal lContext As Long) As Long Declare Function InternetReadFile Lib "wininet.dll" _ (ByVal hFile As Long, _ ByRef lpBuffer As Any, _ ByVal lNumBytesToRead As Long, _ ByRef lNumberOfBytesRead As Long) As Long Declare Function InternetCloseHandle Lib "wininet.dll" _ (ByVal hInet As Long) As Long Const INTERNET_OPEN_TYPE_PRECONFIG = 0 Const INTERNET_OPEN_TYPE_DIRECT = 1 Const INTERNET_OPEN_TYPE_PROXY = 3 Const INTERNET_INVALID_PORT_NUMBER = 0 Const INTERNET_FLAG_ASYNC = &H10000000 Const INTERNET_FLAG_FROM_CACHE = &H1000000 Const INTERNET_FLAG_OFFLINE = &H1000000 Const INTERNET_FLAG_RELOAD = &H80000000 Const INTERNET_FLAG_NO_CACHE_WRITE = &H4000000 Const INTERNET_FLAG_NO_AUTO_REDIRECT = &H200000 Const INTERNET_FLAG_PRAGMA_NOCACHE = &H100 |
となっています。
では、プログラムをかいてみましょう。標準モジュールに
'インターネットハンドル保存用 Dim hIntnet As Long 'URLハンドル保存用 Dim hURL As Long Public Function OpenHTTPFile(URL As String)As Boolean '戻り値の初期化 OpenHTTPFile = False 'インターネットハンドル取得 hIntnet = InternetOpen("Sample",INTERNET_OPEN_TYPE_PRECONFIG,vbNullString, vbNullString, 0) '失敗したら抜ける If hIntnet = 0 Then Exit Function 'URLハンドル取得 hURL = InternetOpenUrl(hIntnet,URL,vbNullString,0,INTERNET_FLAG_RELOAD,0) '失敗の時 If hURL = 0 Then InternetCloseHandle hIntnet Exit Function End If OpenHTTPFile = True End Function Public Function GetHTTPFile(ByRef Buff() As Byte) As Long Dim lngRC As Long Dim BytesRead As Long lngRC = InternetReadFile(hURL, Buff(0), 1024, BytesRead) If lngRC = 0 Or BytesRead = 0 Then GetHTTPFile = 0 Else GetHTTPFile = BytesRead End If End Function Public Sub CloseHTTPFile() InternetCloseHandle hURL InternetCloseHandle hIntnet End Sub Public Sub DownLoadFile(URL As String , SaveFile As String) 'データ保存用 Dim ReadData() As Byte '戻り値格納・サイズ指定 Dim lngRC As Long 'URL・保存場所が指定してあるか? If URL <> "" And SaveFile <> "" Then '保存先を開く Open SaveFile For Binary As #1 'URLを開く If OpenHTTPFile(URL) = True Then '読み込みバッファの初期化・確保 ReDim ReadData(1023) '読み込み lngRC = GetHTTPFile(ReadData()) '読み込みが終わるまで繰り返す。 Do Until lngRC = 0 '保存のため配列のサイズを調整 ReDim Preserve ReadData(lngRC - 1) 'ディスクに書き込み Put #1, , ReadData 'システムに制御を戻す。(長時間ループにおちいる場合にそなえて) DoEvents 'データ読み込み lngRC = GetHTTPFile(ReadData()) Loop End If '閉じる CloseHTTPFile Close #1 End If 'メッセージ表示 MsgBox "ダウンロード終了" End Sub |
これでファイルのダウンロードができます。
使い方は DownLoadFile URL名 , 保存先 でできます。(多分)
とりあえず今回はここまで。では・・・・。
次回はプロキシサーバーかな。レジューム機能は3か4回目あたりでやる予定。