如何使用进度条在VB6中下载多个文件?

如何使用进度条在VB6中下载多个文件?,vb6,download,Vb6,Download,我想从VB6应用程序下载多个文件(主要是图像)。目前我正在使用URLDowloadToFile,但它一次只允许一个文件,并且没有进度条。我想下载多个文件和进度条。请帮忙。提前谢谢 我现在的代码是: Dim lngRetVal As Long lngRetVal = URLDownloadToFile(0, URL, LocalFilename, 0, 0) If lngRetVal = 0 Then DownloadFile = True 你希望得到一个VB的答案,但这不是小事 以下大部分内容

我想从VB6应用程序下载多个文件(主要是图像)。目前我正在使用URLDowloadToFile,但它一次只允许一个文件,并且没有进度条。我想下载多个文件和进度条。请帮忙。提前谢谢

我现在的代码是:

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

你希望得到一个VB的答案,但这不是小事

以下大部分内容来自

IBindStatusCallback接口不可用 可直接从VB访问。它必须 引入兼容类型 图书馆

您可以找到类型库 olelib.tlb位于: 要下载的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
您将在此处找到用于执行回调方法的其他资源(向下滚动至底部):

但我真诚地认为,如果你想对它有更多的控制权,你最好自己制作下载功能。VB中的TCP/IP内容实际上非常简单


-Adam

您希望异步下载文件,以便在下载过程中继续执行VB代码。有一种鲜为人知的使用原生VB6的方法,使用UserControl和UserDocument对象的方法,无需API调用


这里有一个非常好的例子,来自著名的VB6大师。AsyncReadProgress事件为您提供了BytesRead和BytesMax,这将允许您显示进度条。

实际上,在VB6中它非常简单-无需API调用。查看我的答案。vb.mvps.org似乎处于脱机状态。知道卡尔的项目现在在哪里吗?如果我能在任何地方找到它,我很想看到完整的例子。它们似乎就在这里。我不知道这是否是一个永久性的问题。看起来所有的示例项目也都缺少了,尽管它们列在