deck_bsd
Messages postés1243Date d'inscriptionjeudi 31 mars 2005StatutMembreDernière intervention 3 août 2016
-
5 août 2006 à 12:00
deck_bsd
Messages postés1243Date d'inscriptionjeudi 31 mars 2005StatutMembreDerniè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 :
nightlord666
Messages postés746Date d'inscriptionvendredi 17 juin 2005StatutMembreDernière intervention23 mai 200710 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.
nightlord666
Messages postés746Date d'inscriptionvendredi 17 juin 2005StatutMembreDernière intervention23 mai 200710 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.
nightlord666
Messages postés746Date d'inscriptionvendredi 17 juin 2005StatutMembreDernière intervention23 mai 200710 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
nightlord666
Messages postés746Date d'inscriptionvendredi 17 juin 2005StatutMembreDernière intervention23 mai 200710 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.
nightlord666
Messages postés746Date d'inscriptionvendredi 17 juin 2005StatutMembreDernière intervention23 mai 200710 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.
deck_bsd
Messages postés1243Date d'inscriptionjeudi 31 mars 2005StatutMembreDernière intervention 3 août 20162 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 :)
deck_bsd
Messages postés1243Date d'inscriptionjeudi 31 mars 2005StatutMembreDernière intervention 3 août 20162 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 :/
deck_bsd
Messages postés1243Date d'inscriptionjeudi 31 mars 2005StatutMembreDernière intervention 3 août 20162 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