Как загрузить несколько файлов в VB6 с индикатором выполнения?

Я хочу загрузить несколько файлов (в основном изображения) из приложения VB6. в настоящее время я использую URLDownloadToFile, но он разрешает только один файл за раз, и нет индикатора выполнения. Я хочу загрузить несколько файлов и с индикатором выполнения. пожалуйста помоги. заранее спасибо.

мой текущий код:

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

person Community    schedule 11.02.2009    source источник


Ответы (2)


Вы хотите загрузить файл асинхронно, чтобы ваш код VB продолжал выполняться, пока происходит загрузка. Есть малоизвестный способ сделать это с помощью собственного VB6, используя AsyncRead объектов UserControl и UserDocument — нет необходимости в вызовах API.

Вот отличное объяснение и код VB6 для нескольких одновременных загрузок от известного гуру VB6 Карла Петерсона. Событие AsyncReadProgress дает вам BytesRead и BytesMax, что позволит вам отображать индикатор выполнения.

person MarkJ    schedule 11.02.2009
comment
vb.mvps.org, похоже, сейчас не в сети. Есть идеи, где сейчас проекты Карла? Я хотел бы увидеть полный пример, если я могу найти его где-нибудь. - person Jeff; 17.11.2015
comment
Кажется, они находятся здесь test.epeterson.net. Не знаю, навсегда ли это. - person MarkJ; 20.11.2015
comment
Похоже, что и там отсутствуют все образцы проектов, хотя они перечислены по адресу test.epeterson.net/samples. - person Jeff; 24.11.2015

Вы надеетесь получить ответ VB, но это не тривиально.

Большая часть следующего взята с http://www.experts-exchange.com/Programming/Languages/Visual_Basic/Q_20571958.html

Интерфейс IBindStatusCallback недоступен напрямую из VB. Он должен быть введен в библиотеку совместимых типов.

Библиотеку типов olelib.tlb можно найти по адресу: http://www.domaindlx.com/e_morcillo/scripts/type/default.asp Имя zip-файла для загрузки: tl_ole.zip

Вы также найдете примеры того, как его использовать. Не уверен, что вы найдете конкретный пример на IBindStatusCallback или нет, но попробовать стоит.

Вы можете написать свою собственную функцию для преобразования данных в строку, что даст вам полный контроль над всем:

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

Вы найдете дополнительные ресурсы для выполнения метода обратного вызова здесь (прокрутите вниз):

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

Но я искренне думаю, что вам лучше создать собственную функцию загрузки, если вы хотите больше контролировать ее. Работа с TCP/IP в VB на самом деле очень проста.

-Адам

person Adam Davis    schedule 11.02.2009
comment
На самом деле это довольно просто в VB6 - никаких вызовов API не требуется. Смотрите мой ответ. - person MarkJ; 09.04.2009