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 :

passage de structure par pointeur a une API de DLL


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 22
    Points : 17
    Points
    17
    Par défaut passage de structure par pointeur a une API de DLL
    Bonjour a tous,

    je dois utiliser une API dans une DLL ecrite en C

    la fonction prend en paramètre un pointeur sur une structure
    ci dessous le prototype en C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Function(MaStructure *parameters)
    en C la structure est definie comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // parameters structure
    typedef struct
    {
         unsigned char * p1
         unsigned char p1_len
         unsigned char * p2
         unsigned char p2_len
    } MaStructure ;
    où p1 est un pointeur vers un tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned char TAB_p1[10];
    Comment doit on déclarer ce genre de structure en VB.NET ?
    J'ai essayé avec le Marshalling mais sans succès.

    pouvez vous m'aider ?

  2. #2
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Quand tu dis que tu as essayé le marshalling, tu veux dire le Marshal.StructureToPtr ?

    Logiquement dans te structure, tu dois déclarer un pointeur vers ton tableau (type de donnée = intptr).

    Il devrait donc suffire de créer ce tableau en tant que structure et de récupérer le pointeur via Marshal.StructureToPtr.

    Je suis pas sûr d'être trés clair ...

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Function(MaStructure *parameters)
    devient
    Attention il faut un Byref pour passer un pointeur de structure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Public Declare Function MaFonctionPourVB Lib "maDll.dll" Alias "MaFonction " _
     ( ByRef parameters As MaStructure ) As Byte
    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
    26
    27
    28
    29
    30
    31
    32
    33
     
    Imports System.Runtime.InteropServices
     
    'On indique que les éléments de la structure doivent respecter l'ordre de la declaration
    'p1 puis p1_len puis p2
    <StructLayout(LayoutKind.Sequential)> _
    Public Structure MaStructure 
        Dim p1 As IntPtr
        Dim p1_len As byte
        Dim p2 As IntPtr
        Dim p2_len As byte
    End Structure
     
    Dim MyStruct_VB as New MaStructure
     
    'On declare 2 tableaux de Byte (equivalent de unsigned char en VB)
    Dim Tab_p1() as byte = {1,2,3,4,5}
    dim Tab_p2() as byte = {7,8,9,0}
     
    ' Initialisation des pointeurs et allocation memoire
    MyStruct_VB.p1 =  Marshal.AllocHGlobal(Tab_p1.length)
    MyStruct_VB.p2 = Marshal.AllocHGlobal(Tab_p2.length)
     
    'On copie le contenu des tableaux de byte dans la structure
    Marshal.copy( Tab_p1, 0 , MyStruct_VB.p1 , Tab_p1.Length )
    Marshal.copy( Tab_p2, 0 , MyStruct_VB.p2 , Tab_p2.Length )
     
    'Appel de l'API de la DLL
    valeur_retour = MaFonctionPourVB( MyStruct_VB )
     
    'si On veut récupérer les éléments dans la structure
    Marshal.copy( MyStruct_VB.p1 , 0 , Tab_p1 , MyStruct_VB.p1_Len )
    Marshal.copy( MyStruct_VB.p2 , 0 , Tab_p2 , MyStruct_VB.p2_Len )
    Voila, ça a marché pour moi... Je n'ai pas réussi à utiliser le marshalling et le StructureToPtr avec des structures contenant des pointeurs.

    Arnaud.

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

Discussions similaires

  1. Passage de paramètres par pointeur, en cascade
    Par babykichon dans le forum Débuter
    Réponses: 34
    Dernier message: 27/05/2011, 16h02
  2. Réponses: 6
    Dernier message: 31/03/2011, 08h55
  3. Réponses: 4
    Dernier message: 07/01/2009, 23h46
  4. Copie de structure par pointeur - Problème LSB MSB
    Par the_ionic dans le forum Réseau
    Réponses: 4
    Dernier message: 17/07/2006, 15h08
  5. Réponses: 8
    Dernier message: 10/03/2006, 17h28

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