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

ImportDLL paramètre structure


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 66
    Par défaut ImportDLL paramètre structure
    Bonjour à tous,

    tout d'abord meilleurs voeux pour cette année 2012.

    Je rencontre des difficultés pour implémenter un DLL dans une application windows form en c#.

    La DLL contient un ensemble de fonction écrite en c/c++ dont je ne suis pas l'auteur.

    Je tente d'exploiter ce DLL en c#. J'ai pour le moment réussi à exploiter une fonction dont le paramètre retour était un string simplement.

    voici comment j'ai procédé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    using System.Runtime.InteropServices;
     
    [DllImport("lib.dll", CharSet = CharSet.Ansi,
            CallingConvention = CallingConvention.StdCall, EntryPoint = "version")]
            public static extern string version();
     
    private void button3_Click(object sender, EventArgs e)
            {
               label1.Text = "Version: "+ version();
            }
    Cela fonctionne très bien.

    Maintenant je rencontre une difficulté pour déclarer une fonction dont les paramètres utiles et retour sont des structures, voire des pointeurs de structure qui contiennent des char et autre variables.

    J'ai un peu cherché sur le net mais je n'ai rien trouvé correspondant vraiment à mon cas. IntPtr ?

    Est ce que quelqu'un pourrait m'expliquer la procédure pour déclarer correctement ce genre de fonction en langage c# ?

    merci d'avance pour votre aide.

  2. #2
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Salut,
    Si tu ne nous donne pas la signature de la fonction et des structures on ne risque pas de pouvoir t'aider.
    Sinon, regarde comment c'est fait pour les API Win32, il y a plein d'exemple sur www.pinvoke.net.
    On a par exemple CreateDIBitmap, une fonction qui prend en paramètre un pointeur sur une structure BITMAPINFOHEADER.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 66
    Par défaut
    Merci pour ta réponse rapide.

    je comptais justement éditer mon post avec un exemple de fonction en question.

    Voici un exemple de fonction de la librairie:

    => nfc_device_t* nfc_connect (nfc_device_desc_t * pndd)

    nfc_device_desc_t Struct Reference :

    char acDevice [DEVICE_NAME_LENGTH]
    char * pcDriver
    char acPort [DEVICE_PORT_LENGTH]
    uint32_t uiSpeed
    uint32_t uiBusIndex

    nfc_device_t Struct Reference :

    struct nfc_driver_t * driver
    char acName [DEVICE_NAME_LENGTH]
    bool bCrc
    bool bPar
    bool bEasyFraming
    bool bAutoIso14443_4
    byte_t btSupportByte
    int iLastError

    nfc_connect est un exemple de fonction que je dois déclarer dans mon DLL import.

  4. #4
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Il manque la structure nfc_driver_t, ainsi que la valeur des #define DEVICE_NAME_LENGTH et DEVICE_PORT_LENGTH.

    Avec ce que tu donnes actuellement, le pinvoke doit être quelque chose comme ça :
    Code c# : 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
     
    [DllImport("lib.dll", CharSet=CharSet.Auto)]
    [return: MarshalAs(UnmanagedType.LPStruct)]
    public static extern nfc_device_t nfc_connect([In, MarshalAs(UnmanagedType.LPStruct)]nfc_device_desc_t pndd);
     
    [StructLayout(LayoutKind.Sequential)]
    struct nfc_device_desc_t
    {
    	[MarshalAs(UnmanagedType.ByValTStr, SizeConst=DEVICE_NAME_LENGTH)]
    	string acDevice;
    	[MarshalAs(UnmanagedType.LPStr)]
    	string pcDriver;
    	[MarshalAs(UnmanagedType.ByValTStr, SizeConst=DEVICE_PORT_LENGTH])]
    	string acPort;
    	UInt32 uiSpeed;
    	UInt32 uiBusIndex;
    }
     
    [StructLayout(LayoutKind.Sequential)]
    struct nfc_device_t
    {
    	nfc_driver_t driver;
    	[MarshalAs(UnmanagedType.ByValTStr, SizeConst=DEVICE_NAME_LENGTH)]
    	string acName;
    	bool bCrc;
    	bool bPar;
    	bool bEasyFraming;
    	bool bAutoIso14443_4;
    	byte btSupportByte;
    	int iLastError;
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2010
    Messages : 66
    Par défaut
    Le code est impressionnant. je n'aurai jamais trouvé ça moi même.

    voici les paramètres manquant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    typedef struct {
    const struct nfc_driver_t *driver;
    void* driver_data;
    void* chip_data;
     
    char    acName[DEVICE_NAME_LENGTH];
    bool    bCrc;
    bool    bPar;
    bool    bEasyFraming;
    bool    bAutoIso14443_4;
    byte_t  btSupportByte;
    int     iLastError;
    } nfc_device_t;
    et les deux defines :

    00037 # define DEVICE_NAME_LENGTH 256
    00038 # define DEVICE_PORT_LENGTH 64

    Je devrai opérer de la même manière pour chaque fonctions du DLL ?

    Si il manque encore des paramètres, j'aurai plus de chance de te donner le lien qui fourni la documentation de la librairie.

    Merci en tout cas pour ton aide. J'y vois déjà un peu plus clair.

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par GGelec Voir le message
    Le code est impressionnant. je n'aurai jamais trouvé ça moi même.

    voici les paramètres manquant :
    .
    Non, il manque toujours la définiton de nfc_driver_t.

Discussions similaires

  1. WSDL et paramètres "structurés" tableau/table de hachage
    Par _-Sky-_ dans le forum Services Web
    Réponses: 1
    Dernier message: 17/04/2009, 13h36
  2. structure en paramètre d'une fonction
    Par Tex-Twil dans le forum C
    Réponses: 6
    Dernier message: 29/03/2006, 21h42
  3. sequence de structure en paramétre de methode.
    Par lessecs dans le forum CORBA
    Réponses: 3
    Dernier message: 11/02/2006, 21h15
  4. Réponses: 10
    Dernier message: 04/01/2006, 16h57
  5. Réponses: 10
    Dernier message: 17/12/2004, 13h36

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