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 :

erreur édition base de registre


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Developpeur C
    Inscrit en
    Octobre 2009
    Messages
    48
    Détails du profil
    Informations professionnelles :
    Activité : Developpeur C

    Informations forums :
    Inscription : Octobre 2009
    Messages : 48
    Par défaut erreur édition base de registre
    Salut à tous !
    Je suis en train de suivre un tuto sur la manipulation de la base de registre mais il semble y avoir une erreur dans le code :s en effet, je parviens à créer une clef mais pas avec un bon ID ni avec une bonne valeur ! il me remplis l'ID et la valeur de la clef par des carrés...

    Voici mon 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
    23
    24
    25
    26
    27
    28
    29
     
    #include <Windows.h>
     
    void addToStartup(const char *path, const char *name, int state);
     
    int main(int argc, char *argv[]) {
     
    	FreeConsole();
    	MessageBox(NULL, TEXT("test"), TEXT("titre"), MB_OK);
    	addToStartup("C:\\Documents and Settings\\vador\\Bureau", "test.exe", 1);
     
    	return 0;
    }
     
    void addToStartup(const char *path, const char *name, int state) {
     
    	HKEY key;
     
    	RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, KEY_ALL_ACCESS, &key);
    	if(state) {
    		RegSetValueEx(key, name, 0, REG_SZ, (BYTE*)path, strlen(path)+1);
    	} else {
    		RegDeleteValue(key, name);
    	}
    	RegCloseKey(key);
     
    	return;
     
    }
    Une idée ?

  2. #2
    Expert confirmé
    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 : 39
    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
    Par défaut
    Remplace tous tes char par des TCHAR (sauf dans les paramètres de la fonction main) et applique tous les changements que cela impose (*) et ça ira mieux.

    (*) Autrement dit, remplace aussi addToStartup("C:\\Documents and Settings\\vador\\Bureau", "test.exe", 1); par addToStartup(TEXT("C:\\Documents and Settings\\vador\\Bureau"), TEXT("test.exe"), 1);

  3. #3
    Membre confirmé
    Developpeur C
    Inscrit en
    Octobre 2009
    Messages
    48
    Détails du profil
    Informations professionnelles :
    Activité : Developpeur C

    Informations forums :
    Inscription : Octobre 2009
    Messages : 48
    Par défaut
    merci pour ta réponse ça marche !
    J'ai cependant un autre problème... strlen(path)+1 à la ligne 21 ne semble pas fonctionner correctement ! en effet la valeur de la clef n'est pas complète (le chemin n'est pas écrit en entier... je ne comprend pas, j'ai fait un test et strlen me renvoie quelque chose de cohérent du genre 38 je crois. Pourtant le chemin n'est pas écrit en entier, il est coupé après le S de Setting :s j'ai essayé de mettre une valeur moi même, même une valeur plus grande (42 : taille en comptant tous les \ et espaces) et à ce moment là c'est coupé au niveau du second t de Setting (Sett...)

    Une idée ? :s

  4. #4
    Membre confirmé
    Developpeur C
    Inscrit en
    Octobre 2009
    Messages
    48
    Détails du profil
    Informations professionnelles :
    Activité : Developpeur C

    Informations forums :
    Inscription : Octobre 2009
    Messages : 48
    Par défaut
    Problème réglé ! J'ai remplacer le strlen(path)+1 par 255... j'espère qu'il n'y aura pas de mauvaises conséquences mais au moins ça marche !

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 513
    Par défaut
    Citation Envoyé par guidono Voir le message
    Problème réglé ! J'ai remplacer le strlen(path)+1 par 255... j'espère qu'il n'y aura pas de mauvaises conséquences mais au moins ça marche !
    Tu t'exposes à des ennuis qui devraient surgir assez vite.

    TEXT sert à convertir ta chaîne en Unicode lorsque c'est justifié, et les caractères Unicode sont codés sur 16 bits. strlen(), elle, est une fonction standard C qui est faite pour lire des caractères ordinaires sur un seul byte et donc (quasiment toujours) sur un seul octet.

    La césure après le S de Settings correspond à vue de nez au milieu de la chaîne, ce qui est cohérent. Mais il arrive également que, sur seize bits, l'un des deux octets qui codent le caractère soit nul, sans pour autant que le caractère entier le soit. Néanmoins, ça suffit à mettre strlen() en échec, qui interprète cet octet nul isolé comme une fin de chaîne.

    Il faut utiliser _tcslen pour obtenir la longueur d'une chaîne quelque soit le contexte.

    Enfin, la fonction RegSetValueEx() prend en paramètre la taille de ta donnée en octets (laquelle n'est pas forcément une chaîne). Les fonctions xxxlen() te donnent la longueur d'une chaîne en nombre de caractères. Il faut donc d'une part ajouter le terminateur final avec « +1 » puis multiplier le tout par la taille d'un caractère (ASCII ou Unicode en fonction du contexte) soit sizeof(TCHAR).

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/06/2008, 11h02
  2. probleme acces a projet/references -> erreur acces base registre
    Par pierre2410 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 04/05/2007, 11h56
  3. Réponses: 6
    Dernier message: 07/02/2007, 05h26
  4. [VB] (débutant) erreur accès base de registre
    Par bandit boy dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/02/2006, 14h15
  5. []Erreur d'accès à la Base de registres
    Par oulai_evado dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 27/12/2005, 14h59

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