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

Langage C++ Discussion :

comment lire,et ecrire dans la base de registre


Sujet :

Langage C++

  1. #1
    Membre régulier

    Inscrit en
    Février 2009
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 106
    Points : 71
    Points
    71
    Billets dans le blog
    1
    Par défaut comment lire,et ecrire dans la base de registre
    bonjour tout le monde
    bon je suit debutant en c++, et j'aimerai créer une application qui peux lire et ecrire, modifier la base de registre.
    j'ai bon chercher un article ou un tutoriel sur le net mais j'ai rien trouvé
    si quelqu'un a un bout de code avec des explications, ca va trop m'aider svp.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Quelques éléments de réponse dans la F.A.Q. : Comment accéder à la base des registres ?

  3. #3
    Membre régulier

    Inscrit en
    Février 2009
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 106
    Points : 71
    Points
    71
    Billets dans le blog
    1
    Par défaut message d'erreur C2664 ?!!
    bonsoir.
    merci pour le lien, et on essayons j'ai eu pas mal de messages d'erreur que je comprend pas leurs provenances :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Error	1	error C2664: 'RegCreateKeyExW' : cannot convert parameter 2 from 'const char [20]' to 'LPCWSTR'	f:\tmp\test\test1\test1\test1.cpp	22	test1
    avec mon code personnalisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	HKEY reg_key;
    	char s[100] = "test123";
     
    	RegCreateKeyEx( HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, NULL, 0, KEY_ALL_ACCESS, NULL,
                        &reg_key, NULL );
     
    	RegSetValueEx(reg_key, "index", 0, REG_SZ, (LPBYTE)s, (DWORD)strlen(s));
     
    	RegCloseKey(reg_key);
     
    	getche();
    et j'ai du tapé le méme code méme, toujours la méme chose :
    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
     
    #include "stdafx.h"
    #include "iostream"
    #include "conio.h"
    #include <windows.h>
     
    using namespace std;
     
    int _tmain(int argc, _TCHAR* argv[])
    {
        HKEY Developpez;
        char s[100] = "http://www.developpez.com/";
     
        RegCreateKeyEx( HKEY_CURRENT_USER, "Software\\Developpez", 0, NULL, 0, KEY_ALL_ACCESS, NULL,
                        &Developpez, NULL );
     
        RegSetValueEx(Developpez, "index", 0, REG_SZ, (LPBYTE)s, (DWORD)strlen(s));
     
        RegCloseKey(Developpez);
     
        return 0;
    }
    j'ai aussi changé le type char en string suite a se que j'ai déduit j'ai d'autre méssages d'erreurs encore pire "Error 1 error C2075: 's' : array initialization needs curly braces f:\tmp\test\test1\test1\test1.cpp 14 test1"

    donc si quelqu'un peux m'éclaircir un peut svp

    j'utilise Visual Studio .NET 2008 C++

  4. #4
    Expert éminent
    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 : 38
    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
    Points : 8 389
    Points
    8 389
    Par défaut
    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
    #include "stdafx.h"
    #include "iostream"
    #include "conio.h"
    #include <windows.h>
     
    using namespace std;
     
    int _tmain(int argc, _TCHAR* argv[])
    {
        HKEY Developpez;
        TCHAR s[100] = TEXT("http://www.developpez.com/");
     
        RegCreateKeyEx( HKEY_CURRENT_USER, TEXT("Software\\Developpez"), 0, NULL, 0, KEY_ALL_ACCESS, NULL,
                        &Developpez, NULL );
     
        RegSetValueEx(Developpez, TEXT("index"), 0, REG_SZ, (LPBYTE)s, (DWORD)(sizeof(s) - sizeof(s[0])));
     
        RegCloseKey(Developpez);
     
        return 0;
    }
    L'exemple de la FAQ n'est pas erroné mais suppose que le lecteur a déjà des notions de programmation Windows et qu'il saura quoi en faire du code proposé ...

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Les fonctions win32 prenant un argument chaîne de caractère ne sont souvent qu'un define sur une version UNICODE (terminé par W) ou ANSI (terminé par A)
    Par exemple, RegCreateKeyEx est en fait défini comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #ifdef UNICODE
    // version UNICODE
    #define RegCreateKeyEx  RegCreateKeyExW
    #else
    // version ANSI
    #define RegCreateKeyEx  RegCreateKeyExA
    #endif // !UNICODE
    Dès que tu as une erreur qui resssemble à :
    'xxxxxxxW' : cannot convert parameter 2 from 'cccc' to 'wwww'
    ou
    'xxxxxxxA' : cannot convert parameter 2 from 'wwww' to 'cccc'
    une petite lumière doit s'allumer : problème UNICODE/ANSI.


    En UNICODE les chaînes de caractères attendues sont de type wchar_t const *. En ANSI, les chaînes attendues sont de type char const *. char et wchar_t sont 2 types différents.
    Par défaut, une chaîne de caractère écrite comme ça "blabla" est considéré comme ANSI. Pour écrire une chaîne UNICODE il faut préfixé la chaîne de L : L"Unicode". Microsoft propose une macro TEXT qui produit soit une chaine UNICODE soit une chaine ANSI selon les options de ton projet. Il faut donc utiliser TEXT("blabla") là où tu as des chaînes en dur pour le pas te poser de question.
    De la même façon, TCHAR est un define soit vers char, soit vers wchar_t. Il faut l'utiliser pour tes tableaux de chaînes de caractère.
    Si on regroupe tout ces éléments, on peut effectivement écrire une version du code de la F.A.Q. qui compile aussi bien pour l'unicode que l'ansi :

    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
    #include <windows.h>
     
    int main()
    {
        /* Ce programme écrit dans HKEY_CURRENT_USER, Software\Developpez.              */
     
        HKEY Developpez;                            /* La clé que nous allons ouvrir    */
        TCHAR s[] = TEXT("http://www.developpez.com/"); /* La valeur que nous allons écrire */
     
        /* On crée un handle vers la clé Developpez.                                    */
        /* Si la clé n'exsite pas encore, elle sera créée.                              */
     
        RegCreateKeyEx( HKEY_CURRENT_USER, TEXT("Software\\Developpez"), 0, NULL, 0, KEY_ALL_ACCESS, NULL,
                        &Developpez, NULL );
     
        /* On écrit le contenu de s dans une valeur chaîne (REG_SZ) nommée index.       */
        /* On n'écrit pas le caractère '\0'.                                            */
     
        RegSetValueEx(Developpez, TEXT("index"), 0, REG_SZ, (LPBYTE)s, (DWORD)sizeof(s)/sizeof(s[0]));
     
        /* On ferme le handle.                                                          */
     
        RegCloseKey(Developpez);
     
        return 0;
    }

  6. #6
    Membre régulier

    Inscrit en
    Février 2009
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 106
    Points : 71
    Points
    71
    Billets dans le blog
    1
    Par défaut merci, mais il reste un point de détaille
    bonsoir,
    bon je vous remercie pour l'explication, et le le code ca marche, c'est juste qu'il y a un un petit soucie, c'est que la valeur enregistré sur la clé ne dépasse pas 16 caractères alors que la valeurs que j'ai inséré et plus long

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    HKEY Developpez;
    	TCHAR s[] = TEXT("c:\\WINDOWS\\system32\\debug.exe");
     
        RegCreateKeyEx( HKEY_CURRENT_USER, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, NULL, 0, KEY_ALL_ACCESS, NULL,
                        &Developpez, NULL );
     
        RegSetValueEx(Developpez, TEXT("debug"), 0, REG_SZ, (LPBYTE)s, (DWORD)sizeof(s)/sizeof(s[0]));
        RegCloseKey(Developpez);
     
    	getche();
        return 0;
    sur la base de registre j'ai plutôt cette valeur :
    c:\WINDOWS\syst

    quand je change un paramètre, j'ai automatiquement une erreur

  7. #7
    Expert éminent
    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 : 38
    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
    Points : 8 389
    Points
    8 389
    Par défaut
    C'est en effet, en première approximation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RegSetValueEx(Developpez, TEXT("debug"), 0, REG_SZ, (LPBYTE)s, (DWORD)sizeof(s));
    Puisque le paramètre attendu est le nombre d'octets qu'on veut écrire à partir de l'adresse pointée par s. Ensuite, puisque l'écriture du 0 terminateur des chaînes C n'est pas obligatoire, mieux vaut mettre (DWORD)( sizeof(s) - sizeof(s[0]) ). J'ai également modifié mon code pour prendre en compte cette remarque.

  8. #8
    Membre régulier

    Inscrit en
    Février 2009
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 106
    Points : 71
    Points
    71
    Billets dans le blog
    1
    Par défaut résolu
    bonsoir.
    bon je vous remercie pour votre aide, le code marche tres bien, merci a tous

  9. #9
    Membre régulier

    Inscrit en
    Février 2009
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 106
    Points : 71
    Points
    71
    Billets dans le blog
    1
    Par défaut un autre détail ^^
    bonjour.
    bon j'ai un autre soucie, c'est que j'aimerai créer une valeur DWORD a la place de CHAINE comme le code si dessus le pérmet.
    j'ai bon modifié les paramètres, j'obtiens toujours une erreur "comme d'hab ".

  10. #10
    Expert éminent
    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 : 38
    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
    Points : 8 389
    Points
    8 389
    Par défaut
    RegSetValueEx(Developpez, TEXT("NewValue"), 0, REG_DWORD, (LPBYTE)&dwValue, (DWORD)sizeof(dwValue));
    [MSDN] Registry Functions

  11. #11
    Membre régulier

    Inscrit en
    Février 2009
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 106
    Points : 71
    Points
    71
    Billets dans le blog
    1
    Par défaut réglé
    merci beaucoup, c'est bon, ca marche a merveille

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

Discussions similaires

  1. Lire et ecrire dans une base de registre
    Par sakli dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 22/10/2008, 12h03
  2. Réponses: 3
    Dernier message: 02/10/2006, 22h20
  3. Comment écrire dans la base de registre
    Par rivis dans le forum MFC
    Réponses: 7
    Dernier message: 10/05/2006, 18h14
  4. Réponses: 16
    Dernier message: 22/03/2005, 22h57

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