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 :

Besoin d'aide pour lire dans le registre


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Points : 91
    Points
    91
    Par défaut Besoin d'aide pour lire dans le registre
    Bonsoir tout le monde,

    J'essai de faire un petit programme sous windows en console pour lire la valeur d'une clée dans le registre, mais il y a plusieurs choses que je ne comprend pas :

    Pour commencer, pour utiliser RegGetValue, faut-il avant utiliser RegOpenKey ? apparament d'après la doc crosoft pas forcement : "This handle is returned by the RegCreateKeyEx or RegOpenKeyEx function, or it can be one of the following predefined keys: HKEY_CLASSES_ROOT [...]".

    Voilà le bout de code que j'ai commencé à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        #define CLE "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer"
    
        HKEY cle;
        if (RegOpenKey(HKEY_CURRENT_USER, CLE, &cle) == ERROR_SUCCESS)
        {
            // clé ouverte, tentative de lecture
            printf("OK\n");
        }
        else {printf("RegOpenKey renvois une erreur\n");}
        
        RegCloseKey(cle);
    Donc le programme arrive à ouvrir la clé et renvois OK, mais ensuite ce que je ne comprend pas c'est que pour RegGetValue, il faut redéfinir le chemin vers la clée apparament ... je me suis dis : si il faut, il faut ... mais ça ne marche pas.
    J'ai essayé pas mal de truc, mais ça commence à m'énerver, alors j'ai tout effacé ... .

    Ce qui serais sympas, c'est que quelqu'un me complète ce petit bout de code pour qu'il lise par exemple la valeur de la clé NoDrives.
    Je remercie d'avance ce sauveur.

    Pierre.

  2. #2
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    tu devrais contacter un moderateur pour deplacer ton topic dans: http://www.developpez.net/forums/forumdisplay.php?f=16

    plus dechance d'avoir une reponse. les fonctions de l'API windows sont commune a tous les langages (enfin, je crois, jamais utilisé ce truc).

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Pierre.g
    Bonsoir tout le monde,

    J'essai de faire un petit programme sous windows en console pour lire la valeur d'une clée dans le registre, mais il y a plusieurs choses que je ne comprend pas :

    Pour commencer, pour utiliser RegGetValue, faut-il avant utiliser RegOpenKey ? apparament d'après la doc crosoft pas forcement : "This handle is returned by the RegCreateKeyEx or RegOpenKeyEx function, or it can be one of the following predefined keys: HKEY_CLASSES_ROOT [...]".

    Voilà le bout de code que j'ai commencé à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        #define CLE "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer"
    
        HKEY cle;
        if (RegOpenKey(HKEY_CURRENT_USER, CLE, &cle) == ERROR_SUCCESS)
        {
            // clé ouverte, tentative de lecture
            printf("OK\n");
        }
        else {printf("RegOpenKey renvois une erreur\n");}
        
        RegCloseKey(cle);
    Donc le programme arrive à ouvrir la clé et renvois OK, mais ensuite ce que je ne comprend pas c'est que pour RegGetValue, il faut redéfinir le chemin vers la clée apparament ... je me suis dis : si il faut, il faut ... mais ça ne marche pas.
    J'ai essayé pas mal de truc, mais ça commence à m'énerver, alors j'ai tout effacé ... .

    Ce qui serais sympas, c'est que quelqu'un me complète ce petit bout de code pour qu'il lise par exemple la valeur de la clé NoDrives.
    Je remercie d'avance ce sauveur.

    Pierre.
    Bonsoir,

    Une bonne nouvelle : le forum a une fonction "Recherche".
    Parfois, cela permet de trouver des questions similaires qui ont obtenu une réponse.

    Concernant RegGetValue()...
    1) Ce n'est pas la plus portable des fonctions permettant de lire une valeur dans la base de registre :
    Citation Envoyé par Requirements
    Client - Requires Windows Vista or Windows XP Professional x64 Edition.
    Server - Requires Windows Server "Longhorn" or Windows Server 2003 SP1.
    2) Il n'est effectivement pas obligatoire d'utiliser RegOpenKey() avant.
    "ce que je ne comprend pas c'est que pour RegGetValue, il faut redéfinir le chemin vers la clée apparament" ==> Pas forcément. Cela dépend si tu as utilisé RegOpenKey() avant. Par contre, dans ton cas, il faudra très probablement lui donner le nom de la valeur (<-- à ne pas confondre avec une clé) à lire.

    Cordialement,
    DS.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    RegOpenKeyEx() (je rappelle que RegOpenKey tout court est deprecated) s'utilise avec RegQueryValueEx().

    RegGetValue() semble être un raccourci pour faire RegOpenKeyEx(), RegQueryValueEx() et RegCloseKey().

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Points : 91
    Points
    91
    Par défaut
    J'ai un peut avancé en regardant les autres posts, mais je n'arrive toujours pas à ce que je veut : ça me retourne bien une valeur, mais pas la bonne, ça devrais me retourner 128 ou son équivalent en hexa (je sais pas trop), mais ça me renvois par exemple 2292576.

    Voilà le code, aucune erreur à la compilation avec dev-c++, et aucun plantage à l'exécution du 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
    41
    42
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    
    int main(int argc, char *argv[])
    {
        #define CLE "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer"
    
        HKEY cle;
        if (RegOpenKeyEx(HKEY_CURRENT_USER, CLE, 0, KEY_ALL_ACCESS, &cle) == ERROR_SUCCESS)
        {
            // clé ouverte, tentative de lecture
            printf("OK\n");
            
            char valeur[1024];
            DWORD taille=1024;
            /* RegQueryValueEx(variable ouverte avec RegOpenKeyEx,
                               "nom de la valeur",
                               réservé : toujours NULL,
                               pointeur vers variable : type de donnée - NULL si pas besoin,
                               valeur,
                               &taille)
            */
            if (RegQueryValueEx(cle, "NoDrives", NULL, NULL, valeur, &taille) == ERROR_SUCCESS)
            {
                printf("Valeur : %ld\n", valeur);     
            }
            else
            {
                printf("RegQueryValueEx renvois une erreur : %i\n", GetLastError());
            }
        }
        else
        {
            printf("RegOpenKeyEx renvois une erreur : %i\n", GetLastError());
        }
        
        RegCloseKey(cle);
    
      system("PAUSE");     
      return 0;
    }

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    valeur est un tableau de caractères : ton printf affiche son adresse.

    Si tu veux afficher sous forme d'entier les sizeof(long) premiers octets de la chaîne, il faut faire ainsi:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Valeur : %ld\n", *(long*)&valeur);
    (en utilisant un reinterpret_cast à la place pour C++)

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Points : 91
    Points
    91
    Par défaut
    OK, merci pour ta réponse, ça marche, mais je suis ... complètement largué (je débute).

    Je viens de trouver une source ou le mec va chercher la valeur comme ça :
    RegQueryValueEx (hkey, "NoDrives", NULL, NULL, (LPBYTE)&dwKeyEn, &dwLen);
    et ensuite on peut afficher directement la valeur correcte.

    Je sort des cours Windows du site pour le cas ou tu connais, donc que me conseil tu comme cours pour approfondir (plus particulièrement pour le genre de trucs qu'on viens de voir au dessus).

    Merci.
    Pierre.

Discussions similaires

  1. Besoin d'aide pour avancer dans mon projet
    Par YASSINFO1988 dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 07/04/2014, 15h09
  2. Besoin d'aide pour lire un .pgm
    Par highdesign dans le forum C
    Réponses: 20
    Dernier message: 08/04/2012, 20h05
  3. Besoin d'aide pour lire un fichier Excel
    Par Sekigawa dans le forum C#
    Réponses: 7
    Dernier message: 04/03/2010, 13h46
  4. Besoin d'aide pour lire son avec SDL
    Par Spooky6900 dans le forum SDL
    Réponses: 1
    Dernier message: 28/02/2007, 18h12
  5. besoin d'aide pour intégrer une entité dans un MCD
    Par barkleyfr dans le forum Schéma
    Réponses: 17
    Dernier message: 13/10/2005, 13h29

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