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# Discussion :

Mapper une fonction C++ retournant une structure


Sujet :

C#

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 30
    Par défaut Mapper une fonction C++ retournant une structure
    Bonjour,

    Je cherche depuis un petit moment comment appeler une fonction d'une dll C++ en CSharp sans succés.


    Voici la partie C++

    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
    const int TAILLE = 20;
    
    struct MonTypeStruct
    {
      WCHAR * chaine;
      BYTE array[TAILLE];
      int i;
    }
    
    // Déclaration d'une variable static de type MonTypeStruct
    static MonTypeStruct staticStruct;
    
    MonTypeStruct GetStruct()
    {
      return staticStruct; // On retourne la variable global
    }
    Voici maintenant la partie C# qui me pose problème. Voici ce que je comptais faire :

    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
    const Int32 TAILLE = 20;
    
    [StructLayout(LayoutKind.Sequential)]
    public struct MonTypeStruct
    {
      [MarshalAs(UnmanagedType.LPWStr)]
      public String chaine;
      [MarshalAs(UnmanagedType.LPArray, SizeConst = TAILLE)]
      public Byte[] array;
      public Int32 i;
    }
    
    [DllImport("maDllCpp.dll")]
    static extern MonTypeStruct GetStruct();
    
    //Appel de la methode dans une fonction C#
    MonTypeStruct mts = GetStruct();
    Lors de l'execution du code, j'ai une exception du type NotSupportedException, mais je ne sais pas quoi faire.

    Pouvez-vous m'aider ?

    Par avance Merci

  2. #2
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut j'avais déja chipoté avec une fonction qui me rendait un tableau de pointeurs de char

    J'avais déclaré un IntPtr

    Et je recupérais ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Marshal.PtrToStringAnsi((IntPtr)StrPtr[i]);
    Essaye peut-etre de declarer un IntPtr ou IntPtr * a la place de ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [MarshalAs(UnmanagedType.LPWStr)]
    public String chaine;
    Mais je t'avoue que quand on ne baigne pas tous les jours la dedans j'ai chaque fois du réflechir et chipoter un brin pour etablir les bons dialogue entre dll C++ et C#

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 30
    Par défaut
    Déclarer un IntPtr * suppose que je passe en contexte unsafe, ce que je ne souhaite pas.
    Normalement, le morceau de code dont tu parles ne pose pas problème, je l'ai récupérer sur un tuto.

    Pour simplifier ma question dans un premier temps, on pourrais considérer que la structure est uniquement constituée d'entiers du genre

    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
    // c++
    struct MonTypeStructSimple
    {
      int a;
      int b;
      int c;
    }
     
    // C#
    [StructLayout(LayoutKind.Sequential)]
    public struct MonTypeStructSimple
    {
      public Int32 a;
      public Int32 b;
      public Int32 c;
    }
    mais pour l'instant, même avec ça, je n'arrive pas à récupérer ma structure en retour de méthode

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 30
    Par défaut
    Je me permet de relancer le sujet car je n'ai toujours pas trouvé de solution et cela m'est d'une grande importance.

    Merci à celui qui pourra me venir en aide

    PS: Si mes explications ne sont pas clair, n'hésitez pas à m'en faire la remarque

Discussions similaires

  1. [PHP 5.0] Creer une fonction qui retourne une variable dans le script
    Par keaton7 dans le forum Langage
    Réponses: 8
    Dernier message: 10/02/2009, 14h09
  2. Réponses: 1
    Dernier message: 25/10/2007, 21h25
  3. Appel d'une fonction A depuis une fonction B.
    Par LeFlou dans le forum C++
    Réponses: 9
    Dernier message: 22/05/2007, 17h36
  4. [VBA-E] Une fonction Excel dans une fonction VBA
    Par laloune dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 14/07/2006, 10h21
  5. Passer une fonction comme argument à une fonction
    Par Cocotier974 dans le forum Général Python
    Réponses: 4
    Dernier message: 29/06/2004, 13h41

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