我使用的程序运行.VBS脚本
那么,在 VBScript 中,如何处理 WinHttpRequest 对象的 OnResponseFinished 事件?
Set oHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
oHTTP.Open "GET", "http://www.google.com", True
oHTTP.Send
答案 0 :(得分:2)
我试图在winhttp响应到来时执行一些代码(在HTA文件中使用VBScript)。您可以考虑在发送后立即放置事件代码。使用以下代码,用户界面在等待响应时不会挂起:
Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
objHTTP.Open "GET", "http://www.google.com", True
objHTTP.Send
objHTTP.WaitForResponse 'pauses execution, but does not hang UI
'from now on, execution only takes effect after completion of the response:
msgbox objHTTP.responseText 'an example of what can be done with the response
这似乎与脚本文件的同步winhttp相同,这可能是您正在寻找的。因此,使用用户界面时可能会注意到唯一的区别。
答案 1 :(得分:1)
将调用中的第三个参数更改为Open
方法为false
。然后在调用send之后放置OnResponseFinished
中的代码。
答案 2 :(得分:1)
使用WScript的CreateObject而不是内置的事件处理程序。
Set oHTTP = WScript.CreateObject(
"WinHttp.WinHttpRequest.5.1",
"oHTTP_"
)
答案 3 :(得分:0)
我承认他的答案不是很好,但注册VBScript事件的常用方法是使用GetRef
函数来获取对事件处理程序的引用,例如使用MSXML2.XMLHTTP
对象:
Set oHTTP = CreateObject("MSXML2.XMLHTTP")
oHTTP.Open "GET", "http://www.google.com", True
oHTTP.OnReadyStateChange = GetRef("oHTTP_OnReadyStateChange")
Sub oHTTP_OnReadyStateChange
' do something
End sub
oHTTP.Send
麻烦的是,我为你的代码尝试了它,即
Set oHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
oHTTP.Open "GET", "http://www.google.com", True
oHTTP.OnResponseFinished = GetRef("oHTTP_OnResponseFinished")
Sub oHTTP_OnResponseFinished
' do something
End sub
oHTTP.Send
它没有用,得到错误
Object不支持此属性或方法:'oHTTP.OnResponseFinished'
但也许这可以给你一个起点,或者你可以使用MSXML2
库来代替?
只需使用其他处理COM事件的方式更新此答案 - 使用CreateObject
函数的第二个参数,它允许您指定将函数连接到对象的函数前缀,例如
Set oHTTP = CreateObject("WinHttp.WinHttpRequest.5.1", "oHTTP_")
oHTTP.Open "GET", "http://www.google.com", True
Sub oHTTP_OnResponseFinished
' do something
End sub
oHTTP.Send
不幸的是,这也不起作用 - 必须是IWinHttpRequestEvents
界面无法访问
答案 4 :(得分:0)
我检查了Windows注册表,似乎有许多Microsoft对象做了几乎相同的事情:
Microsoft.XMLHTTP {ED8C108E-4349-11D2-91A4-00C04F7969E8}
MSXML2.XMLHTTP {F6D90F16-9C73-11D3-B32E-00C04F990BB4}
WinHttp.WinHttpRequest.5.1 {2087c2f4-2cef-4953-a8ab-66779b670495}
MSXML2.ServerXMLHTTP {AFBA6B42-5692-48EA-8141-DC517DCF0EF1}
对我有用的是Microsoft.ServerXMLHTTP,它允许在VBScript中设置onreadystatechange。 “MSXML2.ServerXMLHTTP”处理重定向网站(例如google.com),使其成为比“Microsoft.XMLHTTP”更好的选择。
Dim xmlhttp ' global so can be accessed in OnStateChange
Sub OnStateChange
If xmlhttp.readystate = 4 Then
' React to xmlhttp.responseText
MsgBox xmlhttp.responseText
End If
End Sub
Set xmlhttp = CreateObject("Microsoft.XMLHTTP")
xmlhttp.open "GET", "http://www.google.com/", true
xmlhttp.onreadystatechange = GetRef("OnStateChange")
xmlhttp.send
' do something else whilst xmlhttp is running in the background
MsgBox "Pausing so that OnStateChange can fire!"
答案 5 :(得分:0)
根据this(转到备注)似乎确实需要您只能使用Err
访问错误状态。微软的文档很糟糕。
答案 6 :(得分:0)
我发现我可以通过使用' waitForResponse'来异步工作。参数' 0'将超时方法作为标志。
IE:
oHTTP.Open "GET", "http://www.google.com", True
oHTTP.Send
Do While oHTTP.waitForResponse(0) = False
'do stuff while waiting for it to be done
WScript.Sleep 200 'sleep for 0.2 seconds between checks as not waste CPU
DoEvents
Loop
'Once the loop is exited, the response is finished
MsgBox oHTTP.ResponseText