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

Da Gambas-it.org - Wikipedia.
Riga 20: Riga 20:
 
   Print "La Proprietà '.Name' è: "; String@(Pointer@(p2 + 40))      <FONT Color=gray>' ''per i sistemi a 32bit questo valore va impostato a "24"''</font>
 
   Print "La Proprietà '.Name' è: "; String@(Pointer@(p2 + 40))      <FONT Color=gray>' ''per i sistemi a 32bit questo valore va impostato a "24"''</font>
 
    
 
    
   If IsNull(Pointer@(p2 + 24)) = False Then
+
   If Pointer@(p2 + 24) > 0 Then
 
     Print "La Proprietà '.Background' è: ";; Hex(Long@(Pointer@(p2 + 24)) \ CLong(2 ^ 32), 8)      <FONT Color=gray>' ''i primi due byte a sinistra del risultato rappresentano il valore 'alfa'''</font>
 
     Print "La Proprietà '.Background' è: ";; Hex(Long@(Pointer@(p2 + 24)) \ CLong(2 ^ 32), 8)      <FONT Color=gray>' ''i primi due byte a sinistra del risultato rappresentano il valore 'alfa'''</font>
 
     Print "La Proprietà '.Foreground' è: ";; Hex(Int@(Pointer@(p2 + 24)), 8)
 
     Print "La Proprietà '.Foreground' è: ";; Hex(Int@(Pointer@(p2 + 24)), 8)

Versione delle 18:28, 17 lug 2017

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 (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()
 
 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 + 24))      ' per i sistemi a 32bit questo valore va impostato a "16"
  
  Print "La Proprietà '.Name' è: "; String@(Pointer@(p2 + 40))      ' per i sistemi a 32bit questo valore va impostato a "24"
  
  If Pointer@(p2 + 24) > 0 Then
    Print "La Proprietà '.Background' è: ";; Hex(Long@(Pointer@(p2 + 24)) \ CLong(2 ^ 32), 8)      ' i primi due byte a sinistra del risultato rappresentano il valore 'alfa'
    Print "La Proprietà '.Foreground' è: ";; Hex(Int@(Pointer@(p2 + 24)), 8)
  Endif
  
  p3 = Pointer@(p2 + 64)
  Print "La Proprietà '.Parent' è: ";; String@(Pointer@(p3 + 40))
     
End