2009-02-11 6 views
5

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

мой подарок Код:

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

ответ

2

Вы надеетесь на 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 Имя файла почтового индекса для загрузки является: 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 на самом деле очень просто.

-Adam

+0

На самом деле это довольно просто в VB6 - нет необходимости в вызовах API. См. Мой ответ. – MarkJ

+0

Да, я являюсь одиноким кандидатом на ваш ответ. –

+0

Просто остановился здесь - спасибо за upvote Адам. – MarkJ

4

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

Отличный explanation and VB6 code for multiple simultaneous downloads, от известного гуру VB6 Karl Peterson. Событие AsyncReadProgress предоставляет вам BytesRead и BytesMax, которые позволят вам отображать индикатор выполнения.

+0

vb.mvps.org, похоже, отключен. Любая идея, где сейчас находятся проекты Карла? Я бы хотел увидеть полный пример, если найду его где угодно. – Jeff

+1

Они, кажется, здесь http://test.epeterson.net. Я не знаю, если это постоянная вещь. – MarkJ

+0

Похоже, что все примеры проектов также отсутствуют, хотя они перечислены на странице http://test.epeterson.net/samples/ – Jeff