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

Windows Presentation Foundation Discussion :

marshalling dll en C++


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Par défaut marshalling dll en C++
    Bonjour,

    Je galère a utilisé une dll codé en C++ par un de mes collègue.

    On arrive bien a appelé la fonction mais il y a une boucle infini quelque part dans le code de la dll et le problème c'est qu'on ne sait pas comment debugguer tout ça!

    Voici le code permettant d'apeller une focntion de ma dll:
    (le prototype de la focntion est: vector<string> analyse(string chaine); ).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [DllImport("AnalyseurLexical.dll", CallingConvention = CallingConvention.Cdecl)]
            [return: MarshalAs(UnmanagedType.SafeArray)]
            static extern byte[] analyse( [In] IntPtr fichier);
     
            public Test()
            {
                string test = "int i;";
                IntPtr stringPointer = (IntPtr)Marshal.StringToHGlobalAnsi(test);
                byte[] toto= analyse(stringPointer);
            }
    On dirai bien que la fonction est bien appelé (on n'en est pas sûr) mais la fenêtre freeze, alors on soupçonne l'existance d'une boucle infini quelque part dans notre code, le problème c'est qu'on ne sait ce que reçoit notre fonction, on ne sait pas du tout comment debugguer tout ça!

    en espérant que vous puissiez m'aider,

    Cordialement,

    sushis

  2. #2
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Bonjour, il n'y a aucune chance que ça fonctionne ainsi.

    Autant le dire, vous êtes dans la mouise : vous utilisez une biblio écrite en C++ pour être consommée par un code C++ et uniquement cela. La raison est simple : le fait que la signature de "analyse" prenne en argument un object C++ et retourne un objet C++. On ne peut pas directement les marshaller en string et array pour une simple raison : ces deux types, std::string et std::vector sont implémentés différemment selon les compilateurs.

    Du coup, voici vos deux choix :
    * Version simple : vous écrivez trois lignes de C++ pour faire un wrapper autour d'analyse avec la signature suivante : int analyse(_in char* chaine, _out byte** data, _out uint* dataSize). Puis vous l'importerez de la façon suivante : int analyse(string chaine, out IntPtr data, out uint dataSize).
    * Version compliquée : vous savez quel est le compilateur C++ utilisé et sa version, vous regardez l'implémentation exacte de std::string et std::vector et vous créez des structures C# équivalentes que vous utiliserez dans votre signature.

    Dans les deux cas, gaffe aux fuites mémoire : la méthode analyse renvoie un vecteur, ce qui signifie qu'il appartient à l'appelant (vous) de le libérer. C'est la raison pour laquelle dans la première solution le second paramètre est un IntPtr et non directement un byte[]. D'ailleurs il n'est pas possible de marshaller un byte* en byte[] puisqu'on ne connaît pas la taille du pointeur (question d'implémentation selon les compilos encore une fois). En revanche l'inverse est possible et peut être utilisé si vous connaissez à l'avance la taille maximale du tableau.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Par défaut
    On va plutôt utiliser des types standard comme le char.

    On va utiliser un const char*, enfin de toutes façon la dll était conçu pour du code C++, il était pas prévu que l'on passe a du C# par la suite, on va se débrouiller ou va laisser tomber, le problème est vraiment trop complexe...

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/05/2011, 14h50
  2. [C#] Dll C++ et marshaling de VARIANT
    Par monk31 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 08/02/2005, 13h32
  3. Equivalent à ExeName pour une DLL
    Par Smortex dans le forum Langage
    Réponses: 7
    Dernier message: 16/07/2002, 21h07
  4. erreur IDL:omg.org/CORBA/MARSHAL:1.0
    Par Pinggui dans le forum CORBA
    Réponses: 3
    Dernier message: 13/05/2002, 15h05
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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