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 :

PInvoke de structure en CF .NET


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 PInvoke de structure en CF .NET
    Bonjour à tous

    Je souhaite appeller depuis mon code C# une fonction C ayant la signature suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool GetMyStructC(MyStructC mystruct);
    où MyStructC est définie ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct MyStructC
    {
     BYTE data[88]
    };
    J'ai donc défini une structure en C# équivalente à celle en C

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    unsafe struct MyStructCSharp
    {
     public fixed Byte data[88];
    };
    puis rajouter le DLLImport suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [DllImport("ma_dll_C.dll")]
    static extern Boolean GetMyStructC(MyStructCSharp mystruct);
    enfin j'apelle cette fonction depuis le code C# de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MyStructCSharp myStruct = new MyStructCSharp();
    GetMyStructC(myStruct);
    Le problème est que au retour de cette fonction, le contenu de myStruct reste inchangé !

    Je me suis dis qu'il fallait surement utiliser les attributs in, out ou ref, mais cela me lève des erreurs. J'ai aussi essayé de fournir à la fonction GetMyStruct un IntPtr pointant sur une zone de mémoire allouée avec Marshall.AllocHGlobal ... mais sans succès

    Pouvez-vous m'indiquer quel est le meilleur moyen pour obtenir le contenu de MyStructC qui est retourné par la fonction C (Sachant que je travail en CF .NET 3.5)?

    Merci

  2. #2
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Bonjour,

    je pense que vous vous compliquez la vie.
    Pas besoin de passer par créer une struct unsafe pour réaliser ça.

    Pour ma part, j'aurai plutôt écrit :


    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
    19
    20
    21
    22
    23
    24
    25
    namespace Developpez.Test
    {
        [StructLayout(LayoutKind.Sequential)]
        internal struct MyStructC
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 88)]
            byte[] data;
        }
     
        internal static class NativeMethods
        {
            [DllImport("ma_dll_C.dll")]
            [return:MarshalAs(UnmanagedType.Bool)]
            internal static extern bool GetMyStructC(ref MyStructC mystruct);
        }
     
        internal static class Program
        {
            internal static void Main(string[] args)
            {
                MyStructC myStruct = new MyStructC();
                NativeMethods.GetMyStructC(ref myStruct);
            }
        }
    }
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  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
    Merci pour ta réponse, je vais tester ta proposition de ce pas et je te tiens au courant du résultat

  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
    la solution que tu proposes ne fonctionne pas :

    Dans un premier temps, j'ai eu une NullréférenceException corrigée en faisant une allocation du membre data de la structure MyStructC

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MyStructC myStruct = new MyStructC();
    myStrutc.data = new Byte[88];  // sans cette ligne myStruct.data == null
    GetMyStructC(ref myStruct);
    dans un deuxieme temps l'appel à la fonction GetMyStructC lève une erreur du type WinCE501bException faisant planter mon programme.

    Que faire ?

    J'ai bien essayé d'autres méthode, mais au mieux j'ai une Exception que je peux catcher du type NotSupportedException lors de la Tentative de Marshalling au retour de la fonction !!

    J'ai l'impression que les possibilités de Marshalling sont trés limités en CF .NET, où puis-je trouvé une documentation appropriée, à défaut d'une solution ?!

Discussions similaires

  1. Structure en VB.Net
    Par pepi22 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 18/04/2008, 16h55
  2. [VB.NET]Structures, class et iCompare
    Par Golzinne dans le forum Windows Forms
    Réponses: 6
    Dernier message: 05/12/2005, 18h20
  3. Vb.Net et Access : comment modifier la structure d'une base
    Par hucliez dans le forum Accès aux données
    Réponses: 3
    Dernier message: 09/11/2005, 13h33
  4. [C#] Convertion de structure vers Delphi .NET
    Par Laurent Dardenne dans le forum Windows Forms
    Réponses: 21
    Dernier message: 08/01/2005, 02h36
  5. [C++ .NET] Structure dynamique
    Par tidou dans le forum VC++ .NET
    Réponses: 17
    Dernier message: 29/10/2004, 20h08

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