【问题标题】:How to download multiple files in VB6 with progress bar?如何在VB6中使用进度条下载多个文件?
【发布时间】:2009-02-11 16:25:04
【问题描述】:

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

我现在的代码:

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

【问题讨论】:

    标签: vb6 download


    【解决方案1】:

    您希望异步下载文件,以便在下载发生时您的 VB 代码继续执行。 一种鲜为人知的方法来使用本机 VB6 执行此操作,使用 UserControl 和 UserDocument 对象的 AsyncRead 方法 - 无需 API 调用。

    这是一个出色的explanation and VB6 code for multiple simultaneous downloads,来自著名的 VB6 大师Karl Peterson。 AsyncReadProgress 事件为您提供 BytesRead 和 BytesMax,这将允许您显示进度条。

    【讨论】:

    • vb.mvps.org 似乎已离线。知道 Karl 的项目现在在哪里吗?如果我能在任何地方找到完整的示例,我很乐意看到它。
    • 他们似乎在这里test.epeterson.net。我不知道这是否是永久性的。
    • 看起来所有示例项目都在那里丢失了,尽管它们列在test.epeterson.net/samples
    【解决方案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 要下载的 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

    但老实说,如果你想更好地控制它,我认为你最好制作自己的下载功能。 VB 中的 TCP/IP 东西其实很简单。

    -亚当

    【讨论】:

    • 实际上在 VB6 中这很简单——不需要 API 调用。看我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    相关资源
    最近更新 更多