InternetOpenUrl ou URLDownloadToFile

Le
Mishell
Bonjour.

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?

Mishell

-

value = URLDownloadToFile(0, url, FileName, 0, 0)

-

hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_PRECONFIG,
vbNullString, _
vbNullString, 0)
hOpenUrl = InternetOpenUrl(hOpen, sURL, vbNullString, 0,
INTERNET_FLAG_RELOAD, 0)

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)

-
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Renfield
Le #19024131
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
Le #19024941
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

hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_PRECONFIG,
vbNullString, _
vbNullString, 0)
hOpenUrl = InternetOpenUrl(hOpen, sURL, vbNullString, 0,
INTERNET_FLAG_RELOAD, 0)


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" 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
Publicité
Poster une réponse
Anonyme