Sincronizza Indice |
Scarica il progetto |
Testo dell'articolo |
Stampa l'articolo |
Dopo l'introduttiva presentazione delle dichiarazioni della classe passiamo direttamente alla fase implementativa; vedremo in ordine le proprietà pubbliche della classe, i suoi metodi pubblici ed infine quelli privati. L'ordine seguito è quello esclusivamente alfabetico per i tre gruppi; pertanto a volte saranno utilizzate funzioni descritte soltanto in seguito.
La proprietà Chiave di lettura e scrittura restituisce ed imposta l'handle della chiave utilizzata dalla classe assegnando il contenuto del membro interno. L'operazione di scrittura della proprietà è però leggermente più complessa: prima di assegnare il nuovo valore alla variabile lngKeyValue è necessario riaprire la nuova chiave (riga 77) e chiudere quella precedente (riga 78). Questo perché Windows tiene conto del numero di volte che la chiave
è stata aperta. Se due istanze aprono la stessa chiave, ed una
delle due istanze ne richiede la chiusura, l'handle dell'altra istanza
non verrà invalidato ed entrambe le chiavi chiuse.
Seguono due proprietà in sola lettura che restituiscono rispettivamente il numero di sottochiavi ed il numero di valori della chiave aperta. Entrambe le proprietà utilizzano la funzione API RegQueryInfoKey. In ambienti Windows NT/2000/XP è necessario che venga fornito un buffer per la classe, indicato da strClass.
La proprietà Security consente di recuperare ed impostare un valore relativo ai permessi concessi. Trascurabile su Windows 95/98/ME, necessaria invece su Windows NT/2000/XP.
La proprietà Valore si presenta un pochino più complessa delle precedenti. L'operazione di lettura recupera il contenuto dei valori: quello predefinito della chiave se non viene specificato il nome del valore, o quello indicato se ne viene specificato il nome. Sarà anche possibile recuperare con la stessa proprietà il tipo di dato passando una variabile come secondo argomento. Al ritorno della funzione tale variabile conterrà il tipo di dati del valore richiesto.
Alla riga 106 sono richiesti il tipo di dato del valore e l'ampiezza del contenuto del valore mediante la funzione RegQueryValueEx. Se il dato può essere recuperato, la variabile AmpiezzaBuffer conterrà la dimensione in bytes del buffer da allocare. Tale buffer sarà effettivamente allocato alla riga 108 ed i dati potranno quindi essere recuperati richiamando nuovamente la funzione RegQueryValueEx e fornendo il puntatore al buffer precedentemente allocato.
Avendo recuperato il contenuto del valore ed il suo tipo di dati, sarà quindi possibile effettuare la conversione nel formato più convenzionale: stringa per il tipo REG_SZ, numero intero double per il tipo REG_DWORD o matrice di byte per gli altri tipi di dato. Per quanto riguarda la conversione in stringa verrà effettuata la conversione da formato ANSI ad Unicode (riga 112). La conversione in numero double effettuerà un controllo in più alla riga 116: sebbene il processo di conversione è semplice (riga 117), esistono all'interno del registro alcuni valore memorizzati in maniera errata, ovvero con un numero di bytes minore o maggiore dei normali quattro che compongono un valore DWORD. Per tali casi sarà semplicemente restituita la matrice di dati senza effettuare la conversione (riga 119). Se il valore richiesto non esiste all'interno del registro oppure non è impostato alcun valore per esso, la dimensione del buffer sarà uguale a 0 e sarà pertanto restituito un valore Null (riga 125).
L'ultima proprietà è l'operazione di scrittura sul valore del registro. Come la precedente consente opzionalmente la specifica di un nome di valore e di un tipo di dati che se non specificato assume il significato di stringa (REG_SZ). Alla riga 132 viene effettuato un controllo d'obbligo sul tipo di dato specificato. Se il dato da scrivere è di tipo stringa esso sarà semplicemente convertito da Unicode ad ANSI e trasferito nella variabile binaria Buffer.
La situazione si complica nel caso dei tipi di dati binari specificato alla riga 136. Essi dovranno essere convertiti in maniera idonea in una matrice. L'operazione sarebbe uno scherzo se il tipo di dati non fosse Variant e come tale Visual Basic si rifiuterà di trattarlo o trasformarlo direttamente in matrice di byte, a meno che il suo sottotipo non sia Byte.
Sarà quindi verificato alla riga 137 che il nuovo valore passato sia una matrice: in tal caso verrà allocata una nuova matrice di bytes di nome Buffer della dimensione dell'altra matrice ed il contenuto verrà quindi ricopiato nella matrice Buffer. Sarà generato un errore se il sottotipo dei dati non è numerico (riga 151).
Sarà generato un avviso anche nel caso in cui i dati passati non siano in una matrice ed il tipo richiesto sia comunque di dati binari (riga 155). Nell'ultimo caso che il valore passato sia un valore Nullo sarà generata una matrice vuota (riga 158). Se invece il tipo di dati richiesto è il REG_DWORD sarà verificato che i dati non siano una matrice. Nel caso che non lo fossero dovrà quindi essere calcolato il nuovo valore ed assegnarlo ad una matrice di 4 bytes (righe 163-167). Se i dati sono invece in una matrice tali dati saranno ricopiati nel nuovo buffer (righe 169-172).
Tutti gli altri tipi di dati non sono supportati (righe 177-179). |
Fibia
FBI
|
Torna all'indice degli HowTo |