不确定这是否是标准程序,但我不想过于混乱我的问题,以便阅读它的人可以更好地理解它。
但我找到了一个更符合我最初要求的问题的替代解决方案。再次感谢 Tim,他让我走上了正轨,他对 ADODB.Stream 的使用是我解决方案的重要组成部分。
这使用了 Microsoft WinHTTP Services 5.1 .DLL,它应该包含在一个或另一个版本的 windows 中,如果没有,它很容易下载。
我在一个名为“HTTPRequest”的类中使用以下代码
Option Explicit
Private WithEvents HTTP As WinHttpRequest
Private ADStream As ADODB.Stream
Private HTTPRequest As Boolean
Private I As Double
Private SaveP As String
Sub Main(ByVal URL As String)
HTTP.Open "GET", URL, True
HTTP.send
End Sub
Private Sub Class_Initialize()
Set HTTP = New WinHttpRequest
Set ADStream = New ADODB.Stream
End Sub
Private Sub HTTP_OnError(ByVal ErrorNumber As Long, ByVal ErrorDescription As String)
Debug.Print ErrorNumber
Debug.Print ErrorDescription
End Sub
Private Sub HTTP_OnResponseFinished()
'Tim's code Starts'
With ADStream
.Type = 1
.Open
.Write HTTP.responseBody
.SaveToFile SaveP, 2
.Close
End With
'Tim's code Ends'
HTTPRequest = True
End Sub
Private Sub HTTP_OnResponseStart(ByVal Status As Long, ByVal ContentType As String)
End Sub
Private Sub Class_Terminate()
Set HTTP = Nothing
Set ADStream = Nothing
End Sub
Property Get RequestDone() As Boolean
RequestDone = HTTPRequest
End Property
Property Let SavePath(ByVal SavePath As String)
SaveP = SavePath
End Property
这与 Tim 所描述的主要区别在于 WINHTTPRequest 有它自己的内置事件,我可以将其封装在一个整洁的小类中并在任何地方重用。对我来说,这是一个比调用 XMLHttp 然后将其传递给一个类等待它更优雅的解决方案。
将它包含在这样的类中意味着我可以按照这种方式做一些事情..
Dim HTTP(10) As HTTPRequest
Dim URL(2, 10) As String
Dim I As Integer, J As Integer, Z As Integer, X As Integer
While Not J > I
For X = 1 To I
If Not TypeName(HTTP(X)) = "HTTPRequest" And Not URL(2, X) = Empty Then
Set HTTP(X) = New HTTPRequest
HTTP(X).SavePath = URL(2, X)
HTTP(X).Main (URL(1, X))
Z = Z + 1
ElseIf TypeName(HTTP(X)) = "HTTPRequest" Then
If Not HTTP(X).RequestDone Then
Exit For
Else
J = J + 1
Set HTTP(X) = Nothing
End If
End If
Next
DoEvents
Wend
我只是遍历 URL(),其中 URL(1,N) 是 URL,而 URL(2,N) 是保存位置。
我承认这可能会简化一点,但它现在可以为我完成工作。只是把我的解决方案扔给有兴趣的人。