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

Rispondi quotando