Sincronizza Indice |
Scarica il progetto |
Testo dell'articolo |
Stampa l'articolo |
Ci avviciniamo alla fine di questo lungo tutorial. Saranno trattate le ultime quattro funzioni della nostra classe FBIRegistry relative ai processi di esportazione ed importazione dei dati del registro in file.
La funzione Esporta consente il salvataggio di una chiave, delle sue sottochiavi e dei loro valori in un file di testo compatibile con Regedit. La funzione richiede tre argomenti fondamentali: la chiave di sistema in cui si trova la sottochiave, il percorso logico della sottochiave rispetto alla chiave di sistema ed il nome del file in cui salvare tali dati. Gli altri due argomenti consentono di salvare soltanto la chiave specificata o anche tutte le sue sottochiavi. L'ultimo argomento specifica se creare un nuovo file di testo oppure aggiungere i dati a quelli già esistenti nel file. Il controllo alle righe 329-342 assicura che la chiave specificata sia una chiave di sistema nell'enumerazione ChiavePrincipali ed in tal caso ne registra il nome nella variabile NomeChiave. Se la chiave specificata non è una chiave di sistema verrà generato un avviso e l'esportazione verrà interrotta.
In funzione dell'argomento Aggiungi verrà creato un nuovo file di testo sovrascrivendo i dati precedenti oppure il file sarà aperto in modalità di Append per inserire nuovi dati (righe 344-348). Inoltre se la dimensione del file aperto è di zero bytes (ovvero il file è nuovo oppure vengono aggiunti dati su un file vuoto) verrà inserita una breve intestazione per rendere il file riconoscibile da Regedit (riga 349). Solo in seguito a questi necessari controlli verrà aperta la chiave richiesta per l'esportazione e passata con altri dati alla funzione SalvaRamo che vedremo tra poco. In sostanza la funzione SalvaRamo effettua l'operazione di esportazione dei dati vera e propria utilizzando l'handle di file passatole come argomento della funzione.
La nostra funzione Esporta infatti si occuperà soltanto dei controlli iniziali, dell'apertura del file, del richiamo della funzione SalvaRamo e della chiusura di file e chiave. Questo per dare completa flessibilità alla funzione SalvaRamo che non dovrà occuparsi di tutti questi noiosi compiti.
La funzione SalvaRamo, la più complessa dell'intero progetto, effettua il salvataggio del contenuto di una chiave su un file già aperto, mantenendo naturalmente il formato dei dati originali. La funzione richiede quattro parametri: Chiave è la chiave che si intende salvare, Percorso è il percorso logico della chiave nella struttura ad albero, FileNR è l'handle del file già aperto in cui scrivere i dati ed infine Sottochiavi determina se effettuare il salvataggio anche delle sottochiavi e dei valori in esse contenuti. La funzione si apre con il salvataggio su file del percoso (riga 373)
ed il recupero di tutti i valori presenti nella chiave specificata (riga
374). Per ogni valore recuperato sarà ottenuto anche il suo contenuto
(riga 377) ed effettuate alcune semplici conversioni per rendere l'esportazione
coerente con il formato REGEDIT4 (righe 379-384). Il valore predefinito
della chiave deve essere salvato come
Per fortuna o purtroppo il registro contiene una varietà di tipologie di dati presenti e soprattutto non tutti questi dati sono scritti nella maniera corretta. Per ogni tipo di dato trattato sarà necessario effettuare alcuni aggiustamenti in esportazione. L'esempio più semplice è il formato stringa REG_SZ che richiede soltanto la sostituzione di alcuni caratteri speciali ("\", Enter, a capo, virgolette) nelle corrispondenti sequenze escape e ciò viene effettuato utilizzando la funzione Replace. Purtroppo il caso degli altri tipi di dati non è altrettanto semplice. Esistono infatti alcuni dati che, pur essendo ad esempio valori REG_DWORD non contengono un valore corretto ma soltanto una matrice di bytes, quasi che si trattasse di dati REG_BINARY.
Nel caso del tipo di dati binario o DWORD dovrà quindi esser fatta
un'investigazione più profonda. Il primo di questi controlli consiste
nel verificare se i dati sono in forma di array ed in tal caso dovranno
essere trattati come dati binari, pur manentendo il formato di dati originale.
Tutti i dati binari devono essere salvati nel formato
Soltanto adesso sarà possibile convertire i singoli bytes della matrice in stringhe esadecimali utilizzando l'istruzione Hex$. Ma, ahinoi, non ancora finito qui: ogni riga da salvare che superi la lunghezza di 76 caratteri dovrà essere spezzata in altre righe (righe 406-409).
Se invece i dati recuperati non sono in forma di matrice, sarà
verificato che il tipo di dati sia DWORD perché anche questo tipo
richiede una sua particolare formattazione come Se i dati non sono né una matrice di bytes né un valore
DWORD allora saranno semplicemente scritti come numero decimale (se i
dati esistono) oppure non verranno scritti affatto. Sarà cioè
scritto soltanto il tipo di dati trattato come I tipi di dati REG_DWORD_BIG_ENDIAN, REG_LINK e REG_RESOURCE_LIST non saranno affatto trattati e quindi esclusi dal processo di esportazione. Alla riga 427 verrà infine scritto il buffer di dati preparato mediante i controlli e le conversioni appena fatti.
Un'intera chiave è stata salvata su file. Resta pertanto l'ultima possibilità ovvero quella di dover salvare ogni singola sottochiave della nostra chiave e così le sottochiavi delle sottochiavi, etc... Quest'operazione è svolta nel ciclo descritto alle righe 433-440. Sarà quindi aperta una sottochiave per volta, ricreato il percorso e richiamata ricorsivamente la funzione SalvaRamo con i nuovi dati. La ricorsività assicurerà il salvataggio di tutti i valori presenti in ogni sottochiave di ogni sottochiave della prima chiave. Questa è la ragione principale per cui abbiamo preferito separare
la routine Esporta da quella SalvaRamo. |
Fibia
FBI
|
Torna all'indice degli HowTo |