Leggere nell'area di memoria occupata da un oggetto
Un Oggetto occupa anch'esso memoria: quando viene creato, la variabile, che fa riferimento all'Oggetto, punta a un'area di memoria riservata per quell'Oggetto..
Possiamo così ottenere l'indirizzo di tale area di memoria dell'Oggetto e leggervi i dati contenuti.
In particolare l'area di memoria allocata per l'Oggetto è rappresentata dalla Struttura, scritta in linguaggio C e identificata con il nome "OBJECT" e definita nel file header "/home/[$USER]/gambasdevel/main/gbx/gbx_object.h " dei sorgenti di Gambas:
typedef
struct {
CLASS *class;
intptr_t ref;
}
OBJECT;
Mostriamo un esempio pratico, 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 Dim s As string ' Punta alla variabile dell'Oggetto "Label" posto sul "Form": p1 = VarPtr(Label1) ' Penetra nella Struttura "OBJECT" del predetto file header "gbx_object.h": p2 = Pointer@(p1) ' Penetra nel 1° membro della Struttura "OBJECT" rappresentato dalla Struttura "CLASS" del file header "gbx_class.h": p3 = Pointer@(p2) ' Penetra nel 5° membro della Struttura "CLASS", che è un Puntatore di tipo "char", e lo dereferenzia ottenendo così il nome della "Classe" di appartenenza della "Label": Print "La Classe è: \e[1m"; String@(Pointer@(p3 + (SizeOf(gb.Pointer) * 3))) s = String@(Pointer@(p2 + (SizeOf(gb.Pointer) * 5))) If IsAscii(s) Then Print "\e[0mLa Proprietà '.Name' è: \e[1m"; s Print "\e[0mClasse ereditata: \e[1m"; String@(Pointer@(Pointer@(p3 + (SizeOf(gb.Pointer) * 2)) + (SizeOf(gb.Pointer) * 3))) End
Oggetti istanziati da codice
Per gli Oggetti istanziati da codice:
Private pl As New MediaPipeline Public Sub Form_Open() Dim p1, p2, p3 As Pointer p1 = VarPtr(pl) p2 = Pointer@(p1) p3 = Pointer@(p2) Print "La Classe è: \e[1m"; String@(Pointer@(p3 + (SizeOf(gb.Pointer) * 3))) Print "\e[0mClasse ereditata: \e[1m"; String@(Pointer@(Pointer@(p3 + (SizeOf(gb.Pointer) * 2)) + (SizeOf(gb.Pointer) * 3))) End
oppure così:
Private pl As New MediaPipeline Public Sub Form_Open() Dim p1, p2 As Pointer ' Punta alla variabile dell'Oggetto "MediaPipeline": p1 = Object.Address(pl) p2 = Pointer@(p1) Print "La Classe è: \e[1m"; String@(Pointer@(p2 + (SizeOf(gb.Pointer) * 3))) Print "\e[0mClasse ereditata: \e[1m"; String@(Pointer@(Pointer@(p2 + (SizeOf(gb.Pointer) * 2)) + (SizeOf(gb.Pointer) * 3))) End