Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] errore di runtime 5 solo su win XP

Private Type OPENFILENAME
     lStructSize As Long
     hwndOwner As Long
     hInstance As Long
     lpstrFilter As String
     lpstrCustomFilter As String
     nMaxCustFilter As Long
     nFilterIndex As Long
     lpstrFile As String
     nMaxFile As Long
     lpstrFileTitle As String
     nMaxFileTitle As Long
     lpstrInitialDir As String
     lpstrTitle As String
     flags As Long
     nFileOffset As Integer
     nFileExtension As Integer
     lpstrDefExt As String
     lCustData As Long
     lpfnHook As Long
     lpTemplateName As String
End Type
Private OFName As OPENFILENAME
 
Dim FilePath As String
FilePath = Left$(OFName.lpstrFile, OFName.nFileOffset - 1)
 
Mi sapreste dire perchè la riga sopra, su Win XP mi da errore di runtime 
5: chiamata di routine o argomento non valido.
 
Mentre su Vista, Seven e win 8 funziona regolarmente.
 
Carmelo


A) Metti un breakpoint prima dell'istruzione incriminata e controlli il 
contenuto delle due stringhe.
 
debug.print "lpstrFile|" & OFName.lpstrFile & "|"
debug.print "nFileOffset|" & OFName.nFileOffset & "|"
stop
' riga esistente
FilePath = Left$(OFName.lpstrFile, OFName.nFileOffset - 1)
 
B) In alternativa aggiungi una messagebox che mostri il contenuto delle 
due stringhe, magari controllando con un parametro nella command-line se 
vuoi visualizzare i messaggi o no. Può anche essere utile in altri casi.
 
Setti una variabile globale booleana in un modulo .bas
 
global myDebugMODE as boolean
 
nel form di avvio (o quel che è) controlli se è stato attivato il debug, 
che si attiverà indicando come parametro nella commandline la parola -debug
 
if instr(1,command,"-debug",1) > 0 then myDebugMODE = true
 
(lo so che si può fare meglio ma per ora va bene lo stesso)
 
prima di eseguire la linea incriminata metti un
 
if myDebugMODE = True then
	MsgBox "lpstrFile|" & OFName.lpstrFile & "|" & vbnewline & _
	       "nFileOffset|" & OFName.nFileOffset & "|" , _
		vbinformation, _
		"myDebugMODE: FilePath"
 
end if
 
' riga esistente
FilePath = Left$(OFName.lpstrFile, OFName.nFileOffset - 1)
 
 
Così cosa è che genere quell'errore.
 
-- 
GbC
www.gbc.uno


Ho provato cosi:
Dim FilePath As String, iPos as Integer
iPos = (OFName.nFileOffset - 1) ==== > questa riga da errore
FilePath = Left$(OFName.lpstrFile, iPos)
 
L'errore lo genera OFName.nFileOffset
solo in win XP perchè?
 
Carmelo

>       nFileOffset As Integer
 
Prova a dichiararla come variant, sospetto che in alcuni casi
restituisca un "null" che non può essere infilato in un integer.




Così per curiosita', hai provato ad inizializzare esplicitamente a zero tutti i campi integer/long di quella struttura subito dopo aver dichiarato OFName? 
 

 nel suo ultimo post si è così espresso:
Prova così
iPos = (OFName.nFileOffset - 1!) ==== > questa riga da errore (punto esclamativo, o #)
 
 
 
 
 
-- 
http://freewarewiki.it
 
http://freewareonline.org
 
http://netuser.altervista.org
 
 

 nel suo ultimo post si è così espresso:
o meglio con il 1&


 solo in win XP perchè?
 
Ma tu lo sai o no cosa c'è in quel c@##o di variabile?
E se non lo sai che fai, vai a caso?
 
E poi... I sistemi su cui funziona sono x86 o x64?
 
 
-- 
GbC
www.gbc.uno


OFName.nFileOffset restituisce il numero di caratteri compresi tra 1 e 
l'ultimo "\". Cioè il path completo prima del nome del file.
Es: C:\programmi\prova.txt
 
OFName.nFileOffset restituisce 13
 
Carmelo


Grazie per la spiegazione, ma ci arrivavo da solo. ^^
 
Intendevo dire durante l'esecuzione del programma: è evidente che in 
ambienti diversi il valore ottenuto è diverso (e quindi che quello che 
hai detto nella risposta NON È VERO: non viene sempre riportata la 
lunghezza del percorso del file, tanto è che si genera un errore) ed è 
quindi indispensabile conoscere il valore della variabile SUBITO PRIMA 
che si generi l'errore. Cioè sapere cosa il SO mette in quella variabile.
 
Se vuoi azzardo una ipotesi. È 0 (o forse null) e left("AAA",-1) genera 
un syntax error. Ma finché non siamo sicuri non c'è modo di affermarlo 
con certezza.
 
Fatto sta che il valore riportato non è coerente.
 
Ho un sospetto. Le API per i sistemi a 64 bit sono diverse da quelle per 
i sitemi a 32. Si deve inserire uno pseudocodice per distinguere quale 
funzione utilizzare in funzione del SO host. Per questo ho domandato
 
 >> E poi... I sistemi su cui funziona sono x86 o x64?
 
Ci persi del tempo con una funzione per ridimensionare l'altezza delle 
liste delle combobox, che non riuscivo a variare sui sistemi a 64 bit. E 
quando ho sistemato su macchine x64 non funzionava più sui vecchi XP x86.
 
 
-- 
GbC
www.gbc.uno