Newsgroup: it.comp.lang.visual-basic
Titolo: Funzioni Internet

Salve a tutti, in una mia applicazioni leggo e scrivo su un database
utilizzando le api per accedere ad Intenret.
Di seguito vi allego un esempio del codice.
IL problema sorge quando ad esempio cerco di aprire una pagina che non
esiste, ma non subito, al momento di chiudere l'applicativo esso si conglela
per diverso tempo, mi rendo conto che non sto chiedendo una cosa facile però
iio proprio non riesco a capire il motivo e in giro non trovo molta
documentazione sulle funzioni.
se qualcuno deciderà di provare il codice cosi come è scritto non dovrebbe
dare problemi, però se invece di index.htm si cerca di chiamare una
qualsiasi pagina che non esiste Al momento di stoppare il progetto VB
rimarrà congelato, lo stesso sul compilato.
Grazie.
P.S. non posso usare ocx tipo inet control di Microsoft perchè non mi
permette di impllementare tutte le funzionalià di cui ho bisogno, tipo
chiedere la connessione al proxy ho postare dei dati ad una pagina asp.
Option Explicit
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 InternetConnect Lib "wininet.dll" Alias
"InternetConnectA" (ByVal hInternetSession As Long, ByVal lpszServerName As
String, ByVal nProxyPort As Integer, ByVal lpszUserName As String, ByVal
lpszPassword As String, ByVal dwService As Long, ByVal dwFlags As Long,
ByVal dwContext As Long) As Long
Private Declare Function HttpOpenRequest Lib "wininet.dll" Alias
"HttpOpenRequestA" (ByVal hInternetSession As Long, ByVal lpszVerb As
String, ByVal lpszObjectName As String, ByVal lpszVersion As String, ByVal
lpszReferer As String, ByVal lpszAcceptTypes As Long, ByVal dwFlags As Long,
ByVal dwContext As Long) As Long
Private Declare Function HttpSendRequest Lib "wininet.dll" Alias
"HttpSendRequestA" (ByVal hHttpRequest As Long, ByVal sHeaders As String,
ByVal lHeadersLength As Long, sOptional As Any, ByVal lOptionalLength 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
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
Private Declare Function InternetErrorDlg Lib "wininet.dll" (ByVal hwnd As
Long, ByVal hResourceHandleuest As Long, ByVal dwError As Long, ByVal
dwFlags As Long, ByVal lppvData As String) As Long
'Flags for API declarations
Private Const INTERNET_DEFAULT_HTTPS_PORT = 443
Private Const INTERNET_DEFAULT_HTTP_PORT = 80
Private Const INTERNET_SERVICE_HTTP = 3
Private Const INTERNET_FLAG_SECURE = &H800000
Private Const INTERNET_FLAG_KEEP_CONNECTION = &H400000
Private Const INTERNET_FLAG_DONT_CACHE = &H4000000
Private Const INTERNET_OPEN_TYPE_PRECONFIG = 0
Private Const ERROR_INTERNET_FORCE_RETRY = 12032
Private Const FLAGS_ERROR_UI_FILTER_FOR_ERRORS = 1
Private Const FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS = 2
Private Const FLAGS_ERROR_UI_FLAGS_GENERATE_DATA = 4
Private Const HTTP_STATUS_PROXY_AUTH_REQ = 407
Private Const HTTP_STATUS_OK = 200
Private Const HTTP_STATUS_CREATED = 201
Private Const HTTP_QUERY_STATUS_CODE = 19
Private Const HTTP_QUERY_FLAG_NUMBER = &H20000000
Private hOpenHandle As Long
Private hConnectHandle As Long
Dim hResourceHandle As Long
Dim sString As String
Dim sReadBuffer As String * 65000
Dim lNumberOfBytesRead As Long
Dim lStatus As Long
Dim dwErrorCode As Integer
Dim dwError As Integer
Private Sub Command1_Click()
    hOpenHandle = InternetOpen(App.Title, INTERNET_OPEN_TYPE_PRECONFIG,
vbNullString, vbNullString, 0)
    hConnectHandle = InternetConnect(hOpenHandle, "
www.microsoft.com
",
INTERNET_DEFAULT_HTTP_PORT, vbNullString, vbNullString,
INTERNET_SERVICE_HTTP, 0, 0)
    hResourceHandle = HttpOpenRequest(hConnectHandle, "GET", "/index.htm",
vbNullString, vbNullString, 0, INTERNET_FLAG_KEEP_CONNECTION +
INTERNET_FLAG_DONT_CACHE, 0)
resend:
    Call HttpSendRequest(hResourceHandle, vbNullString, 0, "", 0)
    Call HttpQueryInfo(hResourceHandle, HTTP_QUERY_FLAG_NUMBER Or
HTTP_QUERY_STATUS_CODE, lStatus, Len(lStatus), 0)
    If lStatus = HTTP_STATUS_PROXY_AUTH_REQ Then
    'Set error code
        If hResourceHandle Then
         dwErrorCode = 0
        Else
         dwErrorCode = Err.LastDllError
        End If
 'Ask for proxy login
     dwError = InternetErrorDlg(0, hResourceHandle, dwErrorCode,
FLAGS_ERROR_UI_FILTER_FOR_ERRORS Or FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS Or
FLAGS_ERROR_UI_FLAGS_GENERATE_DATA, vbNullString)
 'Resend request with proxy authorization
    If (dwError = ERROR_INTERNET_FORCE_RETRY) Then
     GoTo resend
    End If
End If
    If lStatus <> HTTP_STATUS_OK And lStatus <> HTTP_STATUS_CREATED Then
        InternetCloseHandle (hResourceHandle)
        Exit Sub
    End If
 
   sReadBuffer = vbNullString
   InternetReadFile hResourceHandle, sReadBuffer, Len(sReadBuffer),
lNumberOfBytesRead
   sString = sString & Left$(sReadBuffer, lNumberOfBytesRead)
   If sString <> "" Then
        Debug.Print sString
    End If
    InternetCloseHandle (hResourceHandle)
 
End Sub
--------------------------------
Inviato via 
http://usenet.libero.it

 documentazione sulle funzioni.
Ah beh, se non lo capisci tu non lo capirai nessuno!
Communque la problema é generico. Ci sono generose tempi di timeout su 
rete WAN, per motivi ovvio. Le chiamate che state utilizzando sono dei 
"blocking" call, ovvero tuo applicazione rimane bloccato affinché non 
ritornano, che sara dopo i timeouts.
Se vuole che la tua applicazione poi fa collegamenti WAN ma continua ad 
esserci responsivi localmente allora dovrebbe wrappare l'acesso WAN in 
un Active X DLL che giro su un thread suo. Ma non so a che punto poi 
arrivare con VB, l'unici apps che scrivo in VB con thread multiplo sono 
senza interfaccia utente, ansi, sono senza anché eventi.


[*Roger Irwin*=
noe...@spam.net
] ha scritto:
Il quoting, porca pupattola!


Ho capito quello che dici e non è neanche difficile da realizzare dovrei
solo compilare la classe dove ho centralizzato il codice per l'accesso ad
internet come activex exe e notificare i risultati attraverso degli eventi.
Comunque quello che chiedevo è diverso io vorrei solo, io vorrei solo sapere
il motivo per cui l'applicazione per fare l'unload ci mette quasi un minuto,
in teoria con InternetCloseHandle essa dovrebbe chiudere la connessione e
rilasciare le risorse, ma evidentemente c'è qualcosa che non va.....


rilasciare le risorse
E difatti cosi' e', pero' ci sono alcune cose nel codice pubblicato
che non ti parano da potenziali problemi:
1. Non testi il valore degli handles ottenuti: hOpenHandle,
hConnectHandle e hResourceHandle;
2. Chiudi esplicitamente solo hResourceHandle: e gli altri due?
-- 
ciao, hal

 ha scritto nel messaggio
news:sjphlvkqn1jd4e86c...@4ax.com...


Sono daccordo nel non fare polemica però per me è normale che prima di
arrivare ad una release funzionante
si abbia del codice instabile e con degli errori (anche madornali), se poi
per voi è normale scrivere al primo colpo del codice ottimizzato non posso
altro che farvi i complimenti.
Riguardo al mio post non è che io abbia fatto il copia incolla del codice
dal mio progetto, ho solo riportato un codice che sia da esempio.
Ho tralasciato tutti i vari test, e le chiamate nell'orginale non sono tutte
in una stessa sub, solo che non mi sembrava il caso di riportare nel NG il
codice di una intera classe.
Grazie ancora per l'aiuto.

codice di una intera classe.
Eh, ma e' proprio questo il problema, purtroppo :-(
A parte bug o problemi piu' o meno noti, molti comportamenti anomali
dipendono da come e' stato scritto/organizzato il codice, soprattutto
quando si ricorre da visual basic all' API del sistema operativo.
Per quel che ne possiamo sapere, poiche' scrivi che il codice postato
non e' quello vero, potresti aver aperto anche chiamate asincrone da
cui la InternetCloseHandle() attende conferma di chiusura, oppure aver
fatto chiamate bloccanti (potrebbe succedere con la InternetReadFile,
ad esempio).
Ma e' inutile ragionare sull'aria fritta...
-- 
ciao, hal

 ha scritto nel messaggio
news:hs5ilvkhe8qjnd8jb...@4ax.com...

Hai ragione credo che gli elementi da me riportati non siano sufficienti ad
illustrare sufficientemente il flusso del mio programma, comunque comincierò
col controllare le possibile cause che mi avete segnalato.
Nel caso non dovessi risolvere proverò a postare qualcosa che sia più
esplicativo.
Ancora grazie e ciao!!