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

VB.NET Discussion :

Marshalling de string


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de joKED
    Profil pro
    Imposteur en chef
    Inscrit en
    Février 2006
    Messages
    339
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Imposteur en chef

    Informations forums :
    Inscription : Février 2006
    Messages : 339
    Par défaut Marshalling de string
    Bonjour à tous,

    J'ai un problème assez étrange lors de l'appel d'une fonction d'une dll.

    En effet, je dois passer à celle ci un string, qui est modifié par ladite fonction. Jusqu'ici, tout va bien. Le problème survient lorsque je souhaite réutiliser ce string.

    Voici la définition de la fonction en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      <DllImport("maDll.dll")> _
    Public Shared Function TransformString(<MarshalAs(UnmanagedType.LPWStr)> ByRef ioString As [String]) As RETURN_CODE
     End Function
    Je l'appelle de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    dim sString as String = ""
    dim oMsg as RETURN_CODE = DEFAULT_RETURN_CODE
    oMsg = TransformString(sString)
    Me.TextBox1.text = sString
    MsgBox(sString)
    Rien de bien compliqué jusqu'ici. Là où ça se gâte, c'est lorsque je souhaite consulter le contenu de ma string.
    En effet, l'affichage de la textbox m'affiche seulement le premier caractère de la string! Encore plus fort, la message box m'affiche le contenu complet de la string ! Et, clou du spectacle, lorsque j'utilise l'espion express de l'EDI, celui ci m'indique que ma string ne contient aucun caractère ! D'ailleurs, un test en utilisant la fonction ToCharArray me retourne un tableau de 0 éléments...

    Bref, j'en perds mon latin. Suis je victime de possession démoniaque, ou y a t'il une raison à ce comportement ?

    Si quelqu'un a une idée, je lui en serait reconnaissant.

    D'avance merci

  2. #2
    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
    Quel est la signature de la fonction dans la DLL ?

    Est-ce qu'elle modifie un pointeur passé en paramètre ?
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    RETURN_CODE TransformString(char** str)

    Ou alors elle modifie les données à l'adresse du pointeur ?
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    RETURN_CODE TransformString(char* str)

    Si tu es dans le premier cas, ton approche semble correcte. Si c'est le second cas, il faut s'y prendre autrement, car une chaine en .NET n'est pas modifiable. Il faut passer un StringBuilder à la place d'une String

  3. #3
    Membre très actif Avatar de joKED
    Profil pro
    Imposteur en chef
    Inscrit en
    Février 2006
    Messages
    339
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Imposteur en chef

    Informations forums :
    Inscription : Février 2006
    Messages : 339
    Par défaut
    La signature est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TransformString(wchar_t * const ioString)
    Dès lors, il faut que j'en passe par un stringbuilder ?

    Dans ce cas, ceci est il valide ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     <DllImport("maDll.dll")> _
    Public Shared Function TransformString(<MarshalAs(UnmanagedType.LPWStr)> ByRef ioSB As [System.Text.StringBuilder]) As RETURN_CODE
     End Function

    D'autre part, il y a quelque chose que je ne comprends pas. La méthode actuelle fonctionne correctement, puisqu'un simple msgbox m'affiche le contenu de ma variable !!! Cependant, si je souhaite afficher le contenu de ma variable dans un textbox, celui ci reste désespérément vide!

  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
    Oui c'est bien ça. Par contre il faut pas oublier d'initialiser la capacité du StringBuilder avant l'appel

  5. #5
    Membre très actif Avatar de joKED
    Profil pro
    Imposteur en chef
    Inscrit en
    Février 2006
    Messages
    339
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Imposteur en chef

    Informations forums :
    Inscription : Février 2006
    Messages : 339
    Par défaut
    Hmmm... J'ai bien essayé comme indiqué de modifier mon appel de fonction, et de lui passer un Stringbuilder avec capacité initalisée, mais je me retrouve avec une "NotSupportedException" ...

    J'ai édité mon message en même temps que tu répondais, et je remarquais la chose suivante :

    D'autre part, il y a quelque chose que je ne comprends pas. La méthode actuelle fonctionne correctement, puisqu'un simple msgbox m'affiche le contenu de ma variable !!! Cependant, si je souhaite afficher le contenu de ma variable dans un textbox, celui ci reste désespérément vide!
    C'est tout de même bizarre non ? Car la chaine (initalisée à "" au départ), contient bien une valeur en sortie de fonction puisque la messageBox réussit à l'afficher. Par contre, impossible de lire sa valeur dans une textbox ou via l'espion express...

  6. #6
    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
    Citation Envoyé par joKED Voir le message
    Hmmm... J'ai bien essayé comme indiqué de modifier mon appel de fonction, et de lui passer un Stringbuilder avec capacité initalisée, mais je me retrouve avec une "NotSupportedException" ...
    Et elle dit quoi l'exception ?

    Citation Envoyé par joKED Voir le message
    C'est tout de même bizarre non ? Car la chaine (initalisée à "" au départ), contient bien une valeur en sortie de fonction puisque la messageBox réussit à l'afficher. Par contre, impossible de lire sa valeur dans une textbox ou via l'espion express...
    Bah le code non-managé a pu modifier la mémoire de la chaine, mais sans mettre à jour les autres champs de l'objet String, donc ça fait que l'objet se retrouve dans un état incohérent. Donc les résultats sont forcément un peu imprévisibles...

    Quand tu appelles une méthode native qui doit modifier le contenu d'une chaine, tu es obligé de passer par un StringBuilder, c'est la façon "officielle" de faire

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

Discussions similaires

  1. marshalling d'un objet String avec JAXB
    Par mystro7200 dans le forum Persistance des données
    Réponses: 1
    Dernier message: 19/02/2009, 15h04
  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. URGENT: retour de string
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 15/07/2002, 09h47
  4. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23
  5. erreur IDL:omg.org/CORBA/MARSHAL:1.0
    Par Pinggui dans le forum CORBA
    Réponses: 3
    Dernier message: 13/05/2002, 15h05

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