Leggere nell'area di memoria occupata da un oggetto

Da Gambas-it.org - Wikipedia.

Un oggetto occupa anch'esso memoria. Quando viene creato, dunque, la variabile, che fa riferimento all'oggetto, punta ad un'area di memoria riservata.

Possiamo così ottenere l'indirizzo di tale area di memoria dell'oggetto e leggervi i dati contenuti.


Mostriamo un esempio pratico (per sistemi a 64bit), con il quale leggeremo nell'area riservata di memoria di una Label posta sul Form, ed in particolare otterremo la denominazione della proprietà .Name e quello della Classe Label:

Public Sub Form_Open()
 
 Dim p1, p2, p3 As Pointer
 
' Puntiamo alla variabile dell'oggetto "Label":  
 p1 = VarPtr(Label1)
  
 p2 = Pointer@(p1)

 p3 = Pointer@(p2)
  
 Print "La Classe è: "; String@(Pointer@(p3 + (SizeOf(gb.Pointer) * 3)))
  
 Print "La Proprietà '.Name' è: "; String@(Pointer@(p2 + (SizeOf(gb.Pointer) * 5)))
  
 If Pointer@(p2 + 24) > 0 Then

' i primi due byte a sinistra del risultato della seguente istruzione rappresentano il valore "alfa"

   Print "La Proprietà '.Background' è: "; Hex(Long@(Pointer@(p2 + (SizeOf(gb.Pointer) * 3))) \ CLong(2 ^ 32), 8)
   Print "La Proprietà '.Foreground' è: "; Hex(Int@(Pointer@(p2 + (SizeOf(gb.Pointer) * 3))), 8)
 Endif
  
 p3 = Pointer@(p2 + 64)
 Print "La Proprietà '.Parent' è: "; String@(Pointer@(p3 + 40))

End