Sincronizza Indice |
Scarica il progetto |
Testo dell'articolo |
Stampa l'articolo |
Quella che segue è la parte più complessa dell'intero articolo: saranno trattati i metodi pubblici e privati della nostra classe clsFBIRegistry.
Le prime due funzioni sono le più scontate: ApriChiave effettua l'apertura di una chiave o di una sottochiave, mentre ChiudiChiave chiude la chiave aperta. Per la prima funzione potrà essere fornito l'handle ad una qualsiasi chiave aperta (da un'altra istanza o processo) oppure una chiave di sistema (come definito dall'enumerazione ChiaviPrincipali). Nel caso venisse utilizzato il valore CHIAVE_APERTA sarà utilizzato l'handle della chiave aperta dall'istanza della nostra classe. Il parametro sottochiave invece identicherà la sottochiave da apire rispetto alla chiave specificata. La funzione ChiudiChiave invece effettua semplicemente la chiusura della chiave e l'azzeramento dell'handle lngKeyValue.
In maniera analoga alla funzione vista in precedenza, la funzione CreaChiave consente la creazione e l'apertura di una sottochiave. Se la sottochiave richiesta non esiste essa verrà creata ed aperta. Il funzionamento è analogo alla funzione ApriChiave ma il parametro aggiuntivo NonCambiare consente di effettuare le due succitate operazioni senza tuttavia chiudere e cambiare la chiave utilizzata dall'istanza, ed indicata dalla proprietà Chiave. Questa possibilità si rivela utile quando si desidera creare una nuova sottochiave, ottenerne l'handle (come valore di ritorno della funzione) senza però chiudere la chiave sulla quale l'istanza sta lavorando.
La funzione ElencaChiave consente di recuperare il nome di una sottochiave in base al suo ordine, ad esempio la prima, la seconda o la terza sottochiave della chiave aperta. Viene utilizzata a tale scopo la funzione API RegEnumKeyEx.
In maniera analoga alla funzione precedente, la funzione ElencaChiavi restituisce un array contenente i nomi di tutte le sottochiavi presenti all'interno della chiave specificata. Se nessuna sottochiave è presente, restituirà valore Null. Utilizza la funzione RegQueryInfoKey allo stesso modo della proprietà NumeroSottochiavi per recuperare il numero complessivo delle sottochiavi ed allocare così il buffer necessario e poi ne estrae uno per uno i nomi utilizzando la funzione RegEnumKeyEx nella stessa maniera della funzione ElencaChiave.
La funzione ElencaValore consente di recuperare il nome di un valore specifico, di cui si possiede l'indice, all'interno della chiave indicata. Il funzionamento è molto simile a quello della funzione ElencaChiave con l'unica differenza che utilizza la funzione RegEnumValue per recuperare l'informazione dal registro.
E come la sua parente, la funzione ElencaValori restituisce un array contenente i nomi di tutti i valori presenti all'interno della chiave specificata. Restituisce invece Null in assenza di valori all'interno della chiave.
Le due funzioni di eliminazione: EliminaChiave ed EliminaValore consentono l'eliminazione rispettivamente di una chiave e di un valore. Tralasciamo per il momento l'ordine alfabetico e, saltando la funzione Esporta, passiamo direttamente alla funzione ForzaAggiornamentoChiave. Vista la loro complessità, le due funzioni di esportazione ed importazione saranno trattate nella prossima parte.
La sua utilità è dubbia e potrebbe generare sospetti sul corretto funzionamento della classe. Nel momento in cui viene richiesta la modifica di un valore nel registro i dati sono effettivamente alterati ma non immediatamente scritti su disco. Se ipoteticamente, un secondo dopo un'operazione di scrittura sul registro, andasse via la luce, al riavvio del computer il valore potrebbe non essere stato ancora scritto. Questo perché Windows utilizza un sistema di cache e di scrittura ritardata (lazy write) che non impegna troppo il computer in lente operazioni di scrittura. Essa seguirà infatti nei momenti più liberi del computer. La funzione ForzaAggiornamentoChiave e quindi RegFlushKey obbligano il sistema operativo a scrivere su disco tutte le modifiche relative alla chiave specificata, garantendo l'immediata scrittura su disco ma rallentando pericolosamente la velocità del sistema. In linea generale questa funzione non è necessaria ma in rarissimi casi può richiedersi utile. La funzione RegFlushKey viene chiamata dal sistema operativo sulle chiavi di sistema al momento dello spegnimento della macchina per assicurare la corretta scrittura dei dati su disco.
Prima di vedere le ultime due funzioni pubbliche relative all'esportazione ed all'importazione dei dati, diamo un rapido sguardo ad alcune funzioni private utilizzate in altre parti del codice.
La funzione DeQuote consente di rimuovere l'eventuali virgolette ( " ) alla sinistra ed alla destra di una stringa. Non rimuovono tutte le virgolette ma soltanto un singolo paio. Viene utilizzata per recuperare il nome reale dei valori durante la fase di importazione da file. La funzione Ceil prende il nome dalla funzione analoga del linguaggio JavaScript e restituisce il numero arrotodonato sempre per eccesso. È utilizzata per determinare l'ampiezza del buffer durante il processo di importazione.
Una funzione un po' unusuale è la HexDouble ed in un linguaggio quale il C non avrebbe probabilmente senso di esistere. Viene utilizzata durante il processo di esportazione per convertire un numero Double ovvero il valore DWORD (visto che in VB non è possibile definire Long senza segno) in una stringa esadecimale. L'istruzione Hex arriva infatti soltanto al 31° bit ed al superamento di questo, genera Overflow. La funzione scompone il numero Double in due parti: la parte alta è mantenuta nella variabile HighPart mentre la parte bassa rimane nel parametro Numero. I due valori sono poi convertiti separatamente e le due stringhe unite solo in seguito alla conversione. Il parametro Padding è utile per assicurare una lunghezza minima di quella specificata in tale argomento; eventuali cifre mancanti saranno riempite con zeri alla sinistra.
La funzione Replace è del tutto inutile ai programmatori
VB6 ma per chi usufruisce (come me) della versione 5 di VB essa
è indispensabile. Com'è ovvio, consente di sostuire tutte
le occorrenze di una data stringa con un'altra e presenta alcune marginali
differenze rispetto alla funzione Replace nativa in VB6. |
Fibia
FBI
|
Torna all'indice degli HowTo |