Newsgroup: it.comp.lang.visual-basic
Titolo: .....matrice????? .....ma non era una stringa?????

VB5PROITA + SP3
NT4WKSITA + SP3
In un programma che sto realizzando ho inserito in un modulo la seguente
dichiarazione API:
------------code----------
Public Declare Function WNetGetUserA Lib "mpr" (ByVal lpName As String,
ByVal lpUserName As String, lpnLenght As Long) As Long
------------end of code----------
e, all'interno di un altro modulo, la seguente dichiarazione:
------------code----------
Public Function NomeUtente() As String
   Dim sUserNameBuff As String * 255
   sUserNameBuff = Space(255)
   Call WNetGetUserA(vbNullString, sUserNameBuff, 255&)
   NomeUtente = Left$(sUserNameBuff, InStr(sUserNameBuff, vbNullChar) - 1)
End Function
------------end of code----------
All'interno della Sub Form_Load() di un form ho inserito la seguente
chiamata:
------------code----------
   lblLicenseTo.Caption = "Utente attuale: " + NomeUtente()
------------end of code----------
Vado per eseguire il progetto ma la compilazione si ferma nella
dichiarazione della Function NomeUtente(), evidenziando la chiamata alla
funzione "Left$" e con il seguente messaggio:
"Il carattere di dichiarazione tipo non corrisponde al tipo di dati
dichiarato"
Ho provato allora a chiamare la funzione "Left" al posto della funzione
"Left$" ma il compilatore si ferma sempre allo stesso punto, anche se con
un messaggio diverso:
"Prevista matrice"
Ho controllato nell'help e la funzione "Left$" non esiste (anche se il
Visualizzatore Oggetti la riporta come membro di VBA.Strings, al pari di
"Left"). Ho controllato allora la funzione "Left", ma la sua dichiarazione
e' "Function Left(String, Length as Long)" dunque non sembra avere bisogno
di una matrice ma di una stringa.
Mi sapete dare un consiglio?
~#~#~#~#~#~#~#~#~#~
Gabriele Bertolucci
pbe...@vi.ats.it
pbe...@freemail.it
http://userspace.ats.it/free/pberto/
http://www.fortunecity.com/skyscraper/spiff/523/
ICQ #: 9732192
~#~#~#~#~#~#~#~#~#~

Debugga [ InStr(sUserNameBuff, vbNullChar) - 1 ] e controlla che non sia
i   -1
Left restituisce il numero di caratteri specificato in Lenght a partire da
sinistra della stringa sUserNameBuff. Internamente la stringa è un'array
Byte che ha elementi da 0 a Len(Stringa). L'elemento -1 non esiste e VB ti
dice "Prevista matrice" erroneamente perchè effettivamente tu gli passi una
stringa di caratteri.
Fabio

   Call WNetGetUserA(vbNullString, sUserNameBuff, 255&)
Credo che il problema sia che (giustamente;-)) non gli piace la costante
vbNullString (che dovrebbe corrispondere ad un puntatore nullo, ovvero
"ByVal 0&") come parametro.
Se hai TechNet cerca Q161394, comunque modifica cosi' il codice e vedrai che
funziona (l'ho provato):
' -----------------------------------
Declare Function WNetGetUser Lib "mpr.dll" Alias "WNetGetUserA" (ByVal
lpName As String, ByVal lpUserName As String, lpnLength As Long) As Long
Public Function NomeUtente() As String
    Dim sName As String, sUserNameBuff As String
    Dim Status As Integer
    sUserNameBuff = Space$(255)
    If WNetGetUser(sName, sUserNameBuff, 255&) = 0 Then
        NomeUtente = Left$(sUserNameBuff, InStr(sUserNameBuff, vbNullChar) -
1)
    Else
        NomeUtente = ""
    End If
End Function
' -----------------------------------
    Alex Palmese
Attenzione: per scrivermi togliete "$$$" dall'indirizzo!