Informations sur le volume en cours

Informations sur le volume en cours - C++ - Programmation

Marsh Posté le 11-07-2005 à 00:45:39    

Bonjour !!
 
J'aurai voulu avoir quelques informations, noms de fonctions, etc... à utiliser dans le cadre du procédé suivant :
 
1. récupérer la racine du chemin sur lequel l'exe est exécuté (je ne sais même pas si c'est nécessaire). Par exemple : l'application est exécutée sur F:/myApp/build/myApp.exe, j'aimerai récupérer le chemin tout d'abord, puis ensuite la racine.
 
2. tester le type de volume de la racine récupérée en 1 (CD-Rom, DVD-Rom, USB, HD, ...). J'ai essayé getVolumeInformation, mais ça ne me retourne pas le type, à priori.
 
3. récupérer le numéro de série du volume. getVolumeInformation me retourne une variable de type DWORD... Si j'ai bien compris, c'est le sérial recherché...
Dans le cas d'un stick usb, il y a un autocollant sur la tranche qui indique un numéro du genre "624736". Mais comment comparer ce numéro à la variable DWORD ?? j'ai essayé une comparaison en mettant ce numéro dans une variable DWORD, sans succès :(
Le procédé est surement sensiblement identique pour les CD-Rom, qui ont un numéro gravé dans la partie interne, mais mon premier problème est de pouvoir effectuer la comparaison entre la valeur "string" et la valeur "DWORD".
 
J'ai pas mal de problèmes de castings... genre faire un echo sur le buffer de sortie pour afficher des nombres, ou d'autres types de données non-string. Existe-t-il un moyen simple, comme on peut faire un "print_r" en php, qui nous affiche l'objet et son contenu quel qu'il soit ?
 
D'avance merci pour vos précieux conseils


Message édité par titouille le 11-07-2005 à 02:09:14
Reply

Marsh Posté le 11-07-2005 à 00:45:39   

Reply

Marsh Posté le 11-07-2005 à 09:41:34    

1/ GetModuleFileName( NULL, ... ) puis tu en extrait le nom de volume
2/ GetDriveType. Mais c'est pas aussi évolué que tu le souhaites. Pour distinguer CD/DVD, c'est plus complexe...
3/ ben faut convertir ta chaine. Utilise un istringstream.
 
Pour convertir dans l'autre sens (pour l'affichage), utilise un ostringstream, ou plus directement balance ça vers cout.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 11-07-2005 à 13:35:56    

Bonjour HelloWorld, et merci beaucoup pour ces réponses, ça m'a fait de bonnes pistes pour continuer mes tests.
 
Bon, il reste quelques problèmes, mais ça avance...
 
1. je récupère le chemin via getModuleFileName() dans un type char*.
Maintenant, si j'essaie de faire :
fprintf( stderr, "\n%s\n", myPath[0] ) pour tenter de récupérer la lettre du lecteur, mon exe plante lamentablement... un char*, c'est bien un tableau de caractères ?? pkoi lorsque je veux récupérer l'index 0, il me retourne un décimal de 58 ?? il me retournerai le code ASCII du caractère en index 0 ?
 
2. Pour GetDriveType, je pense que ça devrai aller avec les possibilités que ça donne. Je n'ai pas besoin d'aller jusqu'à différencier un CD d'un DVD, simplement connaitre le type de support (REMOVABLE, CDROM, FIXED), donc ça joue nickel :)
 
3. je n'ai pas compris comment utiliser istringstream...
Néanmoins, je n'avais pas compris tout de suite qu'il fallait passer %d pour afficher une valeur décimale, et j'ai pu afficher le numéro de série d'un stick tel que je le voulais... Mais je constate que ce numéro récupéré par windows ne correspond pas au numéro noté sur la tranche du stick USB...
J'ai également constaté que les types de support CDROM ne retourne pas de numéro de série... (0) C'est normal ?
 
 
Enfin, question un peu conne, mais bon... lors de mes études, on a fait du C++, mais sans jamais toucher à la classe String... On s'est fait ch... avec des tableaux de caractères, des pointeurs, etc...
Aujourd'hui, qu'est ce qui est préconisé ? est-ce que ça vaut toujours la peine de travailler avec des tableaux de caractères, ou est ce qu'on peut sans vergogne passer à la classe String ? Il existe une foule de fonctions qui retournent des objets de type char ou char*... on doit utiliser isstringstream et ostringstream pour faire des transtypages ?
Le transtypage en général, il existe des méthodes du genre intToString, intToBool, stringToChar, ou encore intval, stringval, etc.. ??  
Car le typage fort me semble vraiment difficile à surmonter, dans certains cas, mais bon, je n'ai pas une grande maitrise, je suis en train de reprendre les bases...
 
Merci pour les infos ;)

Reply

Marsh Posté le 11-07-2005 à 13:48:27    

1/ char*, c'est un pointeur sur un char. Reste à le faire pointer sur quelque chose...
Utilise le code suivant:

Code :
  1. char path[ MAX_PATH ];
  2. GetModuleFileName( NULL, path, MAX_PATH );
  3. cout << path << '\n';


 
3/ aide toi de ça:
http://c.developpez.com/faq/cpp/?p [...] S_strtonum
et de tout le chapitre sur les string en général.
 
En C++, faut utiliser les string. Les char *, c'est du C. printf, c'est du C. Ton "transtypage" se fait via les flux ([o/i]stringstream) et l'opérateur << ou >> qui fait le boulot.
Pour afficher un DWORD en hexa :
std::cout << std::hex << myDword;
http://c.developpez.com/faq/cpp/?p [...] tream_hexa


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 11-07-2005 à 14:18:30    

arf, j'ai honte...
 
Je venais pour dire que j'avais trouvé la faq (très bien faite) sur l'utilisation des string, mais tu m'as déjà devancé en mettant les liens, hem.
 
C'est assez marrant, car durant mes études, on a pourtant fait du C++, mais on nous a obligé à travailler avec des char, et également avec des pointeurs, ce qui n'est pourtant pas préconisé en C++ à ce que je lis... Je pense qu'ils voulaient mettre un maximum de difficulté pour qu'on sache utiliser les trucs de bas niveau, plutot que de chercher la simplicité.
 
En tout cas, merci pour ta réactivité et tes quelques exemples et remarques, je prend du plaisir à me remettre quelque peu au C++ :)

Reply

Marsh Posté le 11-07-2005 à 14:53:16    

Le C++ est assez mal enseigné. std::string est standard depuis 98, et pas mal de profs ont acquis leur bagage C++ avant cette date, du temps où C++ était un meilleur C.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed