Newsgroup: it.comp.lang.visual-basic
Titolo: Errore 438 non trappabile

Sto cercando di inviare via ftp l'indirizzo esterno della rete dove e' 
installato il programma:
-----------------------------------------------------------------
Sub verifica_wan_address()
    On Error GoTo eh_verifica_wan_address
1    Dim IE, RET, POS1, POS2
2    Dim WAN_IP As String
3    Set IE = CreateObject("internetexplorer.application")
4    IE.navigate "
http://ilmioip.isikom.it/
"
5
6    While IE.busy: DoEvents: Wend
7    RET = IE.Document.Title
8    IE.Quit
9    Set IE = Nothing
10    POS1 = InStr(1, RET, "il tuo IP indirizzo � ", vbTextCompare) + 3
11   POS2 = InStr(POS1 + 22, RET, " ", vbTextCompare)
12    WAN_IP = Right$(RET, Len(RET) - POS1 - 18)
'    MsgBox WAN_IP
13    num_file = FreeFile()
14    Open "c:\ip_corrente.txt" For Output As #num_file
15    Print #num_file, Date & "  " & Time & "  " & WAN_IP
16    Close #num_file
17    Inet1.Execute "
ftp://nome_utente:pass...@ftp.sitoweb.it
", "PUT 
c:\ip_corrente.txt  ip_corrente.txt"
18    While Inet1.StillExecuting: DoEvents: Wend
    Exit Sub
eh_verifica_wan_address:
    MsgBox "Procedura verifica_wan_address" & Chr(10) & "Errore n." & 
Err.Number & " => " & Err.Description & Chr(10) & "Alla linea " & Err.Line
    Resume Next
End Sub
-----------------------------------------------------------------
In pratica viene caricato un timer ed ogni minuto viene invocata la 
procedura sopra descritta
Funziona correttamente per 5-10 colpi, poi si blocca tutto restituendo 
l'errore 438, bloccandosi proprio e quindi senza far apparire la riga dove 
e' avvenuto l'errore
Immagino che il problema sia nella creazione istanza di IE, la riga 3, ma 
non posso esserne sicuro
Da cosa puo' dipendere?
Se mancasse qualcosa credo che neanche i 5-10 giri iniziali dovrebbe 
completare, giusto ?
Ciao e grazie
RobertoA

 ha scritto nel messaggio

Secondo me il problema si verifica sui while che non prevedono situazioni 
d'uscita, mettici dentro un contatore che dopo una quindicina di secondi ti 
faccia comunque uscire dal while.
Peraltro dato che la chiami ogni minuto, potrebbe essere meglio aprire 
l'oggetto IE solo la prima volta e tenerlo aperto provvedendo semplicemente 
ad aggiornarlo.
Ciao
Davide
-- 
"...perch� non esistono saggi per nascita."
(Ptahhotep, 2640 ac) 


In che senso non prevedono situazioni d'uscita?
Nel primo caso quando IE non e' piu' busy, nel secondo caso quando INET ha 
finito l'esecuzione
Dovrebbero incepparsi le istanze caricate (prima di Ie poi di Inet) per 
inlooppare il programma, ed anche se si girasse in un loop infinito non 
credo ci siano motivi per buttare fuori l'errore descritto
Ma quello che mi preoccupa di piu' e' l'impossibilita' di trapparre 
l'errore, e' come se fosse un 'super-errore' che se ne frega del gestore 
errori definito
Insomma, non riesco a vedere dove accade il problema e non ne capisco il 
motivo
Ciao e grazie
RobertoA

 gestore errori definito
C'� un errore con un numero ben preciso (438)
e il Goto Errore: non scatta!
Mi pare sia questo il punto di interesse generale.
Avanti, sotto con le ipotesi e congetture :)
-- 
Greg 

 RobertoA ha scritto...


Secondo me IE (o qualche componente collegato) v� in Crash,
probabilmente per un problema di memoria non rilasciata,
generando l'errore 438 (Object doesn't support this property or method ).
-- 
Ciao Fede
By Chicco Production
http://bcp.freetools.it

"greg" ha scritto

A vedere l'errore avrei puntato sull'Inet, con cui ho passato un bel
po' di guai. Ma a guardar meglio...
Perch� a me risulta che il 438 sia "L'oggetto non supporta questa
propriet� o metodo", o gi� di l�, e in quel codice l'unico altro oggetto
oltre Inet � IE.
http://support.microsoft.com/kb/193265/EN-US/
PRB: VB Doesn't Generate Compile Error for Misspelled Methods
Intanto suggerirei un bel log; ad ogni stadio logico mettere un
bell'AddLog "Sono al punto " & StadioAttuale, almeno quando
si pianta si sa che il colpevole � lo stadio successivo.
Codice semplificato per AddLog:
' ******************
Sub AddLog(RigaDiLog As String)
      Dim libero As Integer
      Dim Giorno As String, Orario As String
      Giorno = Format$(Now, "dd-mm-yyyy ")
      Orario = Format$(Now, "hh:mm:ss - ")
      libero = FreeFile
      Open DirTemp & Giorno & " log.txt" For Append As #libero
      Print #libero, Orario & RigaDiLog
      Close libero
End Sub
' ******************
Ad ogni stadio aggiungere qualcosa come
AddLog "Sono al punto " & 1,
AddLog "Sono al punto " & 2, eccetera.
Non uso IE come object, quindi mi vengono vari dubbi...
ma proprio perch� non lo uso, me li tengo per me :-).
Tra l'altro, la dichiarazione iniziale senza assegnazione di tipo
� roba da far venire i vermi... Le variant sono male.
Non saranno *IL MALE* come dice qualcuno pi� estremista di me,
ma di sicuro non sono un granch�.
Bye, G. 

 oggetto oltre Inet � IE.
Grazie Papero ( e Tiscali) , RobertoA sara contento di leggrti, ma...
a parte tutto, secondo te perche non scatta l'On Error?
-- 
Greg 


Ciao RobertoA l'errore � dovuto alla propriet� inesistente che hai inserito 
proprio nel messaggio di errore, per questo sembra che non scatta l'On Error 
e sempre per questo (cio� solo quanto scatta On Error) si verifica soltanto 
ogni 5-10 cicli:
MsgBox "Procedura verifica_wan_address" & Chr(10) & "Errore n." &
Err.Number & " => " & Err.Description & Chr(10) & "Alla linea " & Err.Line
err.line che cos'�? forse volevi scrivere erl?
-- 
Ciao
Geppo 

 err.line che cos'�? forse volevi scrivere erl?
SCRONFL. Aggiudicato :-D
In effetti, scattare forse scatterebbe pure, ma va in crash perche'
c'e' un errore non trappabile proprio nel gestore degli errori :-))
(Credo, almeno. Sono piuttosto incasinato in altro luogo, e non e'
che me la senta di analizzare a fondo la logica di quello che
succede...). Alla faccia della Q193265 che avevo segnalato.
Bye, G. 

>> '    MsgBox WAN_IP
CUT

Quando dico che non prevedono situazioni d'uscita intendo dire che se IE va 
in crash o stalla la tua routine non esce pi� dal while.
Siccome IE non � famoso per l'aprirsi sempre e comunque ma al contrario 
stalla per una certa percentuale di aperture per vari motivi, � chiaro che 
aprendolo ogni minuto ti esponi alla quasi certezza che prima o poi ti 
stalli bloccandoti l'applicazione.
Io suggerirei di o utilizzare un altro metodo per ricavare l'imformazione 
che ti serve o inserire un timer che ti tiri fuori dal while in ogni caso e 
che forzi la chiusura di IE.
Per il resto, come rilevato dagli altri, quando IE ti va in crash la tua 
gestione errori non funziona, ma questo � un altro problema.


 gestione errori non funziona, ma questo � un altro problema.
E non direi che e' un'altro problema
E' proprio questo IL problema
E' come affidarsi ad un salvagente e poi accorgersi che non ti tiene a galla
Se il suo mestiere e' fare il salvagente, deve tenerti su
Altrimenti bisogna cambiare salvagente
Dici che dal codice vb, non sia possibile rilevare un errore che intervenga 
in IE ?
Ciao e grazie
RobertoA

 RobertoA
LastDllEError mi pare... potrebbe servire?
-- 
Greg 

 intervenga in IE ?
Io butterei via il salvagente, e me ne cercherei un'altro, magari pi� 
efficiente!


 efficiente!
Bene, buttiamo l' ON ERROR nativo del linguaggio
Cosa consigli di usare per acchiappare errori tipo quello descritto (che 
intervengono su programmi lanciati dall'applicativo iniziale) ?
Ciao e grazie
RobertoA

 ha scritto nel messaggio

In effetti se il tuo on error funzionasse potrebbe essere efficace, ma io 
torno alla carica nel dire che aprire e chiudere ie in continuazione � molto 
pericoloso.
Non c'� proprio nessun altro modo per ricavare questo IP?


 intervengono su programmi lanciati dall'applicativo iniziale) ?
Vuoi a tutti i costi ricavare l'IP utilizzando IE.
Guarda che ci sono altre strade molto pi� pratiche!
Non ti intestardire, cerca piuttosto delle alternative,
magari utilizzando le API!
------------------------------------------------------------------
Copia su un Form:
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
Public Function GetUrlSource(ByVal sURL As String) As String
    Dim sBuffer As String * BUFFER_LEN, iResult As Integer, sData As String
    Dim hInternet As Long, hSession As Long, lReturn As Long
    hSession = InternetOpen("vb wininet", 1, vbNullString, vbNullString, 0)
    If hSession Then hInternet = InternetOpenUrl(hSession, sURL, 
vbNullString, 0, IF_NO_CACHE_WRITE, 0)
    If hInternet Then
        iResult = InternetReadFile(hInternet, sBuffer, BUFFER_LEN, lReturn)
        sData = sBuffer
        Do While lReturn <> 0
            iResult = InternetReadFile(hInternet, sBuffer, BUFFER_LEN, 
lReturn)
            sData = sData + Mid(sBuffer, 1, lReturn)
        Loop
    End If
    iResult = InternetCloseHandle(hInternet)
    GetUrlSource = sData
End Function
Private Function GetIP() As String
    GetIP = Left(GetUrlSource("
http://showmyip.com/simple
"), 15)
End Function
Private Sub Form_Load()
    MsgBox GetIP
    End
End Sub


 4    IE.navigate "
http://ilmioip.isikom.it/
"
[cut]
Posso consigliarti di usare l'oggetto "MSXML.XMLHTTP" anzich� usare IE: A te 
serve estrarre un piccolo pezzo dall'interno della pagina, non mostrare a 
video la pagina, quindi l'uso di XMLHTTP � molto pi� leggero e performante 
dato che non � interattivo con l'utente.
Io lo uso per monitorare lo stato della mia adsl sia connettendo un server 
esterno come fai tu sia accedendo alla  management web del router.
--
Jack
http://jack.logicalsystems.it/homepage
------------------------------------------------------------------------------------------------
Questa mail, le informazioni in essa contenute e gli eventuali file allegati 
sono da considerarsi personali e strettamente confidenziali.Se ricevete 
questa mail per errore, significa che ho bevuto piu' del solito e/o ho messo 
poco tabacco in quello che fumo.Se intendete riutilizzare a scopo 
commerciale le informazioni contenute in questa mail e riuscite a ricavarne 
dei soldi siete pregati di dirmi come ci siete riusciti affinche' possa fare 
altrettanto.
----------------------------------------------------------------------------------------------- 

 esterno come fai tu sia accedendo alla  management web del router.
Provero' anche questa
Grazie
RobertoA