InternetReadFile如何正确读取二进制文件

 
手上的一个VB项目(过程中发现,.Net果然是好啊),需要在一个ActiveX中实现HTTP下载功能,我是采用InternetreadFile这个API来实现,一开始的代码我是这么写的
 
InternetReadFile如何正确读取二进制文件Function Gethttpdownload(sUrl As StringAs boolen
InternetReadFile如何正确读取二进制文件 
InternetReadFile如何正确读取二进制文件
Dim s As String
InternetReadFile如何正确读取二进制文件
Dim hOpen As Long
InternetReadFile如何正确读取二进制文件
Dim hOpenUrl As Long
InternetReadFile如何正确读取二进制文件
Dim bDoLoop As Boolean
InternetReadFile如何正确读取二进制文件
Dim bRet As Boolean
InternetReadFile如何正确读取二进制文件
Dim sReadBuffer As String * 2048
InternetReadFile如何正确读取二进制文件
Dim lNumberOfBytesRead As Long
InternetReadFile如何正确读取二进制文件hOpen 
= InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
InternetReadFile如何正确读取二进制文件hOpenUrl 
= InternetOpenUrl(hOpen, sUrl, vbNullString, 0, INTERNET_FLAG_RELOAD, 0)
InternetReadFile如何正确读取二进制文件 bDoLoop 
= True
InternetReadFile如何正确读取二进制文件 
Do While bDoLoop
InternetReadFile如何正确读取二进制文件  sReadBuffer 
= vbNullString
InternetReadFile如何正确读取二进制文件  bRet 
= InternetReadFile(hOpenUrl, sReadBuffer, Len(sReadBuffer), lNumberOfBytesRead)
InternetReadFile如何正确读取二进制文件  s 
= s & Left$(sReadBuffer, lNumberOfBytesRead)
InternetReadFile如何正确读取二进制文件  
If Not CBool(lNumberOfBytesRead) Then bDoLoop = False
InternetReadFile如何正确读取二进制文件  
Loop
InternetReadFile如何正确读取二进制文件FileName 
= "E:\BitSpirit\Torrent\121212.torrent"
InternetReadFile如何正确读取二进制文件
F1 = FreeFile
InternetReadFile如何正确读取二进制文件Open FileName 
For Binary As F1
InternetReadFile如何正确读取二进制文件Put F1, , s
InternetReadFile如何正确读取二进制文件Close F1
InternetReadFile如何正确读取二进制文件 
If hOpen <> 0 Then InternetCloseHandle (hOpen)
InternetReadFile如何正确读取二进制文件 Gethttpdownload 
= true
InternetReadFile如何正确读取二进制文件 
End Function
InternetReadFile如何正确读取二进制文件
 
上面方法,用来获取服务器上的文本类型的文件一点问题,都没有,但是用来下载二进制文件的时候 就出现问题了,里面的数据怎么也不对,研究了下载下来的文件后发现,问题外话应该是在接收数据的变量是个STRING的定长字符串上。但是在网上查了好久,甚至M$ MSDN上的一个用VB来实现下载的程也是用 string类型来接收数据的而且网上的代码写法,基本上也都是这个样,好来才好现,都是从MSDN上的哪个例程上演变过来的.
       我想如果能用一个byte数组来代替定长字符串,哪可能就没有问题了,但是查看了一个VB 对Internetreadfile的申明
Public Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer
发现其定义ByVal sBuffer As String 看来只能用String了,在网上查找过程中,发现人家用VC写的程序中这人参数可以是其它的,所以查看了一下Internetreadfile的原型。发现的确可以, 所以我把internetreadfile的定义修改了一下,为了通用,我为新的internetreadfile定义了一个别名。Internetreadfilebyte申明如下:
Public Declare Function InternetReadFileByte Lib "wininet.dll" Alias "InternetReadFile" (ByVal hFile As Long, ByRef sBuffer As Byte, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer
试了一下的确可以,重新修改函数,(在这过程中发现,如果要取到正确数据,还必须取得文件大小。所以增加了HttpQueryInfo的定义)最后完整的函数
InternetReadFile如何正确读取二进制文件Function FileDownload(sUrl As Variant) As Boolean
InternetReadFile如何正确读取二进制文件        
Dim b(99As Byte
InternetReadFile如何正确读取二进制文件        
Dim EndByte() As Byte
InternetReadFile如何正确读取二进制文件        
Dim s As String
InternetReadFile如何正确读取二进制文件        
Dim hOpen As Long
InternetReadFile如何正确读取二进制文件        
Dim hOpenUrl As Long
InternetReadFile如何正确读取二进制文件        
Dim bDoLoop As Boolean
InternetReadFile如何正确读取二进制文件        
Dim bRet As Boolean
InternetReadFile如何正确读取二进制文件        
Dim bbuffer As Byte
InternetReadFile如何正确读取二进制文件        
Dim sReadBuffer As String
InternetReadFile如何正确读取二进制文件        
Dim FileName As String
InternetReadFile如何正确读取二进制文件        
Dim lNumberOfBytesRead As Long
InternetReadFile如何正确读取二进制文件        
Dim F1 As Integer
InternetReadFile如何正确读取二进制文件        
Dim strsize As String
InternetReadFile如何正确读取二进制文件        
Dim size As Long
InternetReadFile如何正确读取二进制文件        strsize 
= String$(1024" ")
InternetReadFile如何正确读取二进制文件 
InternetReadFile如何正确读取二进制文件        F1 
= FreeFile
InternetReadFile如何正确读取二进制文件        stTotal 
= vbNullString
InternetReadFile如何正确读取二进制文件        FileName 
= "E:\BitSpirit\Torrent\121212.torrent"
InternetReadFile如何正确读取二进制文件
        Open FileName For Binary As F1
InternetReadFile如何正确读取二进制文件        hOpen 
= InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
InternetReadFile如何正确读取二进制文件        hOpenUrl 
= InternetOpenUrl(hOpen, sUrl, vbNullString, 0, INTERNET_FLAG_RELOAD, 0)
InternetReadFile如何正确读取二进制文件        bDoLoop 
= True
InternetReadFile如何正确读取二进制文件        HttpQueryInfo hOpenUrl, HTTP_QUERY_CONTENT_LENGTH 
Or HTTP_QUERY_FLAG_NUMBER, ByVal strsize, Len(strsize), 0
InternetReadFile如何正确读取二进制文件        size 
= CLng(Trim(strsize))
InternetReadFile如何正确读取二进制文件         
For j = 1 To size \ 100
InternetReadFile如何正确读取二进制文件          bDoLoop 
= InternetReadFileByte(hOpenUrl, b(0), 100, lNumberOfBytesRead)
InternetReadFile如何正确读取二进制文件 
InternetReadFile如何正确读取二进制文件          Put F1, , b
InternetReadFile如何正确读取二进制文件          
If Not CBool(lNumberOfBytesRead) Then Exit For
InternetReadFile如何正确读取二进制文件         
Next
InternetReadFile如何正确读取二进制文件        
If size Mod 100 <> 0 Then
InternetReadFile如何正确读取二进制文件        tmp 
= (size Mod 100- 1
InternetReadFile如何正确读取二进制文件        
ReDim EndByte(tmp)
InternetReadFile如何正确读取二进制文件          bDoLoop 
= InternetReadFileByte(hOpenUrl, EndByte(0), tmp + 1, lNumberOfBytesRead)
InternetReadFile如何正确读取二进制文件          Put F1, , EndByte
InternetReadFile如何正确读取二进制文件        
End If
InternetReadFile如何正确读取二进制文件 
InternetReadFile如何正确读取二进制文件         
If hOpenUrl <> 0 Then InternetCloseHandle (hOpenUrl)
InternetReadFile如何正确读取二进制文件         
If hOpen <> 0 Then InternetCloseHandle (hOpen)
InternetReadFile如何正确读取二进制文件 
InternetReadFile如何正确读取二进制文件        Close #
1
InternetReadFile如何正确读取二进制文件        FileDownload 
= True
InternetReadFile如何正确读取二进制文件
End Function
InternetReadFile如何正确读取二进制文件
测试了一下,完全成功:)







    本文转自无心之柳.NET博客园博客,原文链接:http://www.cnblogs.com/9527/archive/2005/05/19/159108.html,如需转载请自行联系原作者

上一篇:尝试在Community Server中添加一个页面


下一篇:Nhibernate+SQLite 入门实例指南二 类的继承、多态关系