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#] Passage de tableau de string avec transcodage


Sujet :

C++/CLI

  1. #1
    Membre averti Avatar de maitredede
    Homme Profil pro
    Pisseur de code
    Inscrit en
    Mai 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Pisseur de code

    Informations forums :
    Inscription : Mai 2006
    Messages : 60
    Par défaut [C/C#] Passage de tableau de string avec transcodage
    Bonjour,

    J'ai une fonction C définie comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libvlc_instance_t * libvlc_new( int argc, const char *const *argv, libvlc_exception_t *p_e )
    Je souhaite l'appeler en C#. J'ai donc déclaré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            [DllImport("libvlc", EntryPoint = "libvlc_new")]
            public static extern IntPtr InstanceNew(int argc, string[] argv, NativeExceptionStruct ex);
    Seulement, la fonction native me jette : elle n'arrive pas à lire le tableau.

    Après lecture de la doc de la fonction et un peu de google, il semblerai que je me trouve dans un problème épineux. Les encodages des chaines viennent me pourrir la vie : la fonction native veut de l'UTF-8.

    Au final, je dois convertir du string[] vers du const char*const* en transcodant le string vers de l'UTF-8 avec un caractère null terminal.

    Est-ce que quelqu'un peut m'aiguiller sur une piste svp ?

  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,

    Je ne suis pas sur que tu puisses procéder comme cela.

    Normalement pour utiliser du code natif (c, c++ etc), tu dois passer par un wrapper C++/CLI.
    C'est la dedans que tu convertiras tes strings en char* etc

    Il y a un super tuto la dessus fait par nico-pyright sur ce site.

    Bonne journée

  3. #3
    Membre averti Avatar de maitredede
    Homme Profil pro
    Pisseur de code
    Inscrit en
    Mai 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Pisseur de code

    Informations forums :
    Inscription : Mai 2006
    Messages : 60
    Par défaut
    Bonjour,

    Je ne vois pas à quel tuto tu te réfère (défois, je suis un cerveau lent).

    Si c'est possible, j'aimerai éviter au maximum de faire du code "natif", parce que je vise la portabilité et que Mono ne supporte pas (ou pas bien) les assembly en code mixte (C++/CLI avec du C++ natif).

    Donc si tu as une idée... Voir même créer un Marshaler pour ce type spécifique de données...

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Tu peux peut-être convertir tes chaines en UTF-8 avant l'appel à la fonction, via Encoding.UTF8. Dans ce cas il faudra modifier la signature de la fonction pour passer des tableaux de byte et non des string

    Citation Envoyé par ArianeV Voir le message
    Normalement pour utiliser du code natif (c, c++ etc), tu dois passer par un wrapper C++/CLI.
    Ce n'est pas du tout une obligation, on peut souvent s'en sortir avec des P/Invoke comme l'a fait maitredede (du moins pour du code C, pour du C++ avec des classes c'est une autre histoire...)

    Citation Envoyé par maitredede Voir le message
    Bonjour,
    Je ne vois pas à quel tuto tu te réfère (défois, je suis un cerveau lent).
    il y en a 2 en fait:
    http://nico-pyright.developpez.com/t...c2005/interop/
    http://nico-pyright.developpez.com/t...2005/interop2/

  5. #5
    Membre averti Avatar de maitredede
    Homme Profil pro
    Pisseur de code
    Inscrit en
    Mai 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Pisseur de code

    Informations forums :
    Inscription : Mai 2006
    Messages : 60
    Par défaut
    Bonjour tomlev,

    J'ai déjà essayé de passer des tableaux de bytes... Ce qui m'amène au fait que pour passer des tableaux de string, je dois passer un tableau de tableau de byte (soit un byte[][]).
    Là, c'est la couche interop qui m'insulte parce qu'elle n'a pas de Marshaler pour ce type...

    Dans les deux tutos (bien faits) de Nico, il n'y a aucune piste pour mon problème (à moins que le manque de vacances ne se fasse sentir...)

    Je vais tenter de bricoler un ou deux trucs, mais je pense que je vais en chier si je veux ne pas rajouter une couche native perso...

    Merci pour ton aide

  6. #6
    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
    J'ai le même problème. Je ne trouve pas de moyen de convertir les String C# en sbytes*.

    Quelqu'un pourrait-il nous aider sur ce sujet svp?

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    peut-être quelques pistes ici...
    http://msdn.microsoft.com/fr-fr/libr...21(VS.80).aspx

  8. #8
    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
    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.

Discussions similaires

  1. Comparaison Tableau de String avec un string
    Par halloumiali dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 19/03/2012, 14h21
  2. Tableau de String avec Hibernate ?
    Par H3bus dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/03/2012, 00h04
  3. VBA / C++ - Passage de tableau de strings
    Par paparasta dans le forum C++
    Réponses: 1
    Dernier message: 26/11/2010, 15h26
  4. retourner tableau de string avec web service SOAP
    Par xx_FiFty_xx dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 23/06/2008, 10h13
  5. Parcourir un tableau de String avec logic:iterate
    Par casawi dans le forum Struts 1
    Réponses: 7
    Dernier message: 07/02/2008, 14h40

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