Leggere nell'area di memoria occupata da un oggetto
Da Gambas-it.org - Wikipedia.
Versione del 10 nov 2024 alle 11:34 di Vuott (Discussione | contributi)
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 è: "; String@(Pointer@(p3 + (SizeOf(gb.Pointer) * 3))) s = String@(Pointer@(p2 + (SizeOf(gb.Pointer) * 5))) If IsAscii(s) Then Print "La Proprietà '.Name' è: "; s Dim i As Integer = Pointer@(p2 + (SizeOf(gb.Pointer) * 3)) If i > 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 Print "Classe ereditata: "; String@(Pointer@(Pointer@(p3 + (SizeOf(gb.Pointer) * 2)) + (SizeOf(gb.Pointer) * 3))) End