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

Windows Discussion :

RegEnumValue() pour la lecture de registre


Sujet :

Windows

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 26
    Points : 10
    Points
    10
    Par défaut RegEnumValue() pour la lecture de registre
    Salut à tous ,


    Je viens vous exposer mon problème...

    Je souhaite récupérer les port COM disponible via le registre.
    Donc j'ai fait un petit bout de code :
    EDIT : modification du code :
    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
    HKEY key;
        RegOpenKeyEx(HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM",0,KEY_ALL_ACCESS,&key);
        //définition des variables local 
        unsigned long NNom=25,NVal=25;
        char *Valeur=new char[25],*NomVal=new char[25];
        int Ret,i=0;
    
        //parcourt la partie concernee de la base de registre
        do {
            //ouverture d'une clé
            NNom=25;
            NVal=25;
            Ret=RegEnumValue(key,i,NomVal,&NNom,0,0,Valeur,&NVal);
            //si pas d'erreur
            if (Ret != ERROR_NO_MORE_ITEMS) {
                printf("%s %s\n",Valeur,NomVal); // affichage
            }
            i++;
        } while (Ret != ERROR_NO_MORE_ITEMS);
        //fermeture de la base de registre
        RegCloseKey(key);
    et cela me retourne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    COM6 \Device\porte6
    COM7 \Device\porte7
    COM10 \Device\porte10
    COM11 \Device\porte11
    COM12 \Device\porte12
    COM13 \Device\porte13
    COM14 \Device\porte14
    COM20 \Device\porte20
    COM21 \Device\porte21
    COM22 \Device\porte22
    COM3 Winachsf0
    COM3 Winachsf0
    COM3 Winachsf0

    alors que cela devrais m'afficher quelque chose dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    COM1\Device\MosChipQuadSerial0
    COM2 \Device\MosChipQuadSerial1
    COM6 \Device\porte6
    COM7 \Device\porte7
    COM10 \Device\porte10
    COM11 \Device\porte11
    COM12 \Device\porte12
    COM13 \Device\porte13
    COM14 \Device\porte14
    COM20 \Device\porte20
    COM21 \Device\porte21
    COM22 \Device\porte22
    COM3 Winachsf0
    Donc mon probleme est que la fonction ne me retourne pas les port virtuelle.. Ceux créés par mon port USB!

    Si quelqu'un connait la solution pour voir les PORT COM virtuelle qui pourtant sont affiché dans le registre ! merci
    Merci d'avance aux personnes qui regarderons

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    J'a eu le même genre de problemes, ton buffer (25 char) n'est pas assez grand pour les valeurs que tu attends.

    Le retour de RegEnumValue() dans ce cas est une erreur (dans genre NOT_ENOUGTH_MEMORY, je n'ai pas d'exemple de mon code sous les yeux).

    Tu as 2 possibilités, soit tu alloues du 1er coup un buffer assez grand (1024) et tu espere que ca passe
    soit tu traites ce message d'erreur particulier pour réallouer un buffer plus grand (RegEnumValue() te donne la taille du buffer qu'il faudrait pour que cela passe).

    La 2eme méthode demande plus de travail mais au moins, tu n'y reviendras pas plus tard
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 26
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup !!!

    J'avais eu une autre erreur avant donc je n'avait pas remarqué l'erreur MORE_DATA.

    Je te remercie beaucoup car maintenant cela fonctionne

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 26
    Points : 10
    Points
    10
    Par défaut
    Nous avons continuez la discutions par MP :

    Citation Envoyé par ram_0000
    Citation Envoyé par scarlaty
    Salut !
    Merci pour ta réponse à propos de RegEnumValue.

    Tu me conseil 2 méthode dont une ou j'alloue la mémoire grace à RegEnumValue...

    Mais je ne trouve pas ou elle me renvoi la taille que je dois allouer..

    Si tu te souviens ?

    Encore Merci
    Lu dans le MSDN : le prototype de RegEnumValue
    LONG WINAPI RegEnumValue(
    __in HKEY hKey,
    __in DWORD dwIndex,
    __out LPTSTR lpValueName,
    __inout LPDWORD lpcchValueName,
    __reserved LPDWORD lpReserved,
    __out_opt LPDWORD lpType,
    __out_opt LPBYTE lpData,
    __inout_opt LPDWORD lpcbData
    );


    lpValueName contient le buffer dans lequel mettre la valeur lue
    lpcchValueName contient la taille du buffer alloué par toi même

    Lu dans le MSDN : If the buffer specified by lpData is not large enough to hold the data, the function returns ERROR_MORE_DATA and stores the required buffer size in the variable pointed to by lpcbData. In this case, the contents of lpData are undefined.

    Traduction : si ton buffer n'est pas assez grand, RegEnumValue() renseigne dans lpcchValueName la valeur qu'il aurait fallut et retourne ERROR_MORE_DATA.
    Dans ce cas, tu créés un autre buffer (ou tu réalloues) et tu recommences l'appel à RegEnumValue() qui devrait passer ce coup ci.
    Citation Envoyé par ram_0000
    Citation Envoyé par scarlaty
    Il y a 2 buffers donc on ne pas connaitre la valeur des 2 ..
    dommage
    Tu as effectivement raison, je ne l'avais pas vu.

    Soit Microsoft n'a pas prévu ce cas de figure (cela m'étonne tout de même)
    Soit le fonctionnement est le même pour lpcchValueName et pour lpcbData

    Si l'un des 2 buffer n'est pas assez grand, la fonction retourne ERROR_MORE_DATA. Il faut alors tester les 2 tailles de buffer pour réallouer le bon (ou les 2)

    Je ne sais te répondre, je crois qu'il faut tester mais je suis intéressé par la réponse (je n'ai pas le temps de tester ce soir)
    et j'ai testé mais lorsque RegEnumValue renvoi ERROR_MORE_DATA, elle ne renvoi pas la valeur des 2 buffers !

    Quelqu'un peut il nous éclairer à se sujet ?

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Je viens de tester ce matin et effectivement, pour le nom de la valeur, si le buffer n'est pas assez grand, la taille nécessaire n'est pas renseignée mais la fonction retourne avec ERROR_MORE_DATA

    donc la fonction retourne avec ERROR_MORE_DATA dans 2 cas :

    cas 1/ si le buffer du nom de la valeur n'est pas suffisant
    ==> mais la taille necessaire n'est pas renseigné

    cas 2/ si le buffer des données n'est pas suffisant
    ==> dans ce cas, la taille necessaire est renseignée

    Dans le traitement de l'erreur ERROR_MORE_DATA, il faut traiter les 2 cas

    cas 1/ si taille retournée >= taille allouee alors le buffer alloué pour le nom de la valeur n'est pas suffisant. Comme on ne connait pas la valeur necessaire, on peut doubler la taille de ce buffer tant que cela retourne ERROR_MORE_DATA et qu'on est dans ce cas

    cas 2/ si taille retournée >= taille allouee alors le buffer alloué pour la valeur n'est pas suffisant. Comme on connait la valeur necessaire, on peut directement allouer le bon buffer
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 26
    Points : 10
    Points
    10
    Par défaut
    ok c'est ce que je pensais faire... mais cela ralentit le traitement...

    Donc il est recommandé d'allouer déjà un buffer suffisant.. genre 1000

    Encore Merci a toi ram_0000

Discussions similaires

  1. Les freewares pour la lecture de fichiers multimédias
    Par Michaël dans le forum Autres Logiciels
    Réponses: 42
    Dernier message: 01/01/2020, 18h56
  2. Réponses: 4
    Dernier message: 19/01/2006, 14h35
  3. [CR9] Lecture du registre
    Par exyacc dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 04/11/2005, 11h17
  4. [EMF] Java pour la lecture d'EMF
    Par deepfred dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 22/04/2005, 15h39
  5. Réponses: 4
    Dernier message: 23/07/2003, 13h07

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