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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    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 éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 88
    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 confirmé Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    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
    Par défaut
    quelques conversions dans la faq c++/CLI http://dotnet.developpez.com/faq/cpp...age=conversion

  5. #5
    Membre confirmé Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    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
    Par défaut
    Pourquoi pas, que proposes-tu comme type à traiter ?

+ 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