Pour télécharger une page web, j'ai essayé les 2 techniques API ci-dessous.
Le problème dans les 2 cas, c'est que, environ une fois sur 10, il faut 5 à
10 minutes pour recevoir la réponse du serveur.
L'autre problème, c'est que, souvent, après avoir utilisé le jeu qui fait
appel à ces API pour télécharger des pages web, mon fureteur (Firefox) ne
trouve plus aucune page sur Internet. Et je dois re-démarrer Windows pour
que le fureteur fonctionne à nouveau.
Où est l'erreur? Y a-t-il une solution à ces problèmes?
bDoLoop = True
While bDoLoop
sReadBuffer = vbNullString
bRet = InternetReadFile(hOpenUrl, sReadBuffer, Len(sReadBuffer), _
lNumberOfBytesRead)
s = s & Left$(sReadBuffer, lNumberOfBytesRead)
If Not CBool(lNumberOfBytesRead) Then bDoLoop = False
Wend
If hOpenUrl <> 0 Then InternetCloseHandle (hOpenUrl)
If hOpen <> 0 Then InternetCloseHandle (hOpen)
Comment sont déclarées tes APIs ? et tes variables ? Pas simple de diagnostiquer ton probleme, là.
pourquoi continuer ton traitement si tes handles sont invalides ? pourquoi utiliser bDoLoop ?
utilises plutot une stucture :
Do ... Loop While lNumberOfBytesRead
Reynald 'Renfield' THOMAS, MVP Visual Basic
Mishell
Merci de ton intérêt.
Voici le premier code que j'utilise :
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 Long
Function DownloadPage(ByVal url As String, ByVal FileName As String) As Boolean Dim done As Boolean Dim value As Long
On Error Resume Next
done = True If Dir$(FileName) <> "" Then Kill FileName End If value = URLDownloadToFile(0, url, FileName, 0, 0) If Dir$(FileName) = "" Then done = False End If DownloadPage = done End Function
sub test
Dim bRet As Boolean
Dim sFileName As String
Dim cheminDestination As String
sFileName = "c:test.dat"
bRet = DownloadPage(sURL, sFileName) If bRet Then MsgBox "Téléchargement réussi."
Else MsgBox "Erreur lors du téléchargeement"
End If
end sub -------------------------------- ou encore celui-ci: Le deuxième code que j'utilise
Public Const INTERNET_OPEN_TYPE_PRECONFIG = 0 Public Const INTERNET_OPEN_TYPE_DIRECT = 1 Public Const INTERNET_OPEN_TYPE_PROXY = 3
Public Const scUserAgent = "VB OpenUrl" Public Const INTERNET_FLAG_RELOAD = &H80000000
Public Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" _ (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, _ ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Public Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" _ (ByVal hOpen As Long, ByVal sURL As String, ByVal sHeaders As String, _ ByVal lLength As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
Public Declare Function InternetReadFile Lib "wininet.dll" _ (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, _ lNumberOfBytesRead As Long) As Integer
Public Declare Function InternetCloseHandle Lib "wininet.dll" _ (ByVal hInet As Long) As Integer
Public Function GetHTMLFromURL(sURL As String) As String
Dim s As String Dim hOpen As Long Dim hOpenUrl As Long Dim bDoLoop As Boolean Dim bRet As Boolean Dim sReadBuffer As String * 2048 Dim lNumberOfBytesRead As Long
lNumberOfBytesRead = True Do sReadBuffer = vbNullString bRet = InternetReadFile(hOpenUrl, sReadBuffer, Len(sReadBuffer), _ lNumberOfBytesRead) s = s & Left$(sReadBuffer, lNumberOfBytesRead) Loop While lNumberOfBytesRead
If hOpenUrl <> 0 Then InternetCloseHandle (hOpenUrl) If hOpen <> 0 Then InternetCloseHandle (hOpen)
GetHTMLFromURL = s
End Function
Je ne sais pas pourquoi il faut attendre parfois 10 minutes et pourquoi souvent mon fureteur devient non fonctionnel.
Lequel de ces 2 codes est préférable ? Le premier ou le deuxième?
Nota Bene: j'utilise ce code actuellement en VBA.
Mishell
"Renfield" wrote in message news: Comment sont déclarées tes APIs ? et tes variables ? Pas simple de diagnostiquer ton probleme, là.
pourquoi continuer ton traitement si tes handles sont invalides ? pourquoi utiliser bDoLoop ?
utilises plutot une stucture :
Do ... Loop While lNumberOfBytesRead
Reynald 'Renfield' THOMAS, MVP Visual Basic
Merci de ton intérêt.
Voici le premier code que j'utilise :
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 Long
Function DownloadPage(ByVal url As String, ByVal FileName As String) As
Boolean
Dim done As Boolean
Dim value As Long
On Error Resume Next
done = True
If Dir$(FileName) <> "" Then
Kill FileName
End If
value = URLDownloadToFile(0, url, FileName, 0, 0)
If Dir$(FileName) = "" Then
done = False
End If
DownloadPage = done
End Function
sub test
Dim bRet As Boolean
Dim sFileName As String
Dim cheminDestination As String
sFileName = "c:test.dat"
bRet = DownloadPage(sURL, sFileName)
If bRet Then
MsgBox "Téléchargement réussi."
Else
MsgBox "Erreur lors du téléchargeement"
End If
end sub
--------------------------------
ou encore celui-ci:
Le deuxième code que j'utilise
Public Const INTERNET_OPEN_TYPE_PRECONFIG = 0
Public Const INTERNET_OPEN_TYPE_DIRECT = 1
Public Const INTERNET_OPEN_TYPE_PROXY = 3
Public Const scUserAgent = "VB OpenUrl"
Public Const INTERNET_FLAG_RELOAD = &H80000000
Public Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA"
_
(ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As
String, _
ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Public Declare Function InternetOpenUrl Lib "wininet.dll" Alias
"InternetOpenUrlA" _
(ByVal hOpen As Long, ByVal sURL As String, ByVal sHeaders As String, _
ByVal lLength As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
Public Declare Function InternetReadFile Lib "wininet.dll" _
(ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As
Long, _
lNumberOfBytesRead As Long) As Integer
Public Declare Function InternetCloseHandle Lib "wininet.dll" _
(ByVal hInet As Long) As Integer
Public Function GetHTMLFromURL(sURL As String) As String
Dim s As String
Dim hOpen As Long
Dim hOpenUrl As Long
Dim bDoLoop As Boolean
Dim bRet As Boolean
Dim sReadBuffer As String * 2048
Dim lNumberOfBytesRead As Long
lNumberOfBytesRead = True
Do
sReadBuffer = vbNullString
bRet = InternetReadFile(hOpenUrl, sReadBuffer, Len(sReadBuffer), _
lNumberOfBytesRead)
s = s & Left$(sReadBuffer, lNumberOfBytesRead)
Loop While lNumberOfBytesRead
If hOpenUrl <> 0 Then InternetCloseHandle (hOpenUrl)
If hOpen <> 0 Then InternetCloseHandle (hOpen)
GetHTMLFromURL = s
End Function
Je ne sais pas pourquoi il faut attendre parfois 10 minutes et pourquoi
souvent mon fureteur devient non fonctionnel.
Lequel de ces 2 codes est préférable ?
Le premier ou le deuxième?
Nota Bene: j'utilise ce code actuellement en VBA.
Mishell
"Renfield" <TheRenfield@gmail.com> wrote in message
news:4dfcd8fc-e94e-4d2d-812d-3d732e8cfca7@z14g2000yqa.googlegroups.com...
Comment sont déclarées tes APIs ? et tes variables ? Pas simple de
diagnostiquer ton probleme, là.
pourquoi continuer ton traitement si tes handles sont invalides ?
pourquoi utiliser bDoLoop ?
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 Long
Function DownloadPage(ByVal url As String, ByVal FileName As String) As Boolean Dim done As Boolean Dim value As Long
On Error Resume Next
done = True If Dir$(FileName) <> "" Then Kill FileName End If value = URLDownloadToFile(0, url, FileName, 0, 0) If Dir$(FileName) = "" Then done = False End If DownloadPage = done End Function
sub test
Dim bRet As Boolean
Dim sFileName As String
Dim cheminDestination As String
sFileName = "c:test.dat"
bRet = DownloadPage(sURL, sFileName) If bRet Then MsgBox "Téléchargement réussi."
Else MsgBox "Erreur lors du téléchargeement"
End If
end sub -------------------------------- ou encore celui-ci: Le deuxième code que j'utilise
Public Const INTERNET_OPEN_TYPE_PRECONFIG = 0 Public Const INTERNET_OPEN_TYPE_DIRECT = 1 Public Const INTERNET_OPEN_TYPE_PROXY = 3
Public Const scUserAgent = "VB OpenUrl" Public Const INTERNET_FLAG_RELOAD = &H80000000
Public Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" _ (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, _ ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Public Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" _ (ByVal hOpen As Long, ByVal sURL As String, ByVal sHeaders As String, _ ByVal lLength As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
Public Declare Function InternetReadFile Lib "wininet.dll" _ (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, _ lNumberOfBytesRead As Long) As Integer
Public Declare Function InternetCloseHandle Lib "wininet.dll" _ (ByVal hInet As Long) As Integer
Public Function GetHTMLFromURL(sURL As String) As String
Dim s As String Dim hOpen As Long Dim hOpenUrl As Long Dim bDoLoop As Boolean Dim bRet As Boolean Dim sReadBuffer As String * 2048 Dim lNumberOfBytesRead As Long