Newsgroup: it.comp.lang.visual-basic
Titolo: Puntatori....

Ho una funzione che mi restituisce un puntature alla stringa in memoria.
Come posso fare, in Visual Basic, a leggere il contenuto di quel puntatore.
Grazie,
    Davide

, 
dav...@tor.it
 
says...

crea un progetto con un modulo, senza form.
Incolla il codice nel modulo.
Esegui con F8.
ciao!
Option Explicit
'************************************************
'tenere aperta la finestra immediate ( CTRL - G )
'eseguire con F8
'************************************************
Private Declare Sub CopyMemory _
    Lib "kernel32" Alias "RtlMoveMemory" _
    (Destination As Any, Source As Any, ByVal length As Long)
Dim myString As String
Sub main()
caso1   'puntatore ai dati
caso2   'puntatore alla variabile
End Sub
Sub caso1()
Dim myS_Ptr As Long
Dim newStr  As String
'diciamo che myString è la stringa di cui tu hai il solo puntatore ai 
DATI (non alla variabile)
'lo scopo è riottenere "SuperPippo" dal solo puntatore, cioè dal
'valore di myS_Ptr
myString = "SuperPippo"
myS_Ptr = StrPtr(myString)
'istanzio due byte, inferiore e superiore: un carattere di una
'stringa vb è composta di due bytes (è standard unicode!)
Dim hiS As Byte, loS As Byte
'salvo anche i loro puntatori, per le operazioni di copia
Dim hiS_ptr As Long, loS_ptr As Long
hiS_ptr = VarPtr(hiS)
loS_ptr = VarPtr(loS)
'testStr: serve solo per debug!
'strPos: conterrà la lunghezza della stringa
'per scoprire la lunghezza, suppongo di trovare uno 0 binario dopo 
l'ultimo
'carattere valido. Se sai già la lunghezza, questo passaggio si salta
'Oppure potresti dimensionare per eccesso la stringa dove copi, poi 
"ripulirla"
Dim testStr As String
Dim strPos As Long
strPos = -1
Do
    strPos = strPos + 1
    CopyMemory ByVal hiS_ptr, ByVal (myS_Ptr + (2 * strPos)), 1
    CopyMemory ByVal loS_ptr, ByVal (myS_Ptr + (2 * strPos) + 1), 1
 
    testStr = Chr$(hiS)
    Debug.Print hiS & " - " & testStr
    testStr = Chr$(loS)
    Debug.Print loS & " - " & testStr
 
Loop While (hiS <> 0)
'Fine calcolo lunghezza stringa -> strPos contiene ora la lunghezza di 
myString
Dim CopyStr As String
'occorre dimensionare la stringa, cioè riservare la memoria. se non si 
fa, ci si becca
'un bel general protection failure alla copymemory
CopyStr = String$(strPos, " ")
CopyMemory ByVal StrPtr(CopyStr), ByVal myS_Ptr, strPos * 2
Debug.Print CopyStr
End Sub
Sub caso2()
Dim myS_Ptr As Long
Dim newStr  As String
'diciamo che myString è la stringa di cui tu hai il solo puntatore alla 
variabile
'lo scopo è riottenere "Superpippo" dal solo puntatore, cioè dal
'valore di myS_Ptr
myString = "SuperPippo"
myS_Ptr = VarPtr(myString)
Dim CopyStr As String
CopyMemory ByVal VarPtr(CopyStr), ByVal myS_Ptr, 4
'ecco la stringa!
Debug.Print CopyStr
'Attenzione!!!
'in questo caso CopyStr è una copia che condivide i dati!
'infatti, se "cancello" myString...
'd'accordo, tu hai solo il puntatore, e quindi si suppone che non lo 
faccia...
myString = ""
'CopyStr va persa
Debug.Print CopyStr
'se però ri-esegui la copia...
CopyMemory ByVal VarPtr(CopyStr), ByVal myS_Ptr, 4
'ecco la tua stringa...
Debug.Print CopyStr
End Sub

 Come posso fare, in Visual Basic, a leggere il contenuto di quel
puntatore.
prova a guardare la documentazione di CopyMemory
(se non hai MSDN --> 
http://msdn.microsoft.com
)
Ciao
Faber