Differenze tra le versioni di "Leggere nell'area di memoria occupata da un oggetto"

Da Gambas-it.org - Wikipedia.
Riga 19: Riga 19:
 
    
 
    
 
   Print "La Proprietà '.Name' è: "; String@(Pointer@(p2 + (SizeOf(gb.Pointer) * 5)))
 
   Print "La Proprietà '.Name' è: "; String@(Pointer@(p2 + (SizeOf(gb.Pointer) * 5)))
 
+
 
   If Pointer@(p2 + 24) > 0 Then
 
   If Pointer@(p2 + 24) > 0 Then
<FONT Color=gray>' ''i primi due byte a sinistra del risultato della seguente istruzione rappresentano il valore "alfa"''</font>
+
<FONT Color=gray>' ''i primi due byte a sinistra del risultato della seguente istruzione rappresentano il valore "alfa"''</font>
 
     Print "La Proprietà '.Background' è: "; Hex(Long@(Pointer@(p2 + (SizeOf(gb.Pointer) * 3))) \ CLong(2 ^ 32), 8)
 
     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)
 
     Print "La Proprietà '.Foreground' è: "; Hex(Int@(Pointer@(p2 + (SizeOf(gb.Pointer) * 3))), 8)
 
   Endif
 
   Endif
 
+
 
   p3 = Pointer@(p2 + 64)
 
   p3 = Pointer@(p2 + 64)
 
   Print "La Proprietà '.Parent' è: "; String@(Pointer@(p3 + 40))
 
   Print "La Proprietà '.Parent' è: "; String@(Pointer@(p3 + 40))
 
   
 
   
 
  '''End'''
 
  '''End'''

Versione delle 15:55, 2 ott 2022

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, 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