2009-02-11 13 views
5

Chcę pobrać wiele plików (głównie obrazy) z aplikacji VB6. obecnie używam URLDownloadToFile, ale pozwala tylko jeden plik na raz i nie ma paska postępu. Chcę pobrać wiele plików i pasek postępu. proszę pomóż. z góry dziękuję.Jak pobrać wiele plików w VB6 za pomocą paska postępu?

mój obecny kod:

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

Odpowiedz

2

pan nadzieję na odpowiedź VB, ale to nie jest trywialne.

Większość z poniższych pochodzi z http://www.experts-exchange.com/Programming/Languages/Visual_Basic/Q_20571958.html

interfejsu IBindStatusCallback nie jest dostępny bezpośrednio z VB. Musi on zostać dodany do kompatybilnej biblioteki typu .

można znaleźć Type Library olelib.tlb Under: http://www.domaindlx.com/e_morcillo/scripts/type/default.asp Nazwa pliku zip do pobrania jest: tl_ole.zip

można również znaleźć przykłady, w jaki sposób używać go włączone. Nie wiesz, czy znajdziesz konkretny przykład na IBindStatusCallback na nie, ale warto warto spróbować.

Możesz napisać własną funkcję, aby uzyskać dane na sznurku, które dadzą Ci pełną kontrolę nad wszystkim:

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 

znajdziesz dodatkowe zasoby do wykonywania metody wywołania zwrotnego tutaj (w dół do spodzie)

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

Ale szczerze uważam, że lepiej będzie zrobić własną funkcję pobierania, jeśli chcesz mieć nad nią większą kontrolę. Rzeczy TCP/IP w VB są w rzeczywistości bardzo łatwe.

-Adam

+0

W VB6 jest to całkiem proste - bez konieczności wykonywania połączeń API. Zobacz moją odpowiedź. – MarkJ

+0

Tak, jestem samotny upvote na twoją odpowiedź. –

+0

Właśnie zatrzymałem się tutaj - dzięki za upomnienie Adam. – MarkJ

4

chcesz pobrać plik asynchronicznie, dzięki czemu kod VB kontynuuje wykonywanie podczas pobierania dzieje. Jest tam mało znany sposób na to, używając natywnego VB6, używając metody AsyncRead obiektów UserControl i UserDocument - nie ma potrzeby wywoływania interfejsu API.

Oto doskonały explanation and VB6 code for multiple simultaneous downloads, od renomowanego guru VB6 Karl Peterson. Zdarzenie AsyncReadProgress udostępnia opcje BytesRead i BytesMax, które umożliwiają wyświetlanie paska postępu.

+0

vb.mvps.org wydaje się być offline. Czy wiesz, gdzie są teraz projekty Karla? Chciałbym zobaczyć pełny przykład, czy mogę go znaleźć w dowolnym miejscu. – Jeff

+1

Wygląda na to, że są tutaj http://test.epeterson.net. Nie wiem, czy to jest stałe. – MarkJ

+0

Wygląda na to, że brakuje również wszystkich przykładowych projektów, chociaż są one wymienione na stronie http://test.epeterson.net/samples/ – Jeff

Powiązane problemy