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# comment utiliser correctement le marshaling avec LPSTR [Fait]


Sujet :

C++/CLI

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �clair�
    Inscrit en
    Juillet 2007
    Messages
    357
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 357
    Par d�faut c# comment utiliser correctement le marshaling avec LPSTR
    Bonjour

    Je tien a m excuser si cette question a deja ete posee mais j'ai lu quelques post sans trouver de reponse.
    J'ai une fonction native c dont le prototype est le suivant :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
     bool TraduireTexte(LPSTR Text_Input, LPSTR Text_Output)
    Le probleme c'est que je ne comprend pas tres bien comment marche le marchalling et que je ne connait pas la taille finale de Text_Output.

    Si je declare la fonction comme suit, j ai une erreur accessviolationexception:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    [DllImport("madll.dll")]
    public static extern bool TraduireTexte(
    string Text_Input,
    IntPtr Text_Output)
    Pour le moment j utilise le code suivant pour fonctionner mais c 'est pas tres propre

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    DllImport("madll.dll")]
    public static extern bool TraduireTexte(
    string Text_Input,
    byte[] Text_Output)
     
    .......
    byte[] l_TextOutput = new byte[1024];/ je sais que le resultat sera < a 1024
    TraduireTexte("blablabla",TextOutput );
    MessageBox.Show(Regex.Replace(ASCIIEncoding.GetString(TextOutput ),@"\0",""));
    Si quelqu un peut m expliquer comment je peux envoyer un pointeur a mafonction , le transformer en String et ensuite liberer la memoire, merci d'avance.

  2. #2
    Membre �m�rite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par d�faut
    Salut,

    envoie lui un stringbuilder au lieu du string.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class Program
        {
            static void Main(string[] args)
            {
                StringBuilder sb = new StringBuilder(1024);
                NativesMethods.TraduireTexte("Blabla", sb);
     
                Console.WriteLine(sb);
            }
        }
     
        class NativesMethods
        {
            [DllImport("madll.dll")]
            public static extern bool TraduireTexte(
            string Text_Input,
            StringBuilder Text_Output);
        }
    Une fois le SB recupere ca reste du manag�, pas de liberation � faire.

    Bon courage. =)

  3. #3
    Membre �clair�
    Inscrit en
    Juillet 2007
    Messages
    357
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 357
    Par d�faut
    Merci pour ta reponse ,

    Mais le stringbuilder doit tout de meme etre initialiser avec une valeur, si je ne connait pas du tout la taille de retour , ny a t il vraiment pas moyen d' envoyer un pointeur null qui sera marshalle apres l appel de la fonction, et ensuite libere.

  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
    tu as quelques exemples de marshalling dans mon tutoriel http://nico-pyright.developpez.com/t...c2005/interop/
    mais en g�n�ral, un stringbuilder suffit

  5. #5
    Membre �clair�
    Inscrit en
    Juillet 2007
    Messages
    357
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 357
    Par d�faut
    Merci je venai en fait juste de le lire, tres bien redig� la section conncernant le pinvoke avec une classe m a beaucoup aider juste apres lecture,

    En fait le titre de la discussion a ete mal choisie , j ai poster cette discussion en utilisant unr fonction avec un LPSTR. mais si le LPST/strinbuilder est remplac� par un byte*/byte[]. ny a t il vraiment pas moyen d' envoyer un pointeur null qui sera marshalle apres l appel de la fonction, et ensuite libere.

  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
    c'est toi qui a cr�� la biblioth�que de traduction ? tu as la main sur le code ?

Discussions similaires

  1. Comment utiliser correctement le debugger de DevCPP
    Par Le Furet dans le forum Dev-C++
    R�ponses: 2
    Dernier message: 29/09/2005, 09h56
  2. Comment utiliser les fichiers *.PNG avec Delphi ?
    Par HopeLeaves dans le forum Composants VCL
    R�ponses: 2
    Dernier message: 17/09/2005, 20h59
  3. comment utiliser le message WM_QUERYENDSESSION avec delphi6
    Par evarisnea dans le forum API, COM et SDKs
    R�ponses: 4
    Dernier message: 31/08/2005, 14h57
  4. comment utiliser de l'OpenGL avec du Java ?
    Par DjiZ dans le forum OpenGL
    R�ponses: 3
    Dernier message: 14/01/2004, 15h21
  5. Comment utiliser les styles XP avec Dev-C++?
    Par abraxas dans le forum Dev-C++
    R�ponses: 3
    Dernier message: 05/10/2003, 19h47

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