Blog

Wininet을 통한 다운로드 예제

최고관리자 0 1,077

 

K-7.jpg

 

이번엔 콜백함수까지 넣어봤어요...

클래스로 만들려 했으나 제 실력이 부족한 탓에 ㅋㅋ...

 

별 대단한것도 없으니까 공부용으로만 사용하세요 ㄷㄷ

 

'====================================================
'

' 바람개비(cjh9217)
' http://blog.naver.com/cjh9217
'
' szURL     : 목표 URL
' ReturnByte : 받아온 데이터를 저장할 버퍼
' szHeader : 추가로 보낼 헤더
'
' Return     : 성공시 True, 실패시 False
'
'====================================================

Public Function InternetDownload(ByRef szURL As String, _
                                        ByRef ReturnByte() As Byte, _
                                        Optional ByRef szHeader As String = vbNullString _
                                        ) As Boolean
On Error Goto UnExpectedErr

     Dim hOpen As Long, Ret As Long
    
     hOpen = InternetOpen("HTTPTEST", INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0)
     If hOpen = 0& Then Goto DownloadErr
    
     Ret = InternetOpenUrl(hOpen, szURL, szHeader, CLng(IIf(Len(szHeader), Len(szHeader) + 1&, 0&)), INTERNET_FLAG_RELOAD, ByVal 0&)
     If Ret = 0& Then Goto DownloadErr
    
     Dim Buffer As String, SizeBuf As Long, ContentLength As Long
     Buffer = String$(1024, 0)
     SizeBuf = Len(Buffer)
    
     '--- 파일 크기를 알아온다.
     '--- if 못알아 올시 그냥 패스
     If HttpQueryInfo(Ret, HTTP_QUERY_CONTENT_LENGTH, ByVal Buffer, SizeBuf, ByVal 0&) Then
          ContentLength = CLng(Left$(Buffer, SizeBuf))
     End If
    
     Call CallBackDataSize(ContentLength)

     Dim lngBufSize As Long, sBuf() As Byte, lngRet As Long, TotalBuffer() As Byte, i As Long
    
     '### 이제부터 데이터를 받아온다
     Do
          Call InternetQueryDataAvailable(Ret, lngBufSize, 0&, 0&)

          If lngBufSize Then
               ReDim sBuf(lngBufSize - 1)
               Call InternetReadFile(Ret, sBuf(0), lngBufSize, lngRet)
              
               Call CallBackDownloadFunc(sBuf)
              
               i = i + UBound(sBuf) + 1
               ReDim Preserve TotalBuffer(i - 1)
               RtlMoveMemory TotalBuffer(i - UBound(sBuf) - 1), sBuf(0), UBound(sBuf) + 1&
          Else
               Exit Do
          End If
         
          DoEvents
     Loop
    
     ReturnByte = TotalBuffer
    
     Erase sBuf
     Erase TotalBuffer
     Call InternetCloseHandle(hOpen)
    
     InternetDownload = True
     Exit Function
    
DownloadErr:
     Call InternetCloseHandle(hOpen)
     Exit Function
UnExpectedErr:
     MsgBox "예상하지 못한 오류가 발생하였습니다." & vbCrLf & "에러번호 (" & Err.Number & ") " & Err.Description, vbCritical
     Exit Function

End Function

'### 콜백함수로 지정된 함수입니다.
'### Data : 현재 받아온 데이타
Private Sub CallBackDownloadFunc(Data() As Byte)
    
     If FileSize Then
          GetData = GetData + UBound(Data) + 1
          With Form1
               .lbProgress.Width = CLng(GetData / FileSize * PicWidth)
               .Label3.Caption = CLng(.lbProgress.Width / PicWidth * 100) & "%"
          End With
     End If
    
End Sub

Private Sub CallBackDataSize(ByVal DataLength As Long)
     FileSize = DataLength
     GetData = 0&
     Form1.lbProgress.Width = 0&
     Form1.Label3.Caption = "다운로드 준비중..."
End Sub
 

  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기
  • 카카오스토리로 보내기
  • 네이버밴드로 보내기
  • 네이버로 보내기
  • 텀블러로 보내기
  • 핀터레스트로 보내기

Comments

27 08, 2015

테스트

최고관리자 | 댓글 0 | 조회 1,113 | 추천 0