URLDownloadToFile er en callback funktion, og synkroniseringen virker ikke altid som den skal - callback funktioner er altid (hos MS ihvertfald) lidt usikre.
Der er en tidsforskydning fra man returnerer fra kaldet til filen rent faktisk er downloadet og da filen er cached i en tempfile, så er filen også først tilstede på disken nogle fragmenter af et millisekund før du forventer det i koden.....
Derfor er der et extra loop og et check på at filen rent faktisk er på disken før jeg forlader rutinen.
Jeg ville gøre det således (det virker (!) da jeg benytter det i min kode til automatisk udskrift af pdf-filer på Internettet):
'Definitions
Public Enum URLDownloadErrConstants
udErrAborted = &H80004004
udErrDestFileExists = &H800C0001
udErrInvalidUrl = &H800C0002
udErrNoSession = &H800C0003
udErrCannotConnect = &H800C0004
udErrResourceNotFound = &H800C0005
udErrObjectNotFound = &H800C0006
udErrDataNotAvailable = &H800C0007
udErrDownloadFailure = &H800C0008
udErrAuthenticationRequired = &H800C0009
udErrNoValidMedia = &H800C000A
udErrConnectionTimeout = &H800C000B
udErrInvalidRequest = &H800C000C
udErrUnknownProtocol = &H800C000D
udErrSecurityProblem = &H800C000E
udErrCannotLoadData = &H800C000F
udErrCannotInstantiateObject = &H800C0010
udErrRedirectFailed = &H800C0014
udErrRedirectToDir = &H800C0015
udErrCannotLockRequest = &H800C0016
ERROR_SUCCESS = 0
End Enum
Private Declare Function URLDownloadToFile Lib "urlmon" _
Alias "URLDownloadToFileA" _
(ByVal pCaller As Long, _
ByVal szURL As String, _
ByVal szFileName As String, _
ByVal dwReserved As Long, _
ByVal lpfnCB As Long) As URLDownloadErrConstants 'Long
...
'Module
Public Function DownloadFile(ByVal sURL As String, _
ByVal sLocalFile As String) As Boolean
Dim lngRetVal As URLDownloadErrConstants 'Long
Dim i As Long
Dim Bok As Boolean
'if the API returns ERROR_SUCCESS (0),
'return True from the function
lngRetVal = URLDownloadToFile(0&, _
sURL, _
sLocalFile, _
0&, _
0&)
Debug.Print "URL " & " to " & sLocalFile
If lngRetVal <> 0 Then
Debug.Print "FEJL"
End If
i = 0
DownloadFile = (lngRetVal = ERROR_SUCCESS)
If lngRetVal = ERROR_SUCCESS Then
Dim Mystr As String
Mystr = LCase(Dir(sLocalFile))
While (LCase(sLocalFile) <> LCase("c:\tmpfiles\pdf\" & Mystr)) And i < 100000
i = i + 1
Debug.Print "Wait " & i
Mystr = Dir(sLocalFile)
Wend
End If
DownloadFile = ((lngRetVal = ERROR_SUCCESS) And (LCase(sLocalFile) = ("c:\tmpfiles\pdf\" & LCase(Dir("C:\tmpfiles\PDF\" & Mystr)))))
End Function
...
'kode
if DownloadFile("
http://test.test.dk/somefile.pdf", _
"somefile.pdf")