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 :

Interop d'un pointeur Struct C en C#


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2009
    Messages : 7
    Par défaut Interop d'un pointeur Struct C en C#
    Bonjour,

    J'ai un problème de conversion de structure entre C et C#.
    Cela fait plusieurs jours que je recherche sur le net.
    Ca ma permis de résoudre d'autres soucis mais pas celui-ci.
    J'utilise une DLL d'un fabricant d'une carte. J'ai en ma possession le fichier.h.

    J'ai 2 structures défini comme cela :

    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
    typedef struct {
     
        unsigned char frame_mode;
        unsigned int  nb_cvc;
        unsigned int  first_cvc;
        unsigned char paq_window;
        unsigned char paq_size;
        unsigned char frame_window;
        unsigned char n2;
        unsigned int  t1;
        unsigned char clock;
        unsigned char polling2;
     
    } x25_t_scan_config_buffer;
     
    typedef struct {
     
        unsigned char card_number;
        unsigned char line_number;
        x25_t_scan_config_buffer *cfig_ptbuf;
     
    } x25_t_scan_config_param;
    Voilà mon .cs
    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
     
            /// <summary>
            /// Structure pour scanner la configuration de la carte.
            /// </summary>
            [StructLayout(LayoutKind.Sequential)]
            public class X25TScanConfigBuffer
            {
                public byte frameMode;
                public uint nbCvc;
                public byte paqWindow;
                public byte paqSize;
                public byte frameWindow;
                public byte n2;
                public uint t1;
                public byte clock;
                public byte polling2;
            }
     
            /// <summary>
            /// Structure pour scanner la configuration de la carte sur une ligne.
            /// </summary>
            [StructLayout(LayoutKind.Sequential)]
            public class X25TScanConfigParam
            {
                public byte cardNumber;
                public byte lineNumber;
                public IntPtr cfigPtBuff; //Pointeur sur la structure du buffer de configuration :X25TScanConfigBuffer.
            }
    Je bloque sur la déclaration du pointeur de la structure cfigPtBuff X25TScanConfigBuffer
    Merci d'avance.

  2. #2
    Membre éprouvé

    Étudiant
    Inscrit en
    Août 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 108
    Par défaut
    Bonjour,

    Je n'ai jamais fait ce genre de chose, mais comme un poiteur est en faite une référence j'essayerai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    [StructLayout(LayoutKind.Sequential)]
            public class X25TScanConfigParam
            {
                public byte cardNumber;
                public byte lineNumber;
                public X25TScanConfigBuffer cfigPtBuff;
            }
    Sinon il est possible en C# d'utiliser aussi des structures (struct).

  3. #3
    Membre éclairé
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Par défaut
    Ah ? un collègue de Cyriltec...

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Par défaut
    +1 pour NaN

    byte, int string etc .. sont des type "Valeur" et transmettent donc leur valeur.
    alors qu'une classe est passée généralement par référence (qui n'est autre qu'une référence à un emplacement mémoire (corrigez moi si je me trompe :p))

    et tu peux effectivement utiliser "struct" à la place de "class" vu que tu n'auras sans doute aucune méthode à implémenter.

  5. #5
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2009
    Messages : 7
    Par défaut
    Merci de vos réponses mais :

    @Themacleod1980

    Malheureusement, j'ai une méthode à implémenter dessus qui ressemble à ceci dans mon fichier.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    extern unsigned long  x25ScanConfig (char id_app, 
    x25_t_scan_config_param *p_param);
    que j'ai retraduis comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
          /// <summary>
            /// Modification dynamique de la configuration de la carte.
            /// ATTENTION: Cette commande entraîne le redémarrage de la carte.
            /// </summary>
            /// <param name="idApp">Identificateur de l'application.</param>
            /// <param name="pParam">Pointeur de la structure X25TSetConfigParam.</param>
            /// <returns></returns>
            [DllImport("advx25.dll", CharSet = CharSet.Auto)]
            static extern uint X25SetConfig(char idApp, ref X25TSetConfigParam pParam);
    et dans mon programme principal, je pensais initialiser un pointeur IntPtr.
    Pensez vous que c'est correct ???

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Par défaut
    Hum, je dirais que la meilleure chose à faire c'est tester ^^
    sinon essaye avec son "Handle"
    sinon ... je sèche

Discussions similaires

  1. pb pointeur + struct
    Par petit_train dans le forum Débuter
    Réponses: 1
    Dernier message: 10/01/2010, 10h09
  2. Réponses: 4
    Dernier message: 27/10/2006, 17h03
  3. Réponses: 11
    Dernier message: 20/10/2006, 13h19
  4. copie d'une struct avec pointeur
    Par Thor Tillas dans le forum C++
    Réponses: 5
    Dernier message: 18/10/2006, 02h41
  5. Pb pointeur tableau struct
    Par difficiledetrouver1pseudo dans le forum C
    Réponses: 12
    Dernier message: 02/05/2006, 15h48

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