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

Da Gambas-it.org - Wikipedia.
 
(10 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Un oggetto occupa anch'esso memoria. Quando viene creato, dunque, la variabile, che fa riferimento all'oggetto, punta ad un'area di memoria riservata.
+
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.
+
Possiamo così ottenere l'indirizzo di tale area di memoria dell'Oggetto e leggervi i dati contenuti.
 +
<BR>In particolare l'area di memoria allocata per l'Oggetto è rappresentata dalla ''Struttura'', identificata con il nome "OBJECT" e definita nel file header "''/home/[$USER]/gambasdevel/main/gbx/gbx_object.h'' " dei sorgenti di Gambas.
  
 
+
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":
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()
 
  '''Public''' Sub Form_Open()
 
+
 
   Dim p1, p2, p3 As Pointer
 
   Dim p1, p2, p3 As Pointer
    
+
   Dim s As string
  <FONT Color=gray>' ''Puntiamo alla variabile dell'oggetto "Label":''</font>
+
  p1 = VarPtr(Label1)
+
  <FONT Color=gray>' ''Punta alla variabile dell'Oggetto "Label" posto sul "Form":''</font>
 
+
  p1 = VarPtr(Label1)
  p2 = Pointer@(p1)
+
 +
<FONT Color=gray>' ''Penetra nella Struttura "OBJECT" del predetto file header "gbx_object.h":''</font>
 +
  p2 = Pointer@(p1)
 +
 +
<FONT Color=gray>' ''Penetra nel 1° membro della Struttura "OBJECT" rappresentato dalla Struttura "CLASS" del file header "gbx_class.h":''</font>
 +
  p3 = Pointer@(p2)
 +
 +
<FONT Color=gray>' ''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":''</font>
 +
  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
 
   
 
   
  p3 = Pointer@(p2)
+
  If Pointer@(p2 + (SizeOf(gb.Pointer) * 3))) > 0 Then
 
+
<FONT Color=gray>' ''i primi due byte a sinistra del risultato della seguente istruzione rappresentano il valore "alfa"''</font>
  Print "La Classe è: ";; String@(Pointer@(p3 + 24))     <FONT Color=gray>' ''per i sistemi a 32bit questo valore va impostato a "16"''</font>
+
    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à '.Name' è: "; String@(Pointer@(p2 + 40))     <FONT Color=gray>' ''per i sistemi a 32bit questo valore va impostato a "24"''</font>
+
  Endif
 
   
 
   
  Print "La Proprietà '.Background' è: ";; Hex(Long@(Pointer@(p2 + 24)) \ CLong(2 ^ 32), 8)      <FONT Color=gray>' ''i primi due byte a sinistra rappresentano il valore 'alfa'''</font>
+
  Print "Classe ereditata: "; String@(Pointer@(Pointer@(p3 + 16) + 24))
 
 
  Print "La Proprietà '.Foreground' è: ";; Hex(Int@(Pointer@(p2 + 24)), 8)
 
 
   
 
   
  p3 = Pointer@(p2 + 64)
 
  Print "La Proprietà '.Parent' è: ";; String@(Pointer@(p3 + 40))
 
     
 
 
  '''End'''
 
  '''End'''

Versione attuale delle 00:00, 22 mar 2023

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.
In particolare l'area di memoria allocata per l'Oggetto è rappresentata dalla Struttura, identificata con il nome "OBJECT" e definita nel file header "/home/[$USER]/gambasdevel/main/gbx/gbx_object.h " dei sorgenti di Gambas.

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

 If Pointer@(p2 + (SizeOf(gb.Pointer) * 3))) > 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 + 16) + 24))

End