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 :

Interop C++ CLR / C# : Problème String en char*


Sujet :

C++/CLI

  1. #1
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut Interop C++ CLR / C# : Problème String en char*
    Bonjour,

    Je vous présente mon problème : J'ai créé une application console C# afin de communiquer avec une DLL en Visual C++ mode CLR.

    Mon problème est le suivant : j'ai une méthode avec la signature suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int EX_Export_File(char *argv);
    Cette méthode est dans la DLL Visual C++.

    Lorsque j'inclus la DLL dans mon projet C#, je peux faire appel à cette méthode mais curieusement, il me demande en entrée un sbyte* argv. Je n'arrive pas à trouver de solution pour passer uniquement un String...

    Comment se fait-il que la signature de la méthode a changé? Comment puis-je faire pour passer un String en C# en char* en Visual C++?

    Ce problème se pose dans la mise en place d'un wrapper C++/CLI entre une DLL Win32 C++ et un programme C#.

    Merci d'avance pour vos réponses.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 88
    Points : 81
    Points
    81
    Par défaut
    Bonjour

    Comme tu l'as dit, il te faut d'abord écrire un wrapper en C++/CLI avant de pouvoir appeler cette dll depuis du C#.

    Ensuite, dans ce wrapper, tu devras transformer des String en char*. Il faut utiliser les méthodes statiques de la classe Marshal (System::InteropServices::Marshal il me semble). Je crois que la méthode s'appelle Marshal::StringToHGlobalAuto(elle prend un string, et te donne un char*).

    A la fin de ta méthode, pense à libérer la mémoire occupée par ton char*. Par contre, n'utilise surtout pas le delete classique du C++, il faut utiliser le delete de Marshal::FreeHGlobal.

    Voila

    Tu peux te référer aux tutos de nico-pyright sur ce site, qui sont très bien faits.

    Bonne journée

  3. #3
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut
    La réponse est exactement ce que je recherchais.

    J'ai résolu le problème en passant par un String du C# au C++/CLI puis j'ai convertit dans le C++/CLI le String^ en char * via le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    IntPtr tmp = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(maChaineAConvertir);
    char* nomConvert=(char *)tmp.ToPointer();
    Merci pour l'aide.

  4. #4
    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
    quelques conversions dans la faq c++/CLI http://dotnet.developpez.com/faq/cpp...age=conversion

  5. #5
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut
    Merci au grand gourou du natif / managé... lol Tes tutoriels m'ont beaucoup servi pour m'en sortir!

    J'aurais juste une suggestion à faire : Faire figurer un tableau clair de type natif avec le code nécessaire à sa conversion en managé. Et faire de même en managé => natif (faire comme le lien que tu m'as donné mais avec d'autres sujets que le String).

  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
    Pourquoi pas, que proposes-tu comme type à traiter ?

  7. #7
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut
    En fait, durant mon travail sur l'interopérabilité, tes toturiels m'ont été très utiles pour comprendre le le principe générale mais ce qui m'a manqué, c'est d'avoir un tableau simple qui résume toutes les conversions avec :

    Natif => Managé :
    char * => String
    int * => Array<int>

    Managé => Natif :
    String => char *
    Array<int> => int *

    etc... (pour tous les types paraissant utiles d'être abordés)

  8. #8
    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
    Ok, je vais voir ce que je peux faire

  9. #9
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut
    N'y voit surtout pas une critique envers ton travail, qui m'a énormément servi mais c'est juste un complément afin qu'un correspondance soit faite de manière claire!

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

Discussions similaires

  1. Problème d'affectation Char String
    Par smail21 dans le forum Langage
    Réponses: 2
    Dernier message: 26/08/2007, 00h00
  2. Problème de marshaling char[][] -> System.String
    Par vdew1405 dans le forum C++/CLI
    Réponses: 2
    Dernier message: 20/08/2007, 10h12
  3. (Problème avec...) conversion de std::string en char
    Par crossbowman dans le forum SL & STL
    Réponses: 7
    Dernier message: 05/03/2006, 19h54
  4. Convertir String en Char: comment?
    Par nmathon dans le forum Langage
    Réponses: 2
    Dernier message: 22/08/2005, 20h58
  5. [Debutant(e)]limitation du String 65536 char
    Par srane dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 28/05/2004, 23h42

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