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 + 24))      ' per i sistemi a 32bit questo valore va impostato a "16"
  
  Print "La Proprietà '.Name' è: "; String@(Pointer@(p2 + 40))      ' per i sistemi a 32bit questo valore va impostato a "24"
  
  If IsNull(Pointer@(p2 + 24)) = False Then
    Print "La Proprietà '.Background' è: ";; Hex(Long@(Pointer@(p2 + 24)) \ CLong(2 ^ 32), 8)      ' i primi due byte a sinistra del risultato rappresentano il valore 'alfa'
    Print "La Proprietà '.Foreground' è: ";; Hex(Int@(Pointer@(p2 + 24)), 8)
  Endif
  
  p3 = Pointer@(p2 + 64)
  Print "La Proprietà '.Parent' è: ";; String@(Pointer@(p3 + 40))
     
End