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 :

Lire les datas dans le registre avec RegEnumValue();


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 8
    Points : 0
    Points
    0
    Par défaut Lire les datas dans le registre avec RegEnumValue();
    Bonjour,

    J'ai un petit soucis avec l'utilisation de la fonction:
    RegEnumValue();
    Je m'explique, je suis arrivé à récupérer les noms et maintenant je souhaiterai récupérer les valeurs données contenues dans une clef de registre, exemple
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
    Seul soucis c'est que je ne m'en sort pas ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RegEnumValue (RegTO,INCREMENTATION,Temp,&TMP,0,NULL,NULL,NULL);
    Je ne sais pas quoi mettre à la place de NULL NULL NULL et sur google je ne trouve des des éléments de réponses permettant de me débloquer ! ..
    La doc de microsoft me fait tourner en rond !
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx


    Si quelqu'un à des idées ou des éléments de réponse, je suis preneur !

    Merci A+

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ils sont tous optionnels: Tu peux les laisser à NULL si ça te chante! Ça veut simplement dire que la fonction n'y placera pas les informations correspondantes (ce sont des paramètres en sortie).

    En fait, ça dépend si tu veux le contenu de la valeur.
    Si tu ne le veux pas, c'est assez simple:
    Code C++ : 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
    //RegQueryInfoKey donne la taille maximale des buffers
    DWORD cValues, maxValueNameLen;
    LONG ret = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &cValues, &maxValueNameLen, NULL, NULL, NULL);
    if(ret != ERROR_SUCCESS)
    	return;
    TCHAR* valueNameBuf = new TCHAR[maxValueNameLen+1];
     
    for(DWORD i=0 ; i<cValues ; i++)
    {
    	DWORD cchValueName = maxValueNameLen+1;
    	ret = RegEnumValue(hKey, i, valueNameBuf, &cchValueName, NULL, NULL, NULL, NULL);
    	if(ret == ERROR_SUCCESS)
    	{
    		_tprintf(TEXT("Valeur: %s\n"), valueNameBuf);
    	}
    }
     
    delete[] valueNameBuf;
    Si tu le veux, tu dois présenter un buffer et une variable contenant sa taille:
    Code C++ : 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
    //RegQueryInfoKey donne la taille maximale des buffers
    DWORD cValues, maxValueNameLen, maxValueLen;
    LONG ret = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &cValues, &maxValueNameLen, &maxValueLen, NULL, NULL);
    if(ret != ERROR_SUCCESS)
    	return;
    TCHAR* valueNameBuf = new TCHAR[maxValueNameLen+1];
    BYTE* valueDataBuf = new BYTE[maxValueLen];
    TCHAR* stringValueDataBuf = new TCHAR[maxValueLen+1];
     
    for(DWORD i=0 ; i<cValues ; i++)
    {
    	DWORD cchValueName = maxValueNameLen+1;
    	DWORD cbData = maxValueLen;
    	DWORD type;
    	ret = RegEnumValue(hKey, i, valueNameBuf, &cchValueName, NULL, &type, valueDataBuf, &cbData);
    	if(ret == ERROR_SUCCESS)
    	{
    		_tprintf(TEXT("Valeur: %s\n"), valueNameBuf);
    		if(type==REG_SZ)
    		{
    			//Copie la valeur dans une chaîne, où on sera sûr d'avoir un caractère nul à la fin.
    			#ifdef _tcsncpy_s
    			_tcsncpy_s(stringValueDataBuf, maxValueLen+1, reinterpret_cast<LPTSTR>(valueDataBuf), _TRUNCATE);
    			#else
    			_tcsncpy(stringValueDataBuf, reinterpret_cast<LPTSTR>(valueDataBuf), maxValueLen);
    			stringValueDataBuf[maxValueLen] = TEXT('\0');
    			#endif
    			_tprintf(TEXT("\tDonnees: %s\n"), stringValueDataBuf);
    		}
    	}
    }
     
    delete[] stringValueDataBuf;
    delete[] valueDataBuf;
    delete[] valueNameBuf;
    PS: Je préviens, je n'ai même pas essayé de compiler. C'est juste l'idée générale.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 8
    Points : 0
    Points
    0
    Par défaut
    Salut salut,

    Merci de ton aide,

    Je n'arrive pas à faire fonctionner le deuxième code, surtout la partie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if(type==REG_SZ)
    		{
    			//Copie la valeur dans une chaîne, où on sera sûr d'avoir un caractère nul à la fin.
    			#ifdef _tcsncpy_s
    			_tcsncpy_s(stringValueDataBuf, maxValueLen+1, reinterpret_cast<LPTSTR>(valueDataBuf), _TRUNCATE);
    			#else
    			_tcsncpy(stringValueDataBuf, reinterpret_cast<LPTSTR>(valueDataBuf), maxValueLen);
    			stringValueDataBuf[maxValueLen] = TEXT('\0');
    			#endif
    			_tprintf(TEXT("\tDonnees: %s\n"), stringValueDataBuf);
    		}
    ..... Pourrais tu m'éclairer de tes lumières ? :-)
    A+

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ah pardon, il faut inclure <tchar.h>.
    C'est comme <string.h>, mais pour les TCHAR, LPTSTR etc. utilisés par Windows.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 8
    Points : 0
    Points
    0
    Par défaut
    Salut,

    Merci pour tes elements de réponse!

    Je ne m'en sort toujours pas pour récupérer les carractères ...
    le hKey, je ne sais quoi mettre..

    J'ai tout essayé:
    #define hKey HKEY_LOCAL_MACHINE
    #define hKey "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"

    #define hKey "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\Bdagent"

    Aurais tu une idée ?

    Bonne soirée,
    B.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    RegOpenKeyEx() est ton ami...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 8
    Points : 0
    Points
    0
    Par défaut
    Salut,
    Désolé mais cela ne m'as pas trop avancé ..

    j'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define hKey "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\Bdagent"
    Pour le RegQueryInfoKey il faut un seul paramètre que j'ai saisi dans #define plus haut (mais qui ne marche pas)


    Pour le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RegOpenKeyEx(RUCHE,ADRESSE, .... BLA BLA LE RESTE);
    Il faut les deux infos séparées je ne comprends pas très bien ..

    Merci A+

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    HKEY hKey=NULL;
    DWORD err = RegOpenKeyEx(HKEY_LOCAL_MACHINE /*sans guillemets*/, TEXT("SOFTWARE\\Windows\\CurrentVersion\\Run"), 0, KEY_READ, &hKey);
     
    if(err == ERROR_SUCCESS)
    {
    	//RegQueryInfoKey, RegQueryValue, etc.
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 8
    Points : 0
    Points
    0
    Par défaut
    Merci !


    Dernière question, sais tu comment je peux remplacer les #define ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define RUCHE HKEY_LOCAL_MACHINE
    #define ADRESSE "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"
    Avec un pointeur en char, cela ne fonctionne pas!

    UN GRAND MERCI!!

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    J'ai déjà répondu à cette question: les fonctions Windows utilisent des TCHAR.
    Une chaîne littérale de TCHAR se fait avec la macro TEXT().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 8
    Points : 0
    Points
    0
    Par défaut
    Oui enfin, cela serait sympa d'être plus explicite !

    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TCHAR *RUCHE = wchar_t("HKEY_LOCAL_MACHINE");
    TCHAR *RUCHE = TEXT("HKEY_LOCAL_MACHINE");
    Mais je n'arrive à rien qui fonctionne!

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ce que tu appelles ici une "ruche" n'est pas censé être une chaîne. C'est une constante prédéfinie (en fait, un HKEY de valeur négative).

    Ceci est censé marcher:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define RUCHE HKEY_LOCAL_MACHINE
    #define ADRESSE TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run")
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 8
    Points : 0
    Points
    0
    Par défaut
    Merci, j'ai oublié de préciser le but de remplacer les #define par une variable est de pouvoir modifier son contenu (ainsi aller lire plusieurs adresses dans le registre via une fonction que je rappelle plusieurs fois dans le main!
    Est ce que cela est possible avec text()?

    Merci

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Code C/C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void MaFonction(const TCHAR *str);
     
    int main(void)
    {
    	MaFonction(TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"));
    	MaFonction(TEXT("SOFTWARE\\Baastou\\MonProgramme\\MaConfig"));
    }
    Etc.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 8
    Points : 0
    Points
    0
    Par défaut
    Hello,
    Merci beaucoup pour ton aide ! Topic résolu

    A+

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

Discussions similaires

  1. alterner les couleurs dans un tableau avec xsl
    Par Eithelgul dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 03/05/2015, 23h29
  2. [11g] Insérer les données dans une table avec le data control
    Par tchuidjan dans le forum Débuter
    Réponses: 5
    Dernier message: 30/04/2014, 15h41
  3. Lire les lignes d'un fichier avec csh
    Par nicolas581 dans le forum Linux
    Réponses: 4
    Dernier message: 24/03/2010, 16h38
  4. lire les indexes dans une stringGrid
    Par zidenne dans le forum Composants VCL
    Réponses: 1
    Dernier message: 01/12/2005, 15h15
  5. Lire une valeur dans le registre
    Par John.s dans le forum C
    Réponses: 2
    Dernier message: 26/11/2003, 19h55

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