Il linguaggio Visual Basic di Microsoft
 

[VB6] errore di runtime 5 solo su win XP

carmelo 4 Feb 2016 14:57
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
GbC 4 Feb 2016 15:23
Il 04/02/2016 14:57, carmelo ha scritto:
> 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
carmelo 4 Feb 2016 17:49
Il 04/02/2016 15:23, GbC ha scritto:
> Il 04/02/2016 14:57, carmelo ha scritto:
>> 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.
>
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
Franz_aRTiglio 4 Feb 2016 18:04
Il 04/02/2016, carmelo ha detto :

>> nFileOffset As Integer

Prova a dichiararla come variant, sospetto che in alcuni casi
restituisca un "null" che non può essere infilato in un integer.
Franz_aRTiglio 4 Feb 2016 18:07
Il 04/02/2016, carmelo ha detto :


> nFileOffset As Integer

Prova a dichiararla come variant, sospetto che in alcuni casi
restituisca un "null" che non può essere infilato in un integer.
Luca D 4 Feb 2016 19:16
On Thursday, February 4, 2016 at 5:50:05 PM UTC+1, carmelo wrote:
> Il 04/02/2016 15:23, GbC ha scritto:
>> Il 04/02/2016 14:57, carmelo ha scritto:
>>> 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.
>>
> 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

Così per curiosita', hai provato ad inizializzare esplicitamente a zero tutti i
campi integer/long di quella struttura subito dopo aver dichiarato OFName?
salclem2 4 Feb 2016 19:38
"carmelo" <carmelo.giu@alice.it> 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
salclem2 4 Feb 2016 19:39
> "carmelo" <carmelo.giu@alice.it> nel suo ultimo post si è così espresso:
o meglio con il 1&
>



--
http://freewarewiki.it
http://freewareonline.org
http://netuser.altervista.org
GbC 5 Feb 2016 11:05
Il 04/02/2016 17:49, carmelo ha scritto:
[snip]
> L'errore lo genera OFName.nFileOffset
> 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
carmelo 5 Feb 2016 14:28
Il 05/02/2016 11:05, GbC ha scritto:
> Il 04/02/2016 17:49, carmelo ha scritto:
> [snip]
>> L'errore lo genera OFName.nFileOffset
>> 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?
>
>
OFName.nFileOffset restituisce il numero di caratteri compresi tra 1 e
l'ultimo "\". Cioè il path completo prima del nome del *******
Es: C:\programmi\prova.txt

OFName.nFileOffset restituisce 13

Carmelo
GbC 5 Feb 2016 15:24
Il 05/02/2016 14:28, carmelo ha scritto:
> Il 05/02/2016 11:05, GbC ha scritto:
>> Il 04/02/2016 17:49, carmelo ha scritto:
>> [snip]
>>> L'errore lo genera OFName.nFileOffset
>>> 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?
>>
>>
> OFName.nFileOffset restituisce il numero di caratteri compresi tra 1 e
> l'ultimo "\". Cioè il path completo prima del nome del *******
> 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 ******* 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

Links
Giochi online
Dizionario sinonimi
Leggi e codici
Ricette
Testi
Webmatica
Hosting gratis
   
 

Il linguaggio Visual Basic di Microsoft | Tutti i gruppi | it.comp.lang.visual-basic | Notizie e discussioni visual basic | Visual basic Mobile | Servizio di consultazione news.