salve . . un saluto a tutto il forum . .
mi sono appena registrato per esporvi un mio problema che da qualche tempo mi assilla
Da circa 1 anno uso questo codice in VB6 per leggere/scaricare delle pagine web contenenti
dati di profili utente su internet. Si tratta di giocatori di un videogioco flash online.
Una volta raccolti tutti questi dati tiro fuori delle classifiche da mostrare agli stessi giocatori.
Tutto funzionava correttamente . . il codice passava alla sub GetUrlSource il link
della pagina e il nome del file sull'hd locale in cui memorizzare la pagina,
prendere i dati necessari (una decina di valori numerici su partite vinte,
sconfitte pareggi ect ect) . . e poi cancellare il file dal mio disco fisso.
Il codice prevede oppurtuni ritardi e pause nella lettura per non ingolfare troppo
la procedura di lettura delle pagine dal server del gioco.
Ma da quando i giocatori da gestire sono diventati più di 16381 . . mi esce fuori un
problema strano.
Nel codice seguente infatti improvvisamente alla 16382esima invocazione della Sub seguente
l'handle della connessione diventa = ZERO mentre prima ha sempre un valore tipo 13367033
la variabile che si azzera è lSession
di conseguenza il file generato sul mio hd diventa vuoto è il programma va in errore.
Questo succede anche cambiando il link (sUrl) e cercando di leggere una pagina già letta
in precedenza correttamente.
Che succede dopo 16382 cicli usando il componente Inet?
Microsoft Internet Trasfer Control 6.0
. . qualcosa . . qualche buffer si intasa? . . come posso rimediare senza
stravolgere tutto il codice?
Se chiudo il programma e lo faccio riavviare dal punto in cui si è bloccato, tutto
continua correttamente fino alla fine ma siccome ci vogliono ore per leggere tutte
quelle pagine spesso il problema si verifica il mia assenza e quindi i dati totali
letti rischiano di essere aggiornati con troppa differenza di tempo tra il primo e l'ultimo
eccole dichiarazioni iniziali e la sub dove si verifica il pasticcio:
(grazie per l'attenzione)
codice:
Private Const IF_NO_CACHE_WRITE = &H4000000
Private Const BUFFER_LEN = 256
Private 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
Private Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" (ByVal hInternetSession As Long, ByVal sUrl As String, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
Private Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer
Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer
. . .
Sub GetURLSource(sUrl As String, fileSulPC As String)
Dim sBuffer As String * BUFFER_LEN
Dim sData As String
Dim lInternet As Long
Dim lSession As Long
Dim lReturn As Long
DoEvents
'prendo l'handle della connessione corrente
lSession = InternetOpen("vb wininet", 1, vbNullString, vbNullString, 0)
'prendo l'handle dell'URL
If lSession Then lInternet = InternetOpenUrl(lSession, sUrl, vbNullString, 0, IF_NO_CACHE_WRITE, 0)
'-------------------------------------------------------------------------------
' dopo 16381 chiamate a questa sub . . lSession diventa =0
'-------------------------------------------------------------------------------
'se c'è l'handle dell'URL passo alla lettura della pagina
If lInternet Then
Call InternetReadFile(lInternet, sBuffer, BUFFER_LEN, lReturn)
sData = sBuffer
Do While lReturn <> 0
Call InternetReadFile(lInternet, sBuffer, BUFFER_LEN, lReturn)
sData = sData + Mid$(sBuffer, 1, lReturn)
Loop
End If
Call InternetCloseHandle(lInternet) 'chiudo l'URL
Open fileSulPC For Binary As #9
Put #9, , sData
Close #9
End Sub