Sincronizza Indice |
Scarica il progetto |
Testo dell'articolo |
Stampa l'articolo |
Concludiamo questo lungo articolo con le ultime due funzioni della classe: SeparaValore e Importa: la prima servirà per estrarre da un file di testo il corretto nome e contenuto di un valore; la seconda si occuperà di leggere i dati da un file di testo compatibile con Regedit ed inserirli nel registro nella corretta posizione.
Semplice quanto banale, la funzione SeparaValore ricostruisce il corretto nome e contenuto di un valore dal formato proveniente da file (ovvero alterato dalla procedura di esportazione o dal programma Regedit). La ricostruzione terrà conto che all'interno del nome di un valore possono esserci anche quei simboli particolari quali le virgolette o il segno di uguaglianza e pertanto la separazione tra nome e contenuto del valore deve tenerne conto prima (righe 446-450), ed eliminare quelle alterazioni (righe 451-461).
Prima di iniziare l'elaborazione vera e propria saranno effettuati quei controlli d'obbligo quale l'accessibilità al file ed il controllo della sua intestazione (REGEDIT4). Nella mancanza di uno di questi due requisiti l'elaborazione verrà interrotta con un messaggio di errore (righe 476-487).
Verrà quindi letto il contenuto del file linea per linea (riga
491). Se i dati letti dal file termineranno sulla destra con un
Ottenuta quindi una riga completa di dati dal file sarà necessario
innanzitutto verificare se si tratti di una chiave oppure di un valore.
Le chiavi sono identificate da una coppia di parentesi quadre agli estremi
nella forma Verranno quindi estratte la chiave di sistema e la sottochiave rispetto a questa e salvata nella variabile newKey (righe 502-520).
Sarà adesso necessario aprire o creare la nuova chiave ottenuta. La funzione RegCreateKeyEx crea la chiave se non esiste ma provvede anche la sua apertura nel caso essa esista. Prima di aprire la chiave però, verrà chiusa la chiave eventualmente aperta in precedenza tramite RegCloseKey.
Se invece il dato estratto dal file non è una chiave, con grossissima
probabilità si tratterà di un valore dell'ultima chiave
aperta. Alla riga 527 vengono estratti nome (nella variabile LineBuffer)
e contenuto (nella variabile di ritorno Buffer) del valore recuperato
da file. Soltanto adesso potrà essere fatta l'analisi dei dati recuperati per determinare il tipo di dati trattati. Se il contenuto di tale valore dovesse iniziare con le virgolette ci troveremmo in presenza di un valore di tipo REG_SZ la cui conversione in array di bytes risulta molto semplice (righe 531-533).
Diversamente se il contenuto di tali dati inizia con la stringa
Sarà quindi allocato un buffer di bytes in base all'ampiezza dei dati binari recuperati. L'ampiezza è calcolata come arrotondamento per eccesso (Ceil) della lunghezza del buffer diviso per 3. Il numero tre sta ad indicare 2 bytes per ogni cifra binaria ed un byte per la virgola separatrice. Tali bytes saranno poi riconvertiti in numeri decimali ed inseriti nel buffer binario.
Se invece il tipo di dati estratto non è neanche quello binari si tratterà necessariamente del tipo di dati DWORD oppure di un caso di errore. Sarà quindi controllata la presenza della stringa "DWORD" e nel caso positivo verrà ricostruito il valore DWORD (righe 545-551). Come ultimissima ipotesi, se non si tratta né di stringhe, né di dati binari e né tantomeno di valori DWORD abbiamo dinanzi un caso di errore che non può essere gestito. Sarà generato un avviso e la procedura di importazione verrà interrotta (righe 552-555).
Il raggiungimento della riga 557 dovrebbe indicare nessuna interruzione e quindi un buffer caricato con i dati corretti e nella forma desiderata. La variabile TipoDati dovrebbe invece contenere il tipo di dati desiderato. Saranno quindi salvati tali dati sul registro tramite RegSetValueEx. Alla riga 526 abbiamo verificato la presenza di un simbolo "=" ad indicare la separazione tra nome del valore e suo contenuto. Se tale simbolo non dovesse essere affatto presente avremmo dinanzi un altro emblematico caso di errore; sarà generato un avviso e l'esecuzione verrà interrotta (righe 559-561). Al termine dell'importazione di tutti i valori sarà chiusa la
chiave aperta e si potrà quindi procedere all'importazione della
chiave successiva, fino alla fine del file, segnata anche dalla sua chiusura. |
Questo lunghissimo articolo si conclude qui. Ci sarebbe molto altro da dire ma risulterebbe troppo pesante. La classe sviluppata si presenta parecchio complessa e lunga ma altrettanto semplice e ben fatta. Nel progetto da scaricare è presente anche un semplicissimo esempio
a scopo dimostrativo delle principali funzioni della classe clsFBIRegistry,
tutta da scoprire. Fibia
FBI
|
Torna all'indice degli HowTo |