Newsgroup: it.comp.lang.c++
Titolo: Unità realmente esistenti

Qualcuno sa indicarmi come 'vedere' le unità "a:, c:, d: ecc." realmente
presenti sul sistema?

presenti sul sistema?
Dipende tutto, naturalmente, dal sistema operativo
che usi... in Win32 (w95, w98, W/NT) hai la scelta
fra *due* comode chiamate di sistema:
GetLogicalDrives e GetLogicalDriveStrings.  La
prima di torna una "mappa di bit" -- un intero che
ha settati i bit corrispondenti ai vari drive presenti
(ad esempio, se hai A, C, e D: 1+4+8 -> 12); la
seconda ti deposita in un tuo array di caratteri i
nomi dei vari drive, ciascuno terminato da un
carattere zero binario, il tutto terminato da una
stringa vuota (cioe` due caratteri zero adiacenti),
quindi sempre nell'esempio avremmo:
    a, :, \, 0, c, :, \, 0, d, :, \, 0, 0
ove con 0 indichiamo il carattere 0 binario, non
quello ASCII.
Se a questo punto vuoi capire qualcosa di
come siano fatte le varie unita`, attento: se
chiedi informazioni su di un disco rimovibile,
e non c'e` nel drive un disco in quel momento,
verra` chiesto all'utente di infilarne uno (floppy,
CDROM, eccetera); puoi evitare questo con
SetErrorMode, ma, *attenzione*!!!
Alex

Alex Martelli wrote:

Sì, scusami, ma sono stato poco chiaro io. Allora, ho bisogno, lavorando in
finestra DOS sotto Win95 ed NT, di conoscere le unità realmente esistenti (
logicamente, appunto ). Siccome programmo in C++ usando il DJGPP, dovrei
utilizzare o qualche istruzione C o C++ ( che però non credo che esista)
oppure accedere a qualche specifico indirizzo in memoria dove reperire tali
informazioni, o ancora richiamare qualche interrupt specifico. Insomma, se
nel C++ per DOS non è presente un istruzione del genere che tu mi hai
descritto nella programmazione Windows avrei bisogno di una ricerca a basso
livello.
Simone

utilizzare o qualche istruzione C o C++ ( che però non credo che esista)
Dunque , un metodo potrebbe essere la chiamata all' int 21h con i seguenti
settaggi:
AX=4408h
BL=NumDrive (01h=A:,02h=B: ecc)
Se la funzione fallisce (e quindi il drive non c'e' ) il bit di Carry (CF)
e' settato ed in AL c'e' un codice di errore
tipicamente 0Fh (Drive Letter Invalid o giu' di li')
Se la funzione ha successo allora in AX ritorna 0001 se il drive e' fisso o
0000 se rimuovibile.
Ulteriori informazioni sul tipo di drive (se di rete o locale ) possono
essere prese con la funzione immediatamente successiva dell' INT 21 ovvero
AX=4409h.
In finestra DOS con Windows NT la cosa funziona certamente ma non vedo
motivi per cui non debba funzionare
anche sotto Windows 95.
Per la chiamata agli interrupt in genere ogni compilatore mette a
disposizione una funzione specifica.
Se non la trovi puoi tentare di scrivere una piccola funzioncina inline
assembly per fare la chiamata all' int 21h.
Sia se il compilatore fa uso di DOS Extender sia se compila per la modalita'
reale dovrebbe permetterti di chiamare l'INT 21 (non ho avuto modo di
provare con DJGPP)
ciao
Damiano

utilizzare o qualche istruzione C o C++ ( che però non credo che esista)
No, in C o C++ non esiste.  C'e` una sottofunzione dell'interrupt
21h (accesso DOS) che puoi accedere in assembler, ma e` un
pezzo che ho messo via i manuali di assembler per DOS.  Se i
tuoi programmi girano comunque sotto Win32 (95 ed NT) dovresti
potere dichiarare e usare le API di Win32 (magari linkando con
la Kernel32.lib eccetera) e in particolare quelle che ti dicevo -- ma
DJGPP non lo conosco, per cui non posso esserne sicuro.
Alex