Visual Basic Simple
Visualizza la finestra di formattazione di un'unità
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à: 2 / 5

In alcuni progetti può essere utile richiamare la finestra standard di Windows per formattare un'unità. In questo HowTo vedremo come fare, sfruttando una funzione API della libreria SHELL32 non documentata.

Questo progetto si compone di un forme di un modulo standard per la definizione delle funzioni e costanti API. Scriviamo all'interno del modulo:

  1. Option Explicit
  2. Public Const DriveA As Integer = 0
  3. Public Const DriveB As Integer = 1
  4. Public Const DriveC As Integer = 2
  5. Public Const DriveD As Integer = 3
  6. Public Const DriveE As Integer = 4
  7. Public Const SHFMT_OPT_QUICK As Integer = 0
  8. Public Const SHFMT_OPT_FULL As Integer = 1
  9. Public Const SHFMT_OPT_SYSONLY As Integer = 2
  10. Public Const SHFMT_ERROR As Long = &HFFFFFFFF
  11. Public Const SHFMT_CANCEL As Long = &HFFFFFFFE
  12. Public Const SHFMT_NOFORMAT As Long = &HFFFFFFFD
  13. Private Const SHFMT_ID_DEFAULT As Integer = &HFFFF
  14. Private Declare Function SHFormatDrive Lib "SHELL32.DLL" (ByVal hWnd As Long, ByVal Drive As Integer, ByVal fmtID As Integer, ByVal Options As Integer) As Long

Nella sezione dichiarazioni abbiamo una serie di costanti ed una funzione API.
Alle righe 3-7 abbiamo le costanti indicanti il drive da formattare: ogni lettera di drive è rappresentata dal numero ordinale d'essa nell'alfabeto, così il drive A: ha valore 0, il drive C: ha valore 2, etc...

Alle righe 9-11 abbiamo dichiarato le modalità di formattazione del drive: SHFMT_OPT_QUICK per la formattazione veloce, SHFMT_OPT_FULL per la formattazione completa e SHFMT_OPT_SYSONLY per il solo trasferimento dei files di sistema.

Alle righe 12-14 abbiamo le costanti indicanti i codici di uscita della formattazione: SHFMT_ERROR in caso di errori, SHFMT_CANCEL per annullamento dell'operazione da parte dell'utente e SHFMT_NOFORMAT in caso di impossibilità a formattare l'unità.

L'ultima costante è la SHFMT_ID_DEFAULT ed indica il tipo di formattazione da eseguire (riga 15).

Alla riga 17, infine, abbiamo la dichiarazione della funzione API SHFormatDrive. Questa funzione non è documentata ufficialmente e risulta impossibile trovarla nei visualizzatori di dichiarazioni API. Essa richiede come parametri l'handle della finestra che richiede l'attivazione della finestra di formattazione, il drive indicato numericamente (vedi sopra), il tipo di formattazione da effettuare e le opzioni di formattazione (vedi sopra).

  1. Function FormatDriveDlg(ByVal OwnerhWnd As Long, ByVal Drive As Integer, Optional Options As Variant) As Long
  2.     If IsMissing(Options) Then Options = SHFMT_OPT_QUICK
  3.     FormatDriveDlg = SHFormatDrive(OwnerhWnd, Drive, SHFMT_ID_DEFAULT, Options)
  4. End Function

La nostra funzione di richiamo della finestra di formattazione si chiamerà FormatDriveDlg e richiede due parametri obbligatori ed uno opzionale.

Alla riga 20 viene controllato se è stato passato il parametro Options opzionale. Se non dovesse essere stato passato, sarà impostato come opzione di formattazione SHFMT_OPT_QUICK, ovvero la formattazione rapida.

Alla riga 21 viene richiamata la funzione ShFormatDrive passandole come parametri quelli ricevuti dalla nostra funzione ed il tipo di formattazione (SHFMT_ID_DEFAULT). Il risultato dell'operazione sarà riportato in uscita alla funzione FormatDriveDlg.

Possiamo adesso vedere il form semplicissimo per richiamare la finestra di formattazione per l'unità floppy A:

L'interfaccia si compone di un solo CommandButtondi nome btnFormatDrive al cui click verrà eseguito il seguente codice:

  1. Option Explicit
  2. Private Sub btnFormatDrive_Click()
  3.     Dim ret As Long
  4.     ret = FormatDriveDlg(Me.hWnd, DriveA)
  5.     Select Case ret
  6.         Case SHFMT_ERROR
  7.             MsgBox "Errore durante la formattazione"
  8.         Case SHFMT_CANCEL
  9.             MsgBox "Operatione annullata"
  10.         Case SHFMT_NOFORMAT
  11.             MsgBox "Questo drive non può essere formattato"
  12.         Case Else
  13.             MsgBox "Operazione completata."
  14.     End Select
  15. End Sub

L'unica routine è quella legata all'evento Click sul pulsante btnFormatDrive.
Alla riga 4 dichiariamo la variabile ret che riceverà il valore restituito dalla chiamata alla funzione FormatDriveDlg. La chiamata viene effettuata passando come parametri l'handle del form e la costante DriveA, per formattare il disco floppy.

In uscita dalla funzione, il valore ret conterrà un numero indicante un errore oppure la riuscita operazione.
Abbiamo così, alla righe 6-15, un controllo del contenuto della variabile ret. Per ogni suo valore appare una diversa finestra di dialogo informativa.


Figura 2La prova del progetto è molto semplice: la pressione dell'unico pulsante sul form richiama la nostra finestra di formattazione.

Qualunque sia stato il risultato dell'operazione, apparirà una finestra informativa.

Figura 3

In questo nostro esempio abbiamo voluto richiamare la finestra di formattazione per l'unità floppy per limitare al minimo gli accidentali danni.

È fondamentale non sottovalutare questo: prima di mostrare la finestra di formattazione di un'unità, avvisare sempre l'utente. Infatti, l'involontaria pressione di un tasto da tastiera può in pochi secondi cancellare preziose informazioni.

Si consiglia di non abusare di questa funzione, sebbene possa essere utile in progetti che richiedono l'utilizzo di un dischetto.

Roal Zanazzi
2 Febbraio 2001

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