来自URLMON的VBA URLDownloadToFileA或URLOpenStreamA - 异步

时间:2017-10-02 13:22:06

标签: excel vba excel-vba asynchronous

我正在使用URLDownloadToFileA API调用来下载VBA中的文件,它工作正常(并且 MUCH 比WinHTTP或XMLHTTP更快),但它只是同步的。

我一直在寻找异步使用URLMon API调用的方法(可能使用URLOpenStream而不是下载到文件),但还没有想出办法。

我偶然发现了VB6代码,这些代码可以在这里完成:http://www.mvps.org/emorcillo/download/vb6/adl.zip但我在编码方面不够精通,无法将其转换为工作VBA。

请注意:我确实知道如何通过XMLHTTP和WinHTTP使用类来实现这一点,但这些比使用URLMon DLL API慢得多,所以我希望在那里找到解决方案。

与URLMon同步执行的代码:

Private Declare PtrSafe Function URLDownloadToFileA Lib "URLMON" (ByVal pcaller As Long, ByVal szurl As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As LongPtr
Private Declare PtrSafe Function URLOpenPullStreamA Lib "URLMON" (ByVal pcaller As Long, ByVal szurl As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As LongPtr

Sub test()
dim a&, b&, URL$

URL = "http://ipv4.download.thinkbroadband.com/100MB.zip"
a = URLOpenPullStreamA (0, URL, 0, 0)
b = URLDownloadToFileA(0, URL, "c:\testfiles\100MB.zip", 0, 0)

End Sub

所以,这有效 - 但我不知道如何捕获a的回调,并且在下载b时它锁定excel直到文件完全下载。

任何帮助将不胜感激! 谢谢,

JD

1 个答案:

答案 0 :(得分:0)

一种方法是在单独的Office应用程序中启动VBA代码,在同步下载结束时退出,并监视从主应用程序退出的时间。