GetLogicalDrives

Résolu
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 - 5 août 2006 à 12:00
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 - 5 août 2006 à 13:11
Bonjour,

Voila je voudrai récupérer tous les disque dur présent sur un pc avec une autre fonction que FindFirstVolume qui me parait moin rapide que GetLogicalDrives. Cependant je ne comprend pas trop sont fonctionne mais. Elle renvoie un masque de bit ou la position de chaque bit défini la lettre d'un disque. Ok, mais comme je fait pour passer en revue les différentes position ?  Je comptai vérifié bit par bit, mais j'ai vu une source de BruNews contenant ceci :

DWORD dwdrvs;
char szdrv[4];
if(!(dwdrvs = GetLogicalDrives())) return;
*((DWORD*)&szdrv) = 0x5C3A41;
goDrvs:
if(dwdrvs & 1) SendMessage(hcmb, CB_ADDSTRING, 0, (long) szdrv);
szdrv[0]++;
if(dwdrvs >>= 1) goto goDrvs;
SendMessage(hcmb, CB_SETCURSEL, 0, 0);
}

C'est bien mieu sauve que j'avoue mon ignorance quand à la compréhension de ce code :s.

Quelqu'un peut-il m'aider ?

Merci d'avance.

13 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
5 août 2006 à 12:19
szdrv[] contient "A:" donc 'A' en szdrv[0].

Tant que dwdrvs != 0:

if(dwdrvs & 1) SendMessage(hcmb, CB_ADDSTRING, 0, (long) szdrv);
si bit droit positionné, OK volume existe, je mets dans combo.

szdrv[0]++;
'A' passe à 'B' ("B:") puis sera 'C' etc...

if(dwdrvs >>= 1) goto goDrvs
décale dwdrvs 1 bit droit, si != 0 on conrtinue.

ciao...
BruNews, MVP VC++
3
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
5 août 2006 à 12:24
Bon je vais essayer de te réecrire ce code plus lisiblement :

DWORD dwdrvs;
char szdrv[4];
if(!(dwdrvs = GetLogicalDrives())) return;//0x005C3A41 en char[4] : [41, 3A, 5C, 00] (little endian) "A:"
*((DWORD*)&szdrv) = 0x005C3A41;
do
{
    //On regarde le premier bit de dwdrvs
    //Si il est à 1 on ajoute le disque à la combobox
    if(dwdrvs & 1) SendMessage(hcmb, CB_ADDSTRING, 0, (long)szdrv);
    szdrv[0]++;   //On ajoute un au code ASCII de la lettre du lecteur "A" -> "B"
    //On regarde le prochain disque : on décale les bits vers la gauche, si plus rien après on sort de la boucle
} while(dwdrvs >>= 1);
SendMessage(hcmb, CB_SETCURSEL, 0, 0);

J'espère que c'est plus lisible maintenant .

<hr size="2" width="100%" />Sachant qu'on peut toujours enlever une ligne à un programme, et que dans un programme il y a toujours un bug, un programme peut se résumer à une ligne avec un bug.
3
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
5 août 2006 à 12:49
Non car en faisant >>=, c'est l'écriture avec affectation.
A la sortie de GetLogicalDrives, on a ça :

00000000000000000000000000111101 (pour moi)
C'est à dire :
<li>1er bit à 1 -> Disque A</li><li>2eme bit à 0 -> Pas de disque B</li><li>3eme bit à 1 -> Disque C</li><li>4eme bit à 1 -> Disque D</li><li>5eme bit à 1 -> Disque E</li><li>6eme bit à 1 -> Disque F</li>Première boucle : on ajoute "A:" à la combobox, le nombre est 000011110
Deuxieme boucle : on n'ajoute rien, le nombre est 00001111
Troisieme boucle : on ajoute "C:" à la combobox, le nombre est 0000111
...............
Sixieme boucle : on ajoute "F:" à la combobox, le nombre est 000000000, soit 0.
On sort de la boucle.
<hr size="2" width="100%" />Sachant qu'on peut toujours enlever une ligne à un programme, et que dans un programme il y a toujours un bug, un programme peut se résumer à une ligne avec un bug.
3
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
5 août 2006 à 12:25
Oups Brunews a été plus rapide que moi

<hr size="2" width="100%" />Sachant qu'on peut toujours enlever une ligne à un programme, et que dans un programme il y a toujours un bug, un programme peut se résumer à une ligne avec un bug.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
5 août 2006 à 12:37
haaaaaa vivivi cela devient plus claire, cependant pour quoi avoir fait *((DWORD*)&szdrv) = 0x005C3A41; au kieu de déclarer szdrv[4] = "A:" ???
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
5 août 2006 à 12:40
szdrv[4] est incorrect, plutot strcpy(szdrv, "A:\"), mais je sais que Brunews est allergique aux boucles inutiles.

<hr size="2" width="100%" />Sachant qu'on peut toujours enlever une ligne à un programme, et que dans un programme il y a toujours un bug, un programme peut se résumer à une ligne avec un bug.
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
5 août 2006 à 12:41
En fait l'écriture de Brunews se fait en une instruction asm :
mov dword ptr[szdrv], 0x005C3A41 ;Je pense, je suis pas très fort en asm...

<hr size="2" width="100%" />Sachant qu'on peut toujours enlever une ligne à un programme, et que dans un programme il y a toujours un bug, un programme peut se résumer à une ligne avec un bug.
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
5 août 2006 à 12:44
oui oui c'est incorect j'ai écrit dans la précipitation c'était szdrv[] = "A:" que je voulait mettre . Encore une dernière chose :

dwdrvs >>= 1 si il en resort 1 on continue ok , mais j'ai un trou de synthaxe , on peut pas écrire aussi dwdrvs >> 1 tous simplement ? Et on dit si plus rien après on sort ... mais il se peut que un bit soit a 0 et le suivant à 1 :s . désolé pour toute cet question, mais je préfère tous comprendre :)
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
5 août 2006 à 12:46
Quand on dit plus rien après c'est pour dire la fin du masque ... ok ok
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
5 août 2006 à 12:47
Ben non mm pas lol , comment on sais que le masque est fini ? :s
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
5 août 2006 à 12:51
Oui je suis bête lol j'avai pas vu ça comme ça lol merci beaucoup :D
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
5 août 2006 à 12:55
une dernière chose mdr , toute dernière pourquoi dwdrvs >>= 1 ? je bloque sur la condition en faite . On décale jusqu'a ce qui reste 0 , on est bien daccord mais pourquoi affecter 1 ? on doit juste décale de 1 bit mais pas affecter 1 :/
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
5 août 2006 à 13:11
ok c'est bon , je vien de regarder dans mon bouquin :D j'utilise pour ainsi dire jamais les opérateur de bits . en faite
dwdrvs >>1 égale dwdrvs dwdrvs >> 1

donc c'est bon :p
0
Rejoignez-nous