2009-02-11 7 views
5

Desidero scaricare più file (principalmente immagini) dall'applicazione VB6. attualmente sto usando URLDownloadToFile ma permette solo un file alla volta e non c'è una barra di avanzamento. Voglio scaricare più file e con la barra di avanzamento. per favore aiuto. Grazie in anticipo.Come scaricare più file in VB6 con barra di avanzamento?

il mio codice attuale:

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

risposta

2

si sta sperando per una risposta VB, ma questo non è banale.

La maggior parte del seguente viene da http://www.experts-exchange.com/Programming/Languages/Visual_Basic/Q_20571958.html

interfaccia IBindStatusCallback non è accessibile direttamente da VB. È necessario immettere in una libreria compatibile con tipo .

È possibile trovare il tipo di libreria olelib.tlb sotto: http://www.domaindlx.com/e_morcillo/scripts/type/default.asp Il nome del file zip per il download è: tl_ole.zip

Troverete anche esempi su come utilizzare ad essa inclusi. Non sei sicuro che tu sia troverai un esempio specifico su IBindStatusCallback su no, ma è lo che vale la pena provare.

È possibile scrivere la propria funzione per ottenere i dati in una stringa, che vi darà il pieno controllo su tutto:

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 

Troverete ulteriori risorse per fare il metodo di callback qui (scorrere verso il basso al fondo):

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

Ma sinceramente penso che starai meglio a creare la tua funzione di download se vuoi avere più controllo su di essa. Roba TCP/IP in VB è in realtà molto semplice.

-Adam

+0

In realtà è abbastanza semplice in VB6 - nessuna chiamata API necessaria. Vedi la mia risposta. – MarkJ

+0

Sì, sono l'unico sopravvissuto della tua risposta. –

+0

Appena fermato qui - grazie per l'upvote Adam. – MarkJ

4

Si desidera scaricare il file in modo asincrono, in modo che il codice VB continua esecuzione mentre il download avviene. Lì è un modo poco noto per eseguire questa operazione con VB6 nativo, utilizzando il metodo AsyncRead di oggetti UserControl e UserDocument, senza necessità di chiamate API.

Ecco un eccellente explanation and VB6 code for multiple simultaneous downloads, dal famoso guru VB6 Karl Peterson. L'evento AsyncReadProgress ti dà BytesRead e BytesMax, che ti permetteranno di visualizzare una barra di avanzamento.

+0

vb.mvps.org sembra essere offline. Qualche idea su dove sono i progetti di Karl adesso? Mi piacerebbe vedere l'esempio completo se riesco a trovarlo ovunque. – Jeff

+1

Sembra che siano qui http://test.epeterson.net. Non so se questa è una cosa permanente. – MarkJ

+0

Sembra che manchino anche tutti i progetti di esempio, anche se sono elencati su http://test.epeterson.net/samples/ – Jeff