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++/CLI Discussion :

[C# > C++] Comment convertir un sting^ vers un char* ?


Sujet :

C++/CLI

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2002
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 165
    Points : 193
    Points
    193
    Par défaut [C# > C++] Comment convertir un sting^ vers un char* ?
    Bonjour,

    je n'arrive pas à convertir un string^ vers une valeur de type char* :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String^ sPage = gcnew String("bonjour");
    IntPtr p=System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(sPage);
    char *chaineChar = reinterpret_cast<char*>(static_cast<void *>(p));
    System::Runtime::InteropServices::Marshal::FreeHGlobal(p);
    le prob dans ce code source c'est que chaineChar ne contient pas "bonjour" mais "true" quand je l'affiche ??

    pourtant j'ai suivi la FAQ C++/CLI qui donne la méthode pour convertir un string^ vers du char*, où est l'erreur dans mon code source ?

    http://dotnet.developpez.com/faq/cpp...n#stringtochar

    désolé je débute aussi dans l'univers du C++/CLI

    merci par avance

  2. #2
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par Elbarto
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    String^ sPage = gcnew String("bonjour");
    IntPtr p = System::Runtime::InteropServices::Marshal::
    StringToHGlobalAnsi(sPage);
    char *chaineChar = reinterpret_cast<char*>(static_cast<void *>(p));
    System::Runtime::InteropServices::Marshal::FreeHGlobal(p);
    ...
    Citation Envoyé par nico-pyright(c)
    ...
    LPCSTR chaineChar = reinterpret_cast<LPCSTR>(static_cast<void *>(p));
    ...

  3. #3
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2002
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 165
    Points : 193
    Points
    193
    Par défaut
    Je viens de corriger mais ça ne change rien, chaineChar contient toujours "true"

    je précise que j'utilise Visual C++ 2005 express

  4. #4
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    oui et ceci aussi est à changer c'est vrai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String^ sPage = "bonjour";

  5. #5
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2002
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 165
    Points : 193
    Points
    193
    Par défaut
    ça ne fonctionne toujours pas, je n'arrive pas à retrouver la chaine "bonjour" même en faisant le remplacement par :

    String^ sPage = "bonjour";

    par contre en utilisant la classe crée par cet auteur là ça fonctionne:

    http://www.voidnish.com/articles/Sho...tringConvertor

    peut-être que l'exemple de la FAQ C++/CLI contient une erreur ?

  6. #6
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    salut, la réponse est simple, il faut utiliser la chaine avant sa libération (libération qui est faite avec FreeHGlobal)
    donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    String ^chaineManagee = "Chaine Managée";
    IntPtr p=System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi
    (chaineManagee);
    LPCSTR chaineChar = reinterpret_cast<LPCSTR>(static_cast<void *>(p));
     
    printf("%s", chaineChar); // utilisation de la chaine 
    // libération à la fin (comme le delete du c++)
    System::Runtime::InteropServices::Marshal::FreeHGlobal(p);
    je me rends compte que ce n'est pas clair dans la faq c++/cli, cela sera intégré dans la prochaine version

    Pour me faire pardonner, tu auras le droit en avant première à une deuxième méthode de conversion, qui parraitra aussi dans la prochaine version de la faq

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include <vcclr.h>
     
    String ^chaineManagee = gcnew String("une chaine Managée");
    char * chaineChar;
    pin_ptr<const wchar_t> wch = PtrToStringChars(chaineManagee);
    int taille = (chaineManagee->Length+1) * 2;
    chaineChar = new char[taille];
    int t = WideCharToMultiByte(CP_ACP, 0, wch, taille, NULL, 0, NULL, NULL); 
    WideCharToMultiByte(CP_ACP, 0, wch, taille, chaineChar, t, NULL, NULL);
    (inconvénient : utilisation de WideCharToMultiByte , mais ici, la libération est classique en c++)

  7. #7
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2002
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 165
    Points : 193
    Points
    193
    Par défaut
    Un grand merci Nico-pyright

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

Discussions similaires

  1. Comment convertir de la base 16 vers la base 10 ?
    Par beegees dans le forum Assembleur
    Réponses: 10
    Dernier message: 25/12/2008, 11h01
  2. comment je peux convertir un InputStream vers un fichier
    Par nina08 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 18/11/2008, 14h17
  3. PHP vers ASP svp, comment convertir en asp ?
    Par delavega dans le forum Langage
    Réponses: 2
    Dernier message: 16/05/2007, 18h14
  4. Réponses: 2
    Dernier message: 15/09/2006, 16h06
  5. Comment convertir de l'héxadécimal vers du bcd ?
    Par chourmo dans le forum Langage
    Réponses: 1
    Dernier message: 23/06/2005, 20h31

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