2009-02-11 6 views
5

Tôi muốn tải xuống nhiều tệp (chủ yếu là hình ảnh) từ ứng dụng VB6. hiện tại tôi đang sử dụng URLDownloadToFile nhưng nó chỉ cho phép một tệp tại một thời điểm và không có thanh tiến trình. Tôi muốn tải xuống nhiều tệp và với thanh tiến trình. Hãy giúp tôi. cảm ơn trước.Làm thế nào để tải xuống nhiều tệp trong VB6 với thanh tiến trình?

đang hiện tại của tôi:

Dim lngRetVal As Long 
lngRetVal = URLDownloadToFile(0, URL, LocalFilename, 0, 0) 
If lngRetVal = 0 Then DownloadFile = True 

Trả lời

2

Bạn đang hy vọng cho một câu trả lời VB, nhưng điều này là không tầm thường.

Hầu hết các nội dung sau xuất phát từ http://www.experts-exchange.com/Programming/Languages/Visual_Basic/Q_20571958.html

giao diện IBindStatusCallback không phải là truy cập trực tiếp từ VB. Phải được đưa vào thư viện loại tương thích.

Bạn có thể tìm Type thư viện olelib.tlb dưới: http://www.domaindlx.com/e_morcillo/scripts/type/default.asp Tên file zip để tải về là: tl_ole.zip

Bạn cũng sẽ tìm thấy ví dụ về cách sử dụng nó bao gồm. Bạn không chắc chắn liệu bạn sẽ tìm thấy một ví dụ cụ thể trên IBindStatusCallback không, nhưng nó đáng để thử.

Bạn có thể viết chức năng riêng của bạn để có được các dữ liệu vào một chuỗi, mà sẽ cung cấp cho bạn toàn quyền kiểm soát tất cả mọi thứ:

Option Explicit 

Public Const INTERNET_OPEN_TYPE_PRECONFIG = 0 
Public Const INTERNET_DEFAULT_HTTP_PORT = 80 
Public Const INTERNET_SERVICE_HTTP = 3 
Public Const INTERNET_FLAG_RELOAD = &H80000000 
Public Const HTTP_QUERY_STATUS_CODE = 19 
Public Const HTTP_ADDREQ_FLAG_ADD = &H20000000 

Public 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 
Public Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, ByVal sUsername As String, ByVal sPassword As String, ByVal lService As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long 
Public Declare Function HttpOpenRequest Lib "wininet.dll" Alias "HttpOpenRequestA" (ByVal hHttpSession As Long, ByVal sVerb As String, ByVal sObjectName As String, ByVal sVersion As String, ByVal sReferer As String, ByVal something As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long 
Public Declare Function HttpSendRequest Lib "wininet.dll" Alias "HttpSendRequestA" (ByVal hHttpRequest As Long, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal sOptional As String, ByVal lOptionalLength As Long) As Long 
Public Declare Function HttpQueryInfo Lib "wininet.dll" Alias "HttpQueryInfoA" (ByVal hHttpRequest As Long, ByVal lInfoLevel As Long, ByRef sBuffer As Any, ByRef lBufferLength As Long, ByRef lIndex As Long) As Long 
Public Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer 
Public Declare Function HttpAddRequestHeaders Lib "wininet.dll" Alias "HttpAddRequestHeadersA" (ByVal hHttpRequest As Long, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal lModifiers As Long) As Integer 
Public Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumberOfBytesToRead As Long, lNumberOfBytesRead As Long) As Integer 
Public Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" (ByVal hInternet&, ByVal lpszUrl As String, ByVal lpszHeaders As String, ByVal dwHeadersLength&, ByVal dwFlags&, ByVal dwContext&) As Long 
Public Declare Function InternetQueryDataAvailable Lib "wininet.dll" (ByVal hFile As Long, lpdwNumberOfBytesAvailable As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long 

Public Function GetHTML(strURL As String) As String 
Const BufferSize = 16384 
Dim hSession&, hURL&, lRet&, lBytesAvail& 
Dim Buffer As String * BufferSize 
Dim BufferLen&, sResult$ 
    hSession = InternetOpen(vbNullString, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0) 
    hURL = InternetOpenUrl(hSession, strURL, vbNullString, ByVal 0&, INTERNET_FLAG_RELOAD, ByVal 0&) 
    sResult = "" 
    Do 
     InternetReadFile hURL, Buffer, Len(Buffer), BufferLen 
     If BufferLen > 0 Then sResult = sResult & Left(Buffer, BufferLen) 
    Loop Until BufferLen = 0 
    GetHTML = sResult 
    InternetCloseHandle hURL 
    InternetCloseHandle hSession 
End Function 

Bạn sẽ tìm thấy nguồn lực bổ sung để thực hiện các phương pháp gọi lại đây (di chuyển xuống xuống phía dưới):

http://www.experts-exchange.com/Programming/Languages/.NET/Visual_Basic.NET/Q_21763861.html

http://www.experts-exchange.com/Programming/Languages/.NET/Visual_Basic.NET/Q_21746456.html

Nhưng tôi thành thật nghĩ bạn sẽ tốt hơn khi thực hiện chức năng tải xuống của riêng bạn nếu bạn muốn kiểm soát nhiều hơn. Các công cụ TCP/IP trong VB thực sự rất dễ dàng.

-Adam

+0

Thực ra nó khá đơn giản trong VB6 - không cần gọi API. Xem câu trả lời của tôi. – MarkJ

+0

Đúng, tôi là người phụ thuộc duy nhất trên câu trả lời của bạn. –

+0

Chỉ cần dừng lại ở đây - cảm ơn vì Adam cao quý. – MarkJ

4

Bạn muốn tải xuống tệp không đồng bộ, để mã VB của bạn tiếp tục thực hiện trong khi quá trình tải xuống diễn ra. Có một cách ít được biết đến để làm điều này với native VB6, sử dụng phương thức AsyncRead của các đối tượng UserControl và UserDocument - không cần cho các cuộc gọi API.

Đây là một tuyệt vời explanation and VB6 code for multiple simultaneous downloads, từ guru VB6 nổi tiếng Karl Peterson. Sự kiện AsyncReadProgress cung cấp cho bạn BytesRead và BytesMax, cho phép bạn hiển thị thanh tiến trình.

+0

vb.mvps.org dường như ngoại tuyến. Có ý tưởng nào về dự án của Karl hiện tại không? Tôi rất muốn xem ví dụ đầy đủ nếu tôi có thể tìm thấy nó ở bất cứ đâu. – Jeff

+1

Họ dường như ở đây http://test.epeterson.net. Tôi không biết đây có phải là điều vĩnh viễn hay không. – MarkJ

+0

Dường như tất cả các dự án mẫu đều bị thiếu ở đó, mặc dù chúng được liệt kê tại http://test.epeterson.net/samples/ – Jeff