IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Lister les clé USB connectées


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Par défaut Lister les clé USB connectées
    Bonjour,

    Je cherche à créer une fonction C++ permettant de lister les clé USB connectées à l'ordinateur.
    Je suis sous Visual studio 2005, et j'utilise un projet MFC.

    J'ai tapé le code suivant, mais aucune clé n'est détectée quand je lance le programme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    void listeLecteursAmovibles(void)
    {
    	DWORD lecteurs;
     
     
    	DWORD modif_bit[] = {
    	1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200,
    	0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000, 0x10000,
    	0x20000, 0x40000, 0x80000, 0x100000, 0x200000, 0x400000,
    	0x800000, 0x1000000, 0x2000000
    	};
     
    	char *liste_lecteur[] = {
    	"A:\\", "B:\\", "C:\\", "D:\\", "E:\\", "F:\\", "G:\\", "H:\\", "I:\\",
    	"J:\\", "K:\\", "L:\\", "M:\\", "N:\\", "O:\\", "P:\\", "Q:\\",
    	"R:\\", "S:\\", "T:\\", "U:\\", "V:\\", "W:\\", "Y:\\", "Z:\\"
    	};
     
    	strcpy_s(lecteursAmovibles, "");
     
    	lecteurs = GetLogicalDrives();
     
     
    	if(lecteurs == 0) {
    	MessageBox(NULL, _T("Impossible de lire les lecteurs presents sur votre ordinateur"),
    	_T("Erreur :-("), MB_OK|MB_ICONERROR);
    	}
     
    	for(int i = 0; i < 25; i++)
    	{
    		if(lecteurs & modif_bit[i])
    		{
    			UINT typeLecteur = GetDriveType((LPCWSTR)liste_lecteur[i]);
    			if(typeLecteur == 2)
    			strcat_s(lecteursAmovibles, liste_lecteur[i]);
    		}
    	}
     
     
    }
    Tous les lecteurs présent sont de type 1 (inconnu), mais aucun de type 2 (disque amovible).

    Merci d'avance pour votre aide.

    PS : Je cherche aussi à renvoyer les données de lecteursAmovibles par cette fonction, mais je n'y arrive pas. Il s'agit d'un char[255] que j'ai déclaré en global pour le moment, mais que je voudrais renvoyer à la fin de la fonction, pour faire plus propre. Si quelqu'un a une solution, ...

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    - Remplace tous les char par TCHAR
    - Met toutes les constantes chaîne dans un _T(...).
    - Remplace strcpy, strcat, etc. par _tcscpy, _tcscat, etc.
    - Supprime le cast dans GetDriveType.

    Il y a aussi la fonction GetLogicalDriveStrings qui donne directement les lettres associées aux lecteurs présents.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Par défaut
    Merci beaucoup pour ton aide, j'ai réussi à récupérer la lettre correspondant à ma clé USB.

    Par contre, je débute en C++, et je ne sais pas vraiment gérer les TCHAR.

    J'ai essayé de l'afficher, et je n'ai eu que l'adresse mémoire. J'ai donc utilisé un & devant ma variable, et j'ai le même résultat.

    J'ai casté en char*, mais je ne reçoit que le premier caractère.

    Comment faire pour obtenir toute la chaîne?

    Merci

  4. #4
    Membre éclairé Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Par défaut
    moi jai utiliser ce code sur Borland C++ builder si sa peut t'aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    int ListDesPeriphEjectable(TStringList *List)
    {
      char Buffer[100] = "";
      DWORD dwRet =0;
      int iNbrDrive = 0, iDriverType = 0;
      int iReturn = 0;
      AnsiString asTmp1, asTmp2;
     
            List->Clear();
            dwRet = GetLogicalDriveStrings(100, Buffer);
     
            if(dwRet != 0)
            {
                    iNbrDrive = dwRet / 4;
                    for(int i=0; i<iNbrDrive; i++)
                    {
                            asTmp1 = Buffer[i*4];
                            asTmp1 += ":";
                            asTmp2 = asTmp1 + "\\";
                            iDriverType = GetDriveType(asTmp2.c_str());
                            if(iDriverType == DRIVE_REMOVABLE)
                            {
                                    List->Add(asTmp1);
                                    iReturn ++;
                            }
                    }
            }
            return iReturn;
    }

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par CyberSlan Voir le message
    Merci beaucoup pour ton aide, j'ai réussi à récupérer la lettre correspondant à ma clé USB.

    Par contre, je débute en C++, et je ne sais pas vraiment gérer les TCHAR.

    J'ai essayé de l'afficher, et je n'ai eu que l'adresse mémoire. J'ai donc utilisé un & devant ma variable, et j'ai le même résultat.

    J'ai casté en char*, mais je ne reçoit que le premier caractère.

    Comment faire pour obtenir toute la chaîne?

    Merci
    Qu'est-ce que t'as essayé d'afficher ? Pour les TCHARs, il y a un tuto ici. Montre ton code actuel s'il te plaît. Je parie que t'as pas tout fait de ce que je t'ai dit.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Par défaut
    En fait, j'ai pas essayé d'afficher (désolé, je me suis trompé en postant), j'ai voulu l'écrire dans un fichier texte (je pense que c'est le même principe) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    void listeLecteursAmovibles(void)
    {
    	DWORD lecteurs;
            TCHAR lecteursAmovibles[255];
     
    	DWORD modif_bit[] = {											//Correspondance entre le résultat, et la lettre réelle
    	1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200,
    	0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000, 0x10000,
    	0x20000, 0x40000, 0x80000, 0x100000, 0x200000, 0x400000,
    	0x800000, 0x1000000, 0x2000000
    	};
     
    	TCHAR *liste_lecteur[] = {
    	_T("A:\\"), _T("B:\\"), _T("C:\\"), _T("D:\\"), _T("E:\\"), _T("F:\\"), _T("G:\\"), _T("H:\\"), _T("I:\\"),
    	_T("J:\\"), _T("K:\\"), _T("L:\\"), _T("M:\\"), _T("N:\\"), _T("O:\\"), _T("P:\\"), _T("Q:\\"), _T("R:\\"),
    	_T("S:\\"), _T("T:\\"), _T("U:\\"), _T("V:\\"), _T("W:\\"), _T("X:\\"), _T("Y:\\"), _T("Z:\\")
    	};
     
    	_tcscpy_s(lecteursAmovibles, _T(""));
     
    	lecteurs = GetLogicalDrives();
     
     
    	if(lecteurs == 0) {
    	MessageBox(NULL, _T("Impossible de lire les lecteurs presents sur votre ordinateur"),
    	_T("Erreur :-("), MB_OK|MB_ICONERROR);
    	}
     
    	for(int i = 0; i < 26; i++)
    	{
    		if(lecteurs & modif_bit[i])
    		{
    			UINT typeLecteur = GetDriveType((LPCTSTR)liste_lecteur[i]);
    			if(typeLecteur == 2)											//Teste si le lecteur est amovible
    			_tcscat_s(lecteursAmovibles, liste_lecteur[i]);
    		}
    	}
     
    std::string fichierSignet = "H:/USBlock.txt";	//Déclaration du chemin vers le fichier
     
    std::ofstream fichier(fichierSignet.c_str(), std::ios::trunc);
     
    if ( !fichier ){
    	  MessageBox(_T("Erreur de création du fichier"));
     
    	}
    	else
    	{
    		//Ecriture du fichier
    		fichier << &lecteursAmovibles << std::endl;
    		fichier.close();
    		MessageBox(_T("Fichier d'accès créé avec succès"));
    	}
     
    }
    En fait, je demandais plutôt ça par curiosité, car ce n'est pas vraiment ce que je veux faire. Mon but est de créer un fichier à la racine de chaque clé USB détectée.

    J'ai essayé de faire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TCHAR fichierSignet[15];
    	_tcscpy_s(fichierSignet, _T(""));
    	_tcscat_s(fichierSignet, lecteursAmovibles[0]);
    	_tcscat_s(fichierSignet, _T(":\\USBlock.txt"));
    mais j'ai une erreur de compilation :
    1>c:\documents and settings\sylvain\bureau\pair\projet\cryptagecle\cryptagecle\ajoutacces.cpp(112) : error C2665: 'wcscat_s' : aucune des 2 surcharges n'a pu convertir tous les types d'arguments

    Je suppose qu'il n'est pas possible d'utiliser un seul caractère pour le deuxième paramètre de _tcscat_s.
    Par contre, si je n'ai qu'une seul clé USB, je peux sans problème mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TCHAR fichierSignet[15];
    	_tcscpy_s(fichierSignet, _T(""));
    	_tcscat_s(fichierSignet, lecteursAmovibles);
    	_tcscat_s(fichierSignet, _T(":\\USBlock.txt"));
    Ce n'est pas génial, mais ça m'a permis d'avancer un peu.

    Merci à celui qui trouvera une solution

    PS : J'ai regardé ton tuto, c'est un peu plus clair maintenant pour ce qu'est un TCHAR.
    Merci

  7. #7
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Bon, je vais te proposer un nouveau code (clean) parce qu'il y a trop à rectifier (et à enlever ...).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void EnumLecteurs()
    {
        TCHAR lpLecteurs[100];
        TCHAR * p;
     
        /* Récupérer la liste de tous les lecteurs */
     
        GetLogicalDriveStrins(sizeof(lpLecteurs) / sizeof(TCHAR), lpLecteurs);
     
        /* Parcourir le tableau */
     
        for(p = lpLecteurs; *p != TEXT('\0'); p += _tcslen(p) + 1)
            TraiterLecteur(p);
    }
    Avec une fonction TraiterLecteur implémentée comme on veut (répondant aux besoins), par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void TraiterLecteur(TCHAR * lecteur)
    {
        MessageBox(NULL, p, TEXT("Un lecteur détecté !"), MB_OK);
    }
    Ton erreur de compilation vient du fait que _tcscpy_s et _tcscat_s nécessitent 3 arguments et non 2 comme _tcscpy et _tcscat (un 3ème pour spécifier la taille du buffer de destination pour éviter les débordements de tampon ..., voir MSDN).

    Citation Envoyé par CyberSlan
    Mon but est de créer un fichier à la racine de chaque clé USB détectée.
    A la manière d'un bon virus

    Sinon, créer un fichier n'a rien de compliqué, si tu sais comment faire bien sûr (mais garde à l'esprit que tu utilises TCHAR et non char) ...

    N'oublie pas de poster le code chaque fois que tu as un problème.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lister les peripheriques USB de mon PC en VB.net
    Par Naklov dans le forum VB.NET
    Réponses: 1
    Dernier message: 27/12/2009, 21h37
  2. Lister les clés USB et les formater en NTFS
    Par viaipi dans le forum C++/CLI
    Réponses: 0
    Dernier message: 12/12/2008, 21h21
  3. [MBR] Lister les lecteurs connectés
    Par Celelibi dans le forum Assembleur
    Réponses: 6
    Dernier message: 18/08/2005, 05h22
  4. [Tomcat] Lister les utilisateurs connectés
    Par will_mad dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 08/07/2005, 15h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo