Newsgroup: it.comp.lang.visual-basic
Titolo: Identificare un oggetto in modo univoco

Salve a tutti,
devo passare un oggetto ad una funzione di callback richiamata da una API di
windows
che mi permette di passare un parametri come Long. Sarebbe semplice passare
un puntatore
all'oggetto ma come fare per ottenerlo con Visual Basic 6.0?
Pur riusciendovi, e cioé avendo una variabile Long che contiene il puntatore
ad un oggetto,
come fare per associare a quel puntatore l'oggetto ben preciso?
In altre parole:
    Dim o As Object
    Set o = ptr... dove ptr è un puntatore (variabile Long)

     Set o = ptr... dove ptr è un puntatore (variabile Long)
CopyMemory()
' vado a naso:
Dim o As Object
Set o = New Object ' probabilmente questo è inutile se non dannoso
Call CopyMemory(ByVal ObjPtr(o), ByVal MyLongPtr, 4&)
Diciamo che sull'ultima bisognerà un po' giocarci :P
Ciao
--
' // Initialize the expression evaluator
Engines.Evaluator = CreateObject("
http://www.neodatatype.net
")
' // you can find resources for and from the NG here!
Me.SitoComune = "
http://www.it-lang-vb.net
"

 Diciamo che sull'ultima bisognerà un po' giocarci :P
<code>
Function ObjFromPtr(ByVal pObj As Long) As Object
    Dim obj As Object
    Call CopyMemory(obj, pObj, 4)
    Set ObjFromPtr = obj
    Call CopyMemory(obj, 0&, 4)
End Function
</code>
Ciao.
--
BSD is for UNIX-lovers -- linux is for Windows-haters.

     Call CopyMemory(obj, 0&, 4)
Giusto :)


>     Call CopyMemory(obj, 0&, 4)
A che serve quest'ultima? Mette a NULL la variabile interna obj che,
comunque,
a fine Function dovrebbe non avere più senso. O sbaglio?

 >     Call CopyMemory(obj, 0&, 4)

In realtà dovrebbe bastare
Function ObjFromPtr(ByVal pObj As Long) As Object
    Call CopyMemory(ObjFromPtr, pObj, 4&)
End Function
Piuttosto cambierei il tipo di ritorno con quello appropriato.


 non avere più senso. O sbaglio?
Prova a commentare la linea e vedrai cosa succede alla
chiusura dell'applicazione...


 In realtà dovrebbe bastare
Non basta, non basta. Provare per credere...


 chiusura dell'applicazione...
Però adesso ce lo spieghi :) anche perchè avevo già verificato qualcosa di
simile con questi giochetti su di un array: andava in crash all'uscita dalla
funzione quando VB distruggeva il descrittore dell'array privato (che era
"casualmente" puntato da un array pubblico :P ).
Ma gli oggetti sono gestiti in un modo leggermente diverso...


 diverso...
Alla fine si tratta del solito puntatore vagante, ma per
dettagli precisi bisognerebbe chiedere a chi ha conoscenze di
basso livello (che io non ho)...


 a fine Function dovrebbe non avere piů senso. O sbaglio?
A quanto pare serve perché alla fine della funzione, VB rilascia tutte le
variabili
locali, ovviamente. Per le variabili oggetto VB controlla se sono NULL
oppure no.
Se sono NULL non ci sono problemi, altrimenti cerca di controllare se
l'oggetto
puntato dalla variabile č ancora utilizzato (puntato da qualche altra
variabile
oggetto dell'applicazione). Se non č cosě, VB libera la memoria occupata da
quell'oggetto
puntato dalla variabile locale. Se la variabile oggetto da rilasciare punta
ad
un indirizzo casuale, VB crasha come ovvio.
Nel nostro caso, perň, non capisco perché la variabile obj, che abbiamo
impostato
in modo che punti al nostro oggetto di cui conoscevamo il puntatore,
dovrebbe
puntatore a zone non corrette della memoria e generare un crash.
Boh!

 e generare un crash. Boh!
Faccio una supposizione:
ogni oggetto in VB è un oggetto COM; la copia "forzata" con
CopyMemory non incrementa il reference count tramite la
funzione AddRef dell'interfaccia IUnknown.
Pertanto il GC del VB al momento del rilascio della memoria
combina qualche casino... (scritto con perfetto linguaggio
tecnico).
