高分求解:
我用API函数编写的一个下载的程序,但在下载时没有进度条提示目前下载了多少?用哪一位大蛱知道用API函数下载有哪一个API函数可以知道目前下载了进度?

解决方案 »

  1.   

    gz,up!—————————————————————————————————
    ┏━★━━◆━━★━┓ 
    ♂欢|◢CSDN◣|使♂        ▲自由保存帖子,浏览,关注检测
    ┃迎|◥论坛助手◤|用┃        ▲完善的CSDN客户端工具
    ┗━☆━━◇━━━☆┛       ▲自动添加签名......让你更快,更爽,更方便地上CSDN...
    http://www.csdn.net/expert/topic/573/573604.xml
    http://www.chinaok.net/csdn/csdn.zip
      

  2.   

    我是用fileSize = Inet1.GetHeader("Content-length") 得到要下载的文件大小的,然后你可以自己做一个进度条显示.
      

  3.   

    Option Explicit
    Public Const MAX_PATH = 260
    Public Const INTERNET_FLAG_RELOAD = &H80000000
    Public Const NO_ERROR = 0
    Public Const FILE_ATTRIBUTE_READONLY = &H1
    Public Const FILE_ATTRIBUTE_HIDDEN = &H2
    Public Const FILE_ATTRIBUTE_SYSTEM = &H4
    Public Const FILE_ATTRIBUTE_DIRECTORY = &H10
    Public Const FILE_ATTRIBUTE_ARCHIVE = &H20
    Public Const FILE_ATTRIBUTE_NORMAL = &H80
    Public Const FILE_ATTRIBUTE_TEMPORARY = &H100
    Public Const FILE_ATTRIBUTE_COMPRESSED = &H800
    Public Const FILE_ATTRIBUTE_OFFLINE = &H1000
    Public Const INTERNET_FLAG_PASSIVE = &H8000000
    Public Const FORMAT_MESSAGE_FROM_HMODULE = &H800
    Public Const GENERIC_READ = &H80000000
    Public Const GENERIC_WRITE = &H40000000Type WIN32_FIND_DATA
            dwFileAttributes As Long
            ftCreationTime As Currency
            ftLastAccessTime As Currency
            ftLastWriteTime As Currency
            nFileSizeHigh As Long
            nFileSizeLow As Long
            dwReserved0 As Long
            dwReserved1 As Long
            cFileName As String * MAX_PATH
            cAlternate As String * 14
    End TypePublic Const ERROR_NO_MORE_FILES = 18
    Public Const INTERNET_OPEN_TYPE_PRECONFIG = 0
    Public Const INTERNET_INVALID_PORT_NUMBER = 0
    Public Const INTERNET_SERVICE_FTP = 1
    Public Const FTP_TRANSFER_TYPE_BINARY = &H2
    Public Const FTP_TRANSFER_TYPE_ASCII = &H1Declare Function FileTimeToLocalFileTime Lib "kernel32" (lpFileTime As Any, lpLocalFileTime As Any) As LongPublic Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, ByVal lpSource As Long, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long
    Public Declare Function FTPGetFile Lib "wininet.dll" Alias "FtpGetFileA" (ByVal hFtpSession As Long, ByVal lpszRemoteFile As String, ByVal lpszNewFile As String, ByVal fFailIfExists As Boolean, ByVal dwFlagsAndAttributes As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean
    Public Declare Function FtpRenameFile Lib "wininet.dll" Alias "FtpRenameFileA" (ByVal hFtpSession As Long, ByVal lpszOldName As String, ByVal lpszNewName As String) As Boolean
    Public Declare Function FtpCreateDirectory Lib "wininet.dll" Alias "FtpCreateDirectoryA" (ByVal hFtpSession As Long, ByVal lpszName As String) As Boolean
    Public Declare Function FtpRemoveDirectory Lib "wininet.dll" Alias "FtpRemoveDirectoryA" (ByVal hFtpSession As Long, ByVal lpszName As String) As BooleanPublic Declare Function FtpDeleteFile Lib "wininet.dll" Alias "FtpDeleteFileA" (ByVal hFtpSession As Long, ByVal lpszFileName As String) As Boolean
    Public Declare Function FtpOpenFile Lib "wininet.dll" Alias "FtpOpenFileA" (ByVal hFtpSession As Long, ByVal sBuff As String, ByVal Access As Long, ByVal Flags As Long, ByVal Context As Long) As Long
    Public Declare Function FTPPutFile Lib "wininet.dll" Alias "FtpPutFileA" (ByVal hFtpSession As Long, ByVal lpszLocalFile As String, ByVal lpszRemoteFile As String, ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean
    Public Declare Function FtpSetCurrentDirectory Lib "wininet.dll" Alias "FtpSetCurrentDirectoryA" (ByVal hFtpSession As Long, ByVal lpszDirectory As String) As Boolean
    Public Declare Function FtpGetCurrentDirectory Lib "wininet.dll" Alias "FtpGetCurrentDirectoryA" (ByVal hFtpSession As Long, ByVal lpszCurrentDirectory As String, lpdwCurrentDirectory As Long) As Boolean
    Public Declare Function FtpFindFirstFile Lib "wininet.dll" Alias "FtpFindFirstFileA" (ByVal hFtpSession As Long, ByVal lpszSearchFile As String, lpFindFileData As WIN32_FIND_DATA, ByVal dwFlags As Long, ByVal dwContent As Long) As LongPublic Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpLibFileName As String) As LongPublic Declare Function InternetFindNextFile Lib "wininet.dll" Alias "InternetFindNextFileA" (ByVal hFind As Long, lpvFindData As WIN32_FIND_DATA) As Long
    Public Declare Function InternetWriteFile Lib "wininet.dll" (ByVal hFile As Long, ByRef sBuffer As Byte, ByVal lNumBytesToWrite As Long, dwNumberOfBytesWritten As Long) As Integer
    Public Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByRef sBuffer As Byte, ByVal lNumBytesToRead As Long, dwNumberOfBytesRead As Long) As Integer
    Public Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Long
    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 InternetGetLastResponseInfo Lib "wininet.dll" Alias "InternetGetLastResponseInfoA" (ByRef lpdwError As Long, ByVal lpszErrorBuffer As String, ByRef lpdwErrorBufferLength As Long) As BooleanConst rDayZeroBias As Double = 109205#   ' Abs(CDbl(#01-01-1601#))
    Const rMillisecondPerDay As Double = 10000000# * 60# * 60# * 24# / 10000#
      

  4.   

    Private Hopen As Long
    Private HConnection As Long
    Private sUser, sPassword As String
    Private Const BUFFERSIZE = 255
    Private DB As New Connection
    Private Rs_VER As New Recordset '返回服务器的版本
    Private Sub Command1_Click()
        Dim Data(BUFFERSIZE - 1) As Byte ' array of 100 elements 0 to 99
        Dim Written As Long
        Dim Size As Long
        Dim Sum As Long
        Dim lBlock As Long
        Dim sLocal As String
        Dim sRemote As String
        sLocal = App.Path + "\升级版.exe"
        sRemote = Rs_VER("EXEName")
        Sum = 0
        lBlock = 0
        
        sLocal = Trim(sLocal)
        sRemote = Trim(sRemote)
        
        Pb.Max = 100
        Pb.Min = 0
        
        Pb.Enabled = True
        If sLocal <> "" And sRemote <> "" Then
             Size = GetFTPFileSize(sRemote)
              hFile = FtpOpenFile(HConnection, sRemote, GENERIC_READ, dwType, 0)
              If hFile = 0 Then
                  MsgBox Err.Description
                  Exit Sub
              End If
              
              Open sLocal For Binary Access Write As #1
              Seek #1, 1
              Sum = 1
              For lBlock = 1 To Size \ BUFFERSIZE
                  If (InternetReadFile(hFile, Data(0), BUFFERSIZE, Written) = 0) Then
                      MsgBox "错误,不能完成升级", vbOKOnly, "错误"
                      End
                      Close #1
                      Exit Sub
                  End If
                  Put #1, , Data
                  
                  Pb.Value = CSng(lBlock * BUFFERSIZE / Size) * 100 '进度条的指
                  PbValue.Caption = Left(Pb.Value, 3) + "%" '进度条显示的值
                  
                  DoEvents
                  Sum = Sum + BUFFERSIZE
                  'RaiseEvent FileTransferProgress(Sum, Size)
              Next lBlock
              
              ReDim Data2((Size Mod BUFFERSIZE) - 1) As Byte
              If (InternetReadFile(hFile, Data2(0), Size Mod BUFFERSIZE, Written) = 0) Then
                  MsgBox Err.Description
                  Close #1
                  Exit Sub
              End If
                          
              Put #1, , Data2
              
              Sum = Sum + (Size Mod BUFFERSIZE)
              Size = Sum
              'RaiseEvent FileTransferProgress(Sum, Size)
              Close #1
              
              PbValue.Caption = "100%" '下载完成
              InternetCloseHandle (hFile)
         End If
    End SubPrivate Sub Form_Load()
       If VER = False Then
          MsgBox "没有最新版本,不用进行升级", vbOKOnly, "消息"
          End
       End If
          
       Hopen = InternetOpen("eDIY FTP Client", INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
        If Hopen = 0 Then
            MsgBox Err.Description
            End
        End If
        dwType = FTP_TRANSFER_TYPE_BINARY
        dwSeman = 0
        HConnection = 0
        If HConnection <> 0 Then
            InternetCloseHandle HConnection
        End If
        'INTERNET_INVALID_PORT_NUMBER 默认分配的端口号
        HConnection = InternetConnect(Hopen, Trim(Rs_VER("ftpserver")), INTERNET_INVALID_PORT_NUMBER, sUser, sPassword, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0)
        If HConnection = 0 Then
            MsgBox "错误,不能完成升级", vbOKOnly, "错误"
            End
        End If
        
    End Sub
    '获得文件大小
    Private Function GetFTPFileSize(sFile As String) As Long
        Dim szDir As String
        Dim hFind As Long
        Dim nLastError As Long
        Dim pData As WIN32_FIND_DATA
        
        hFind = FtpFindFirstFile(HConnection, sFile, pData, 0, 0)
        If hFind = 0 Then
            MsgBox "错误,不能完成升级", vbOKOnly, "错误"
            End
            Exit Function
        End If
               
        GetFTPFileSize = pData.nFileSizeLow
        InternetCloseHandle (hFind)
    End Function
    '检查是否需要升级
    Private Function VER() As Boolean
        
        Dim B() As Byte '保存文件数组
        Dim LocalVer() As Byte '本地版本
        Dim SlocalVer As String '本地版本字符串形式
       '新建版本文件,默认版本为1。0
        If Dir(App.Path + "\ver.dat", vbNormal) = "" Then
           Open App.Path + "\Ver.dat" For Binary As #1
              Put #1, , "1.0"
           Close #1
        End If
        DB.Open "Provider=SQLOLEDB.1;Persist Security Info=false;Initial Catalog=jx;uid=sa;pwd=hkjxxxz;Data Source=cxj"
        Set Rs_VER = DB.Execute("select * from ver")
        ReDim LocalVer(0 To FileLen(App.Path + "\ver.dat"))
        
        Open App.Path + "\ver.dat" For Binary As #1
             Get #1, 1, LocalVer()
        Close #1
        For i = 0 To UBound(LocalVer) - 1
            SlocalVer = SlocalVer + Chr(LocalVer(i))
        Next
        If CSng(SlocalVer) < CSng(Rs_VER("VER")) Then
            VER = True
        Else
            VER = False
        End If
    End Function
      

  5.   

    http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=71841
      

  6.   

    “先判断文件总大小
    一定时间时
    用现在以下载文件大小跟他做对比就知道了“
    ————请问:怎么获得“现在下载的文件大小“,用什么函数(winInet.dll下的)可以获得?