Visual Basic Simple
Associare un programma ad un'estensione
(seconda parte)
Sincronizza Indice
Sincronizza Indice
Scarica il progetto
Scarica il progetto
Scarica il testo dell'articolo
Testo dell'articolo
Stampa l'articolo
Stampa l'articolo
Ricerca personalizzata

Difficoltà: 5 / 5

<< Continua dalla parte 1

Segue l'unico metodo pubblico della classe: Register, che consente di registrare nel sistema l'estensione specificata ed associarvi un verbo, completo di descrizione aggiuntiva e del percorso del programma da richiamare.

  1. Public Function Register(ByVal newName As String, ByVal newFullName As String, ByVal newCommandPath As String) As Boolean
  2.   Dim fbiRegistry As clsFBIRegistry
  3.   Dim strNewPath As String
  4.   Register = False
  5.   m_SavedPath = ""
  6.   If ShowError(Len(m_strExt) = 0, "Specificare un valore per la proprietà Extension") Then Exit Function
  7.   If ShowError(Len(m_strFileType) = 0, "Specificare un valore per la proprietà FileType") Then Exit Function
  8.   If ShowError(Len(newName) = 0, "Specificare un valore per il nome del verbo") Then Exit Function
  9.   Set fbiRegistry = New clsFBIRegistry

Alla riga 107 è dichiarata la variabile fbiRegistry che verrà utilizzata per accedere al registro mediante la classe clsFBIRegistry. Alla riga 114 è istanziata la variabile fbiRegistry. L'altra variabile strNewPath sarà utilizzata per determinare la posizione in cui andranno memorizzate le impostazioni.

La funzione restituisce un valore booleano corrispondente all'avvenuta registrazione. Durante l'avvio saranno verificati i valori delle proprietà Extension, FileType e del verbo da registrare. In caso di valori nulli sarà generato un errore e la funzione sarà interrotta.

  1.   With fbiRegistry
  2.     Call .CreaChiave(HKEY_CLASSES_ROOT, "." & m_strExt)
  3.     If m_PreserveSettings Then
  4.       strNewPath = .Valore("") & ""
  5.       If Len(strNewPath) > 0 Then
  6.         m_DeferSettings = True
  7.         Call .CreaChiave(HKEY_CLASSES_ROOT, strNewPath)

Poiché verrà utilizzata dappertutto l'istanza fbiRegistry si è scelto di attivare il qualificatore immediato con With. La prima operazione da effettuare è quella di aprire (o creare se inesistente) la chiave corrispondente all'estensione da registrare.

La riga 118 spezza la funzione in due grosse parti: se la proprietà PreserveSettings è impostata su True allora dovranno essere rilevate le impostazioni attuali e preservate; in caso contrario dovranno essere utilizzate le altre proprietà della classe, senza alcun rispetto dei valori attuali.

Nel caso si scelga di preservare le impostazioni attuali, la prima operazione da eseguire sarà quella di capire se attualmente è utilizzato il deferring e tale verifica è fatta alle righe 119-120. Se esiste un valore di deferring sarà ridefinito il valore della proprietà DeferSettings e sarà aperta la chiave puntata dal valore di deferring.

  1.       Else
  2.         If .ApriChiave(CHIAVE_APERTA, "shell") <> 0 Then
  3.           m_DeferSettings = False
  4.           strNewPath = "." & m_strExt
  5.         Else
  6.           If m_DeferSettings Then
  7.             strNewPath = m_DeferredPath
  8.             Call .ApriChiave(HKEY_CLASSES_ROOT, "." & m_strExt)
  9.             .Valore("", REG_SZ) = strNewPath
  10.           Else
  11.             strNewPath = "." & m_strExt
  12.           End If
  13.         End If
  14.         Call .ChiudiChiave
  15.         Call .CreaChiave(HKEY_CLASSES_ROOT, strNewPath)
  16.         If (Len(m_strFileType) > 0) And (m_DeferSettings) Then .Valore("", REG_SZ) = m_strFileType
  17.       End If

Le cose si complicano se la registazione attuale non utilizza deferring. Ciò infatti può significare che la chiave non esiste oppure esiste ma semplicemente non fa uso di una registrazione reinviata.

Il primo controllo quindi da effettuare consiste nel verificare che esista una sottochiave di nome shell (riga 124). In tal caso sarà ridefinito il valore della proprietà DeferSettings per informare l'utente che le impostazioni attuali non utilizzano deferring e ci si prepara a lavorare con una chiave non rinviata.

Nel caso che la sottochiave shell non esista invece il programma dovrà comportarsi secondo le impostazioni delle proprietà DeferSettings e DeferredPath. Alla riga 131 sarà assegnato il valore per la chiave reinviata che sarà creata alla riga 137.

Se la proprietà FileType contiene qualche valore e si sta applicando il deferring allora sarà aggiunta anche la descrizione aggiuntiva del tipo di file.

  1.       m_SavedPath = "HKEY_CLASSES_ROOT\" & strNewPath
  2.       Call .CreaChiave(CHIAVE_APERTA, "shell")
  3.       If Len(m_strDefaultVerb) > 0 Then .Valore("") = m_strDefaultVerb
  4.       Call .CreaChiave(CHIAVE_APERTA, newName & "\command")
  5.       If ShowError(Len(.Valore("", REG_SZ) & "") > 0, "Impossibile sovrascrivere il verbo " & UCase$(newName) & vbNewLine & "se la proprietà PreserveSettings è impostata su True") Then
  6.         Call .ChiudiChiave
  7.         Set fbiRegistry = Nothing
  8.         Exit Function
  9.       Else
  10.         Call .ChiudiChiave
  11.         Call .ApriChiave(HKEY_CLASSES_ROOT, strNewPath)
  12.         If Len(m_strDefaultIcon) > 0 Then
  13.           Call .CreaChiave(CHIAVE_APERTA, "DefaultIcon")
  14.           .Valore("", REG_SZ) = m_strDefaultIcon
  15.           Call .ChiudiChiave
  16.         End If
  17.         Call .ApriChiave(HKEY_CLASSES_ROOT, strNewPath & "\shell\" & newName)
  18.       End If

Questa è la parte più complessa del codice. Dopo aver registrato il valore della chiave in cui andranno memorizzati i verbi viene creata la sottochiave shell (riga 141). Se è stato assegnato un valore alla proprietà DefaultVerb questo sarà immediatamente scritto nel valore predefinito della chiave appena creata.

Saranno quindi create con una sola riga le due sottochiavi corrispondenti al verbo richiesto nella registrazione (newName) e la corrispondente sottochiave command. Se la chiave esistesse già e ci fosse un valore predefinito l'elaborazione non dovrà procedere ulteriormente per non sovrascrivere i dati preesistenti. Infatti la proprietà PreserveSettings non consente di sovrascrivere verbi esistenti. Saranno quindi in ordine generato l'evento Error, chiusa l'ultima chiave usata, deallocata la variabile fbiRegistry ed interrotta l'esecuzione della funzione (righe 144-147).

Se invece la chiave non esistesse sarà semplicemente chiusa la chiave command aperta in precedenza ed aperta la chiave corrispondente al punto di registrazione (estensione o deferring). Dovrà quindi essere registrata l'icona specificata nella proprietà DefaultIcon (righe 151-155).

Completate queste premesse ci si potrà preparare alla registrazione del verbo vero e proprio.

  1.     Else
  2.       If m_DeferSettings Then
  3.         .Valore("", REG_SZ) = m_DeferredPath
  4.         Call .CreaChiave(HKEY_CLASSES_ROOT, m_DeferredPath, False)
  5.         m_SavedPath = "HKEY_CLASSES_ROOT\" & m_DeferredPath
  6.         If Len(m_strFileType) > 0 Then .Valore("", REG_SZ) = m_strFileType
  7.       Else
  8.         Call .EliminaValore("")
  9.         m_SavedPath = "HKEY_CLASSES_ROOT\." & m_strExt
  10.       End If
  11.       If Len(m_strDefaultIcon) > 0 Then
  12.         Call .CreaChiave(CHIAVE_APERTA, "DefaultIcon")
  13.         .Valore("", REG_SZ) = m_strDefaultIcon
  14.         Call .ChiudiChiave
  15.         Call .ApriChiave(HKEY_CLASSES_ROOT, IIf(m_DeferSettings, m_DeferredPath, "." & m_strExt))
  16.       End If
  17.       Call .CreaChiave(CHIAVE_APERTA, "shell")
  18.       If Len(m_strDefaultVerb) > 0 Then .Valore("") = m_strDefaultVerb
  19.       Call .CreaChiave(CHIAVE_APERTA, newName)
  20.     End If

Resta da valutare l'intera situazione in cui è stato scelto di non preservare le impostazioni attuali. Sarà verificato se dalla proprietà DeferSettings è stato scelto di usare il deferring: in tal caso sarà applicato immediatamente registrandone il valore e creando la nuova chiave (righe 159-162). Sarà inoltre aggiunta la descrizione completa del tipo di file (riga 163).
Nel caso non si desiderasse utilizzare il deferring è fondamentale assicurarsi che sia eliminato l'eventuale deferring preesistente, che altrimenti avrebbe la priorità (riga 165).

Se è stata impostata un'icona nella proprietà DefaultIcon essa sarà registrata alle righe 168-173. Lo stesso vale per il verbo di default (riga 175).

Al raggiungimento della riga 178 la chiave correntemente aperta punterà esattamente al verbo da registrare (righe 156 e 176).

  1.     If Len(newFullName) > 0 Then .Valore("", REG_SZ) = newFullName
  2.     Call .CreaChiave(CHIAVE_APERTA, "command")
  3.     .Valore("", REG_SZ) = newCommandPath
  4.     Call .ChiudiChiave
  5.   End With
  6.   Set fbiRegistry = Nothing
  7.   Register = True
  8. End Function

Segue la fase conclusiva della registrazione: la scrittura della descrizione aggiuntiva al verbo, se esiste nel parametro newFullName. Sarà infine creata la chiave command in cui sarà scritto il percorso del programma da richiamare per il verbo indicato.

La routine volge al termine con la chiusura dell'ultima chiave usata, la deallocazione della variabile fbiRegistry e l'impostazione del valore di ritorno a True, ad indicare la corretta registrazione del verbo.

Nell'esempio allegato è presente anche un progetto che utilizza questa classe con dati dimostrativi ma fondalmente inutili. Saranno utilizzate tutte le proprietà e le due modalità di registrazione dei dati, mediante scrittura sulla chiave dell'estensione e mediante deferring.

Si raccomanda di guardare i cambiamenti direttamente sul registro di Windows man mano che vengono chiamate le funzioni Register.

Fibia FBI
22 Dicembre 2002

Scarica il progetto
Scarica il progetto
Scarica il testo dell'articolo
Scarica il testo dell'articolo
Stampa l'articolo
Stampa l'articolo
Torna all'indice degli HowTo