Newsgroup: it.comp.lang.visual-basic
Titolo: Errore WinInet

Ciao a tutti,
sto scrivendo una dll che mi restituisca il contenuto di un file che
risiede su un server.
Quando viene eseguita la funziona InternetOpenUrl mi va sempre in
Overflow, ho già provato diverse soluzioni, ma ricevo sempre questo errore.
Qualcuno può aiutarmi per favore?
Molte grazie e buona giornata.
Il codice è:
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 HttpQueryInfo Lib "WININET.DLL" Alias
"HttpQueryInfoA" (ByVal hHttpRequest As Long, ByVal lInfoLevel As Long,
ByRef sBuffer As Any, ByRef lBufferLength As Long, ByRef lIndex As Long)
As Integer
Private Declare Function InternetReadFile Lib "WININET.DLL" (ByVal hFile
As Long, ByVal sBuffer As String, ByVal lNumberOfBytesToRead As Long,
lNumberOfBytesRead As Long) As Integer
Private Declare Function InternetCloseHandle Lib "WININET.DLL" (ByVal
hInet As Long) As Long
Private Declare Function InternetOpenUrl Lib "WININET.DLL" Alias
"InternetOpenUrlA" (ByVal hOpen As Integer, ByVal sUrl As String, ByVal
sHeaders As String, ByVal lLength As Integer, ByVal lFlags As Integer,
ByVal lContext As Integer) As Long
hSes = InternetOpen("Application", INTERNET_OPEN_TYPE_PRECONFIG,
vbNullString, vbNullString, 0)
hInternet = InternetOpenUrl(hSes, "http:/indirizzo_ip/file.txt",
vbNullString, ByVal 0&, IF_NO_CACHE_WRITE, ByVal 0&)
dwStatus = 0
dwSize = Len(dwStatus)
retresult = HttpQueryInfo(hInternet, HTTP_QUERY_FLAG_NUMBER &
HTTP_QUERY_STATUS_CODE, ByVal dwStatus, dwSize, 0)
retresult = InternetReadFile(hInternet, intBuf, 256, nread)
retresult = InternetCloseHandle(hInternet)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 hInternet = InternetOpenUrl(hSes, "http:/indirizzo_ip/file.txt",
e invece lì ci vorrebbe un integer...
-- 
Salutoni
Sergio
Per rispondere... togli il group dall'indirizzo


 Overflow, ho già provato diverse soluzioni, ma ricevo sempre questo errore.
[CUT]
Complessivamente dovresti ricontrollare meglio sia la dichiarazione delle API
(ci sono degli Integer al posto di Long) e la congruenza delle variabili con i
tipi attesi dalle API dichiarate.
Queste sono le declare corrette (prese da APIView2004,
http://www.activevb.de/rubriken/apiviewer/index-apiviewereng.html
):
Private Declare Sub HttpQueryInfo Lib "wininet.dll" Alias "HttpQueryInfoA"
(ByRef hRequest As Long, ByVal dwInfoLevel As Long, ByRef lpBuffer As Any, ByRef
lpdwBufferLength As Long, ByRef lpdwIndex As Long)
Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByRef hInternet
As Long) As Boolean
Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA"
(ByVal lpszAgent As String, ByVal dwAccessType As Long, ByVal lpszProxy As
String, ByVal lpszProxyBypass As String, ByVal dwFlags As Long) As Long
Private Declare Function InternetOpenUrl Lib "wininet.dll" Alias
"InternetOpenUrlA" (ByVal hInternet As Long, ByVal lpszUrl As String, ByVal
lpszHeaders As String, ByVal dwHeadersLength As Long, ByVal dwFlags As Long,
ByRef dwContext As Long) As Long
Private Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As
Long, ByRef lpBuffer As Any, ByVal dwNumberOfBytesToRead As Long, ByRef
lpdwNumberOfBytesRead As Long) As Integer
Altre "sviste":
Len(dwSize) non dà quello che ti aspetti, infatti (se ben interpreto il prefisso
dw=doubleword=long) dwStatus è un long, non una stringa.
Quindi VB prima lo converte in stringa ("0") poi ne valuta la lunghezza (1).
Dovresti risolvere con
dwSize = 4
retresult = HttpQueryInfo(hInternet, HTTP_QUERY_FLAG_NUMBER &
HTTP_QUERY_STATUS_CODE, ByVal dwStatus, dwSize, 0).
Quell'& mi rende alquanto perplesso, sembra un refuso da codice C, sbaglio?
dwStatus non va passato ByVal, se (come credo) è il risultato che devi leggere.
Alla InternetReadFile devi passare un buffer predimensionato, non un integer
(intBuf)
    sBuf = String(256, 0)
    retresult = InternetReadFile(hInternet, sBuf, 256, nread)
Bye
Raf

 Raf
Grazie molte per l'aiuto...
Attendo news :)
Ciao ciao


 Come devo modificarlo?
Contrariamente a quanto credevo ho MALE interpretato il prefisso "dw"...
Dunque se dwStatus è una stringa, allora in teoria vanno bene le tue istruzioni
originali, compreso il byval, essendo stringa.
In pratica però (se ho capito bene dall'MSDN), quando chiami HttpQueryInfo con
il flag HTTP_QUERY_FLAG_NUMBER, ciò che ti viene restituito in dwStatus è un
numero a 32 bit, cioè un long.
In tal caso dovresti dichiarare dwStatus As Long, impostare dwSize=4 e passarlo
ByRef.
A proposito... mi sa che ci vada un OR (|) e non un AND (&):
HTTP_QUERY_FLAG_NUMBER Or HTTP_QUERY_STATUS_CODE.
Ciao
Raf

 Raf
Ciao Raf,
ho trovato una procedura che sembra funzionare fino a....quando eseguie la
funzione InternetReadFile che non valorizza il buffer...
Private Function httpGetFile(strURL, strSaveAs)
    ' On Error GoTo Err_httpGetFile
    Dim hInetConnection As Long
    Dim hURLFile As Long
    Dim sReadBuffer            As String        ' Grab 4k at a time
    Dim sBuffer                As String
    Dim lNumberOfBytesRead     As Long
    Dim bDoLoop As Boolean
    Dim hNewFile As Long
    Dim lngTotalBytes As Long
    hInetConnection = InternetOpen("httpGetFile", _
             INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
    If CBool(hInetConnection) Then
        hURLFile = InternetOpenUrl(hInetConnection, _
                 strURL, vbNullString, 0, IF_NO_CACHE_WRITE _
                 Or INTERNET_FLAG_RELOAD, 0)
        bDoLoop = True
        While bDoLoop
            sReadBuffer = ""
            ' Questo funzione non mi riempie il buffer
            bDoLoop = InternetReadFile(hURLFile, sReadBuffer, _
                      Len(sReadBuffer), lNumberOfBytesRead)
            sBuffer = sBuffer & Left(sReadBuffer, lNumberOfBytesRead)
            If Not CBool(lNumberOfBytesRead) Then bDoLoop = False
            lngTotalBytes = lngTotalBytes + lNumberOfBytesRead
        Wend
        httpGetFile = True
    Else
        Msgbox "Unable to open Internet Connection"
    End If
    InternetCloseHandle (hURLFile)
    InternetCloseHandle (hInetConnection)
End Function
Ora cerco di capire il motivo.


             sBuffer = sBuffer & Left(sReadBuffer, lNumberOfBytesRead)
Forse ti sarà già saltato agli occhi... il problema è che se non prepari il
buffer allocandolo è difficile che te lo trovi riempito.
            sReadBuffer = Space(4096) ' Visto che nella dichiarazione c'è un
commento "Grab 4k at a time"...
            bDoLoop = InternetReadFile(hURLFile, sReadBuffer, _
                      Len(sReadBuffer), lNumberOfBytesRead)
Ciao
Raf

 Raf
Ciao Rafunk,
la mia situazione è questa:
Private Function httpGetFile(strURL, strSaveAs)
    Dim hInetConnection As Long
    Dim hURLFile As Long
    Dim sReadBuffer            As String        ' Grab 4k at a time
    Dim sBuffer                As String
    Dim lNumberOfBytesRead     As Long
    Dim bDoLoop As Boolean
    Dim hNewFile As Long
    Dim lngTotalBytes As Long
	'
	' hInetConnection:13369352
	'
    hInetConnection = InternetOpen("httpGetFile", _
             INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
    If CBool(hInetConnection) Then
    	'
		' Va male già questa istruzione
		' hURLFile:0
		'
        hURLFile = InternetOpenUrl(hInetConnection, _
                 strURL, vbNullString, 0, IF_NO_CACHE_WRITE _
                 Or INTERNET_FLAG_RELOAD, 0)
        bDoLoop = True
        While bDoLoop
            sReadBuffer = Space(4096)
            '
			' Questa istruzione mi restituisce False, con sReadBuffer vuoto
			'
            bDoLoop = InternetReadFile(hURLFile, sReadBuffer, _
            		Len(sReadBuffer), _
            		lNumberOfBytesRead)
            sBuffer = sBuffer & Left(sReadBuffer, lNumberOfBytesRead)
            If Not CBool(lNumberOfBytesRead) Then bDoLoop = False
            lngTotalBytes = lngTotalBytes + lNumberOfBytesRead
        Wend
        httpGetFile = True
    Else
    End If
    InternetCloseHandle (hURLFile)
    InternetCloseHandle (hInetConnection)
End Function
Sembra che il puntamento al file non avvenga correttamente, ma a me sembra
corretto.
Tu trovi degli errori?
Grazie mille per l'aiuto, non riesco ad uscirne...
Ciao ciao


             lNumberOfBytesRead)
È chiaro che è una conseguenza del fatto che hURLFile sia zero, sei d'accordo?
Il motivo potrebbe essere che passi un VARIANT (strUrl) mentre l'API si aspetta
una stringa (ByVal lpszUrl As String).
Private Function httpGetFile(strURL, strSaveAs)
Andrebbe riscritta così:
Private Function httpGetFile(ByVal strURL As String, ByVal strSaveAs As String)
As Boolean
...
Anzi NO! Ho provato ma a me funziona anche con la tua dichiarazione originale
(strURL variant).
A questo punto allora penso che ti convenga dare una sbirciatina all'MSDN
http://msdn.microsoft.com/library/en-us/wininet/wininet/internetopenurl.asp
Dopo il fallimento della InternetOperUrl quanto vale Err.LastDLLError?
Ciao
Raf

 Raf
Err.LastDLLError restituisce:
12006 - ERROR_INTERNET_UNRECOGNIZED_SCHEME 
The URL scheme could not be recognized, or is not supported. 
Adesso sto cercando sul web specifiche su questo errore...


 The URL scheme could not be recognized, or is not supported.
Non è che per caso hai semplicemente scritto male l'URL? ;-)
Raf

 Non è che per caso hai semplicemente scritto male l'URL? ;-)
Si, hai ragione e l'avevo trovato e corretto.
Ora mi succede una cosa strana, quanod esegue
bDoLoop = InternetReadFile(hURLFile, sReadBuffer, Len(sReadBuffer),
lNumberOfBytesRead)
mi chiude il browser (Internet Explorer), i parametri passati sono:
hURLFile:13369360
sReadBuffer: Space(4096)
Len(sReadBuffer):4096


 Len(sReadBuffer):4096
Il browser? ma la funzione httpGetFile da te postata in un msg precedente non lo
apre mica.
Posta tutto il pezzo di codice, sembra essere un problema di Access Violation o
simili.
Ciao

 Ciao
Questa funzione fa parte di una dll che richiamo tramite js dal browser.
Private Function httpGetFile(strURL, strSaveAs)
     On Error GoTo Err_httpGetFile
    Dim hInetConnection As Long
    Dim hURLFile As Long
    Dim sReadBuffer            As String        ' Grab 4k at a time
    Dim sBuffer                As String
    Dim lNumberOfBytesRead     As Long
    Dim bDoLoop As Boolean
    Dim hNewFile As Long
    Dim lngTotalBytes As Long
    hInetConnection = InternetOpen("httpGetFile", _
             INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
    If CBool(hInetConnection) Then
            hURLFile = InternetOpenUrl(hInetConnection, strURL,
vbNullString, ByVal 0&, IF_NO_CACHE_WRITE, ByVal 0&)
        bDoLoop = True
        While bDoLoop
            sReadBuffer = Space(4096)
            bDoLoop = InternetReadFile(hURLFile, sReadBuffer,
Len(sReadBuffer), lNumberOfBytesRead)
            sBuffer = sBuffer & Left(sReadBuffer, lNumberOfBytesRead)
            If Not CBool(lNumberOfBytesRead) Then bDoLoop = False
            lngTotalBytes = lngTotalBytes + lNumberOfBytesRead
        Wend
        httpGetFile = True
    End If
    InternetCloseHandle (hURLFile)
    InternetCloseHandle (hInetConnection)
    Exit Function
Err_httpGetFile:
    MsgBox Err.Number & " - " & Err.Description & " - " & Err.LastDllError
End Function


 Questa funzione fa parte di una dll che richiamo tramite js dal browser.
Ah ecco, immaginavo una situazione simile...
Premetto che non ho quasi mai utilizzato js... ecco una buona occasione per
imparare qualcosa.
A questo punto ho provato a costruirmi un qualcosa di simile, una DLL
(MyHTTPTest) che espone una classe (MyHTTPTransfer) con il solo metodo
httpGetFile papale papale come l'hai postato tu. Più una pagina html di test con
un pulsante che richiama questa funzione js:
function test()
{
var obj;
 obj = new ActiveXObject("MyHTTPTest.MyHTTPTransfer");
 obj.httpGetFile(http://.../test.txt, "c:\temp\test.txt")
}
Ho messo in esecuzione debug la DLL ed ho aperto la pagina di test, premuto il
pulsante ma non ho riscontrato alcun problema.
IE rimane aperto...
Non so, magari dipende dalla versione di IE, io uso XPSP1 quindi IE6.
Bye
Raf

 Non so, magari dipende dalla versione di IE, io uso XPSP1 quindi IE6.
A me invece chiude il browser senza segnalare alcun errore.
Io uso Win2000 con IE6.
Chissà che cosa è...


 Chissà che cosa è...
Mah... l'ultima cosa che mi viene in mente è quella di dare un'occhiata alle
impostazioni avanzate di IE, ma non saprei quale in particolare.
Dopo questa temo di aver esaurito la... faretra.
A questo punto non rimane che interpellare San Google o l'aiuto di qualche altro
partecipante al NG...
Ciao
Raf

 Raf
Ciao Ciao e Auguri di Buona Pasqua!


 Ciao Ciao e Auguri di Buona Pasqua!
Ricambio i tuoi auguri.
Alla prossima!
Raf