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 :

RegOpenKeyEx & RegQueryValueEx


Sujet :

C++

  1. #1
    Membre confirmé Avatar de apoingsfermes
    Profil pro
    Inscrit en
    Février 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 54
    Par défaut RegOpenKeyEx & RegQueryValueEx
    Bonjour,

    Après bien des déboires, j'ai une fonction qui me renvoie une valeur de la base de registre dans un std::string.

    Mais bizarement, le résultat est une chaine avec un espace inséré entre chaque caractère. Ca ressemble à un problème d'encoding, mais je ne vois vraiment pas où ça foire. Voici la fonction:

    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
     
    string getRegistryValue(LPCTSTR path) {
     
    	        string result = "";
    		HKEY key;
     
    		unsigned char tempStr[512];
    		unsigned long taille = sizeof(tempStr);
    		unsigned long type;
     
    		long res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\MyCompany\\MyProduct\\"), 0, KEY_READ, &key);
    		if (res != ERROR_SUCCESS) {
    			cout << "Erreur " << endl;
    			return "";
    		}
    		if (RegQueryValueEx(key, path, 0, &type, (BYTE*)&tempStr[0], &taille) != ERROR_SUCCESS) {
    			cout << "Erreur " << endl;
    			RegCloseKey(key);
    			return "";
    		}
     
    		tempStr[taille] = 0;
     
    		result.assign(tempStr, tempStr + taille);
     
    		RegCloseKey(key);
     
     
    	        return result;
    }

    Et je l'appelle comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string val = getRegistryValue(_T("myValue"));
    cout << "value = " << val;
    Si la valeur dans la base de type REG_SZ, est "abc123", ça retourne "a b c 1 2 3 ".

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Si tu compile en Unicode, les fonctions de l'API Win32 telle que RegQueryValueEx prennent et renvoient des chaines Unicode (wchar_t*), qu'il faut donc mettre dans une std::wstring.

  3. #3
    Membre confirmé Avatar de apoingsfermes
    Profil pro
    Inscrit en
    Février 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 54
    Par défaut
    Ha oui, ça marche si je compile en Multi-byte.

    Merci beaucoup !

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    C'est pourquoi il faut utiliser une std::basic_string< TCHAR >, ou bien utiliser RegQueryValueExA().
    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.

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

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