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 :

convertir un TCHAR* en char *


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut convertir un TCHAR* en char *
    Bonjour

    J'ai un souci de conversion d'un TCHAR * vers un char *
    J'ai un peu abandonné C++ au profit de C# depuis quelques années et je me perds un peu dans certaines conversions de type

    Mon application doit utiliser un des agument passé a l'appel de l'exe
    Ces arguments sont des TCHAR *

    Mais la fonction WriteFile (qui écrit sur mon port com) attends un char *

    J'avais cru qu'un simple cast suffirait, mais je réalise que comme le TCHAR * est vraissemblablement un tableau de WORD, le byte de poids fort de mon primer WORD est interpreté comme le null terminator du string

    Résultat mon cast me rends seulement le premier caractére du TCHAR *
    Comment puis-je résoudre cela en C ?
    Existe-il des fonction de conversion ou bien faut il le faire a la main dans une boucle de parcours du TCHAR * ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int _tmain(int argc, _TCHAR* argv[])
    {
      LPCTSTR portname = L"COM5:";
      int len=0;
      DWORD result=0;
      char *buffer;
      DWORD dw;
      buffer=(char *)argv[1];
      len=strlen(buffer);
      WriteFile(hComm, buffer, len, &result, NULL);

    Merci de votre aide

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    hello,

    writefile écrit des bytes, pas des caractères, peu importe que ce soit des char ou wchar (TCHAR est le typedef de l'un ou l'autre selon le contexte). Cette fonction attend donc un void*, pas un char*.

    le pb doit être du côté de strlen, je pense, qui elle attend un char*. Il faut la remplacer par la fonction spécifique au wchar (wcslen, il me semble).
    Ensuite dans le paramètre 3 de writefile, le nombre de bytes à écrire, tu multiplies la longueur obtenue par la taille de WCHAR.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int _tmain(int argc, _TCHAR* argv[])
    {
      LPCTSTR portname = L"COM5:";
      int len=0;
      DWORD result=0;
      TCHAR *buffer;
      DWORD dw;
      buffer=argv[1];
      len=wcslen(buffer);
      WriteFile(hComm, buffer, len*sizeof(TCHAR), &result, NULL);
    }

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci stendhal666

    Mais le problème n'est pas lié a la longueur
    bien que si on n'est pas prévenu c'est aussi facile de tomber dans le panneau de

    Qui rends une longueur virtuelle qui ne correspond pas a la réalité physique

    Le problème c'est que je dois VRAIMENT envoyer des char, mon CreateFile ouvre le port com et ce ne sont pas des _TCHAR qui sont attendus

    Comme ca commençait a m'énerver toutes ces histoires de conversions brumeuses et mal documentées, j'ai fini par écrire une petite methode qui fait le travail

    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
    char *ConvertToCharPtr(_TCHAR* tc)
    {
      int ltc=_tcslen(tc);
      char *buf=(char *)calloc(ltc+2,1);
      char *p;
      char c;
      p=buf;
      int i=0;
      for (i=0;i<ltc;i++)
      {
        c=(char)tc[i];
        *p=c;
        p++;
     
      }
      return buf;
    }
    Mais quand on a fait du cSharp pendant des années le traitement de ces nouveaux Types en C++ est vraiment déroutante
    A la limite je préfere encore le bon vieux C ou meme l'assembleur, au moins on sait a quoi s'attendre et on ne doit pas chipoter avec une couche de pseudo abstaction hétéroclite !

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Citation Envoyé par olibara Voir le message
    Qui rends une longueur virtuelle qui ne correspond pas a la réalité physique
    Cela peut être normal. Et d'ailleurs il ne faut jamais faire de prédiction de taille avec les chaînes de caractères

    Avec de l'unicode, un caractère peut être codé sur plusieurs octets
    Même avec certains code page étendu (sur 2 octets)


    Citation Envoyé par olibara Voir le message
    Le problème c'est que je dois VRAIMENT envoyer des char, mon CreateFile ouvre le port com et ce ne sont pas des _TCHAR qui sont attendus
    Dans un autre sens tu envoies des 0 et des 1

    Citation Envoyé par olibara Voir le message
    Comme ca commençait a m'énerver toutes ces histoires de conversions brumeuses et mal documentées, j'ai fini par écrire une petite methode qui fait le travail
    La MSDN de Microsoft donne également les fonctions de conversions entre les TCHAR, WCHAR, LPSTR, LPWSTR, LPCTSTR ...

    Comment : effectuer une conversion entre différents types de chaînes


    Citation Envoyé par olibara Voir le message
    Mais quand on a fait du c Sharp pendant des années le traitement de ces nouveaux Types en C++ est vraiment déroutante
    Détrompe toi TCHAR, WCHAR, LPSTR, LPWSTR,LPCTSTR.... ce sont des types spécifiques Windows créés par Microsoft qui date de 1995.

    En C on a seulement les char et les wchar

    Édit: Le problème ici c'est que ton TCHAR* peut contenir de l'unicode et ne pas avoir de conversion vers de l'ASCII ( ton char*)

  5. #5
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Cela peut être normal. Et d'ailleurs il ne faut jamais faire de prédiction de taille avec les chaînes de caractères

    Avec de l'unicode, un caractère peut être codé sur plusieurs octets
    Même avec certains code page étendu (sur 2 octets)
    Raison de plus pour disposer d'une fonction qui peut donner la taille physique réelle de la chaine

    Dans un autre sens tu envoies des 0 et des 1
    Non ! je dois envoyer un traditionnel str composé d'un tableau de char null terminated
    Oui ! un char c'est une combinaison de 8 bit a 0 ou 1


    La MSDN de Microsoft donne également les fonctions de conversions entre les TCHAR, WCHAR, LPSTR, LPWSTR, LPCTSTR ...
    J'ai passé plus de temps a chercher cela sans succès que d'écrire moi même une méthode
    Mais si la méthode existe je suis toujours preneur pour la connaitre

    Merci pour ton aide

  6. #6
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    En théorie c'est la fonction wcstombs

    Mais
    1. Elle est dépréciée au profit de la méthode wcstombs_s. C'est la méthode sécurisée (le petit s à la fin)
    2. Si ton TCHAR n'est pas Unicode cette méthode n'est pas la bonne, et un cast ou une recopie suffit. Son nom l'indique Wide Char String To Multi-Byte String (Unicode vers code page)



    Mais je pensais à un truc puisque c'est l’Unicode qui pose problème, pourquoi ne pas le supprimer et tout passer en ASCII si cela est possible.
    Style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main(int argc, char** argv)
    {
    // ....
     
        return 0;
    }

Discussions similaires

  1. [D7] Convertir un integer en char
    Par raoulmania dans le forum Langage
    Réponses: 11
    Dernier message: 17/08/2008, 11h30
  2. [convertir TCHAR* en char*]
    Par youp_db dans le forum Windows
    Réponses: 2
    Dernier message: 07/03/2008, 16h46
  3. Réponses: 1
    Dernier message: 13/10/2005, 15h10
  4. Convertir un TStrings en char
    Par syphicoque dans le forum C++Builder
    Réponses: 11
    Dernier message: 04/04/2004, 22h59
  5. Réponses: 3
    Dernier message: 02/07/2003, 16h24

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