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)

(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

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