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 :

char to byte?


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 21
    Points : 13
    Points
    13
    Par défaut char to byte?
    salut,
    Je voulais modifier les registre pour lancer une appli au démarrage mais je dois convertir un char*(le chemin de l'executable) en BYTE* (type reçu par RegSetValueEx)
    J'ai vu qu'un char est codé sur un byte alors je me disais que ça serait fait facile mais j'y arrive pas lors de mon allocation dynamique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int lenth = strlen(exePath)+1;
    BYTE *value = (BYTE*) malloc(sizeof(BYTE) * lenth);
    for(i=0; i<=lenth;i++)
         value[i]=exePath[i];
    Des fois ça marche...Mais pas tout le temps! ><
    je comprend pas pourquoi, alors que j'ai aucune erreur de compilation.
    Quelqu'un voit pourquoi ? Merci!

  2. #2
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Sur windows, ce ne sont pas des char sur un byte !
    Mais des wide char (wchar) en Unicode.

    Le mieux est d'utiliser le _TCHAR avec les fonction _tprintf, etc...

    Enfin, compiles-tu sur MinGW32 ou sur Visual Studio ?
    Es-tu bien sur windows aussi ?
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Yep, je suis sur windows & MinGW32.
    par contre j'ai un size of char qui me retourne bien 1.
    D'ailleurs pourquoi il y aurait de l'unicode à la place de l'ascii?

  4. #4
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    sizeof char retourne toujours 1, par définition.
    ɹǝsn *sıɹɐlos*

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par Metalman Voir le message
    Sur windows, ce ne sont pas des char sur un byte !
    J'ai vérifié, puisque metalman disais que non, peut etre qu'un simple size of ne permet pas de mettre en évidence ce qu'il voulais dire.

    Au cas où, je poste la totalité de 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
     
    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
     
    void launcher(const char *valueName, const char *exePath)
    {
        HKEY keyReturned;
        int i;
        int lenth = strlen(exePath)+1;
        BYTE *value;
        value = (BYTE*)malloc(sizeof(BYTE) * lenth);
        for(i=0; i<lenth;i++)
            value[i]=exePath[i];
        RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &keyReturned,NULL);
        RegSetValueEx(keyReturned, valueName, 0, REG_SZ, value, lenth);
        RegCloseKey(keyReturned);
        free(value);
        return;
    }
    int main (){
        launcher("prog_name2","C:\\Program Files(x86)\\WinRAR\\WinRAR.exe");
        return 0;
    }
    j'y ai viré toute les verif des retours

  6. #6
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 564
    Points
    1 564
    Par défaut
    Hello,

    Proposition non testée et qui peut paraitre idiote, mais as-tu essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RegSetValueEx(keyReturned, valueName, 0, REG_SZ, (BYTE *)exePath, lenth);
    Il m'est arrivé d'avoir une fonction de l'api windows qui ne faisait pas bien son boulot, rien que parce que le paramètre passé (même NULL !) n'était pas du bon type...
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  7. #7
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Attention attention ! x)

    Je parlais de wchar pour la partie "pure" et native Windows !
    Windows utilise de l'unicode par défaut maintenant pour tout ce qui est compilé avec Visual Studio, mais il est possible de compiler de l'ASCII malgré tout (à préciser à la compilation), mais il est conseillé dans tous les cas sur les proijets VS d'utiliser les macro _T pour tout ce qui est fonction str*/print*/typages char.

    MinGW32 étant fait pour amener un petit peu d'unixeries dessus, celui-ci utilise l'ASCII classique en char.

    Le code de gromekkool ressemble beaucoup à un projet natif Windows de par le tas de macros, les types en majuscules, etc...


    Bref, travailler avec le registre via MinGW32, je ne sais pas si c'est possible.
    Je l'aurais plutôt fait avec VS, des tutos, et la doc MSDN.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 21
    Points : 13
    Points
    13
    Par défaut
    désolé pour la confusion Métalman... (J'ai rien compris de tout ce tu viens de dire, j'ai quelques recherches google à faire on dirait! )

    Je me suis aidé de d'un tutoriel C, à la base c'était juste pour essayer, mais vu que pour eux ça marche je me pose des questions...

    Pour la conversion (BYTE*) j'ai essayé mais c'est refusé par mon compilateur, c'est pourquoi j'ai du faire un for au dessus :/

    edit: d'ailleurs c'est le bon type que je fourni, la conversion au dessus fait que value est un BYTE * nan ?

  9. #9
    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
    En gros, il y a ici deux problèmes distincts:
    • RegSetValueEx() exige BYTE* alors que void* serait plus approprié
    • RegSetValueEx(REG_SZ) ne manipule pas des char, mais des TCHAR.

    Pour le premier problème, normalement un cast suffit.
    Pour le second problème, tu as deux solutions:
    • La façon recommandée est de travailler en TCHAR (ou _TCHAR) sur toute la ligne, depuis la saisie du exePath jusqu'à l'appel à RegSetValueEx().
    • La "solution de facilité" temporaire et provisoire est de forcer l'utilisation de la version char de RegSetValueEx(), appelée RegSetValueExA().
    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.

Discussions similaires

  1. conversion de char* en BYTE[]
    Par koukou11 dans le forum VC++ .NET
    Réponses: 4
    Dernier message: 12/03/2011, 14h52
  2. char* to byte VC++
    Par koukou11 dans le forum Développement
    Réponses: 3
    Dernier message: 10/03/2011, 12h52
  3. Réponses: 16
    Dernier message: 29/10/2008, 14h33
  4. Conversion de char[] en byte[]
    Par Razgriz dans le forum Langage
    Réponses: 12
    Dernier message: 12/09/2007, 11h36
  5. char ou BYTE
    Par devconf77 dans le forum Windows
    Réponses: 1
    Dernier message: 07/08/2007, 16h47

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