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

Framework .NET Discussion :

DllImport : paramètre bizarre


Sujet :

Framework .NET

  1. #1
    Membre éprouvé Avatar de jmnicolas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2007
    Messages : 427
    Points : 976
    Points
    976
    Par défaut DllImport : paramètre bizarre
    Bonjour,

    dans le cadre d'un projet C# / .NET 4.0 je dois faire appel à une dll codée en C.
    Après quelques lectures sur DllImport je suis bloqué, à chaque fois que j'essaie d'appeler la dll ça lance une exception :

    Impossible de trouver le point d'entrée [...] dans la dll [...]
    Je pense que c'est parce que les paramètres que j'utilise n'ont pas le bon type, mais n'ayant jamais fait de C je ne sais pas trop comment les convertir.

    Voici la déclaration de la fonction dans le fichier .h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern "C" __declspec(dllimport) int CardDetect(bool Debug, void (*)(char *Data, int Len));
    Le 2ème paramètre m'apparait hautement chelou

    J'ai essayé plusieurs solutions, de style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [DllImport("DriverDll.dll", EntryPoint = "CardDetect", ExactSpelling = false, SetLastError=true)]
    		static extern int CardDetect(bool debug, object obj);
    Mais j'ai l'exception à chaque fois.
    Y a t il un codeur C dans la salle ?
    The greatest shortcoming of the human race is our inability to understand the exponential function. Albert A. Bartlett

    La plus grande lacune de la race humaine c'est notre incapacité à comprendre la fonction exponentielle.

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

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Salut,
    Généralement ce problème se pose quand le nom de la fonction n'est pas réellement le bon. Par exemple, la fonction C "MessageBox" n'existe pas, il s'agit d'une macro qui se résoud à la compilation, par le preprocesseur, selon certaines variables. Les fonctions qui existent réellement sont MessageBoxA et MessageBoxW.
    Donc regarde la section export de ta dll C afin de trouver le véritable nom.
    De même, dans certains cas, certains paramètres n'existent pas, ils peuvent êtres passés par le preprocesseur (même si c'est beaucoup moins fréquent)

    EDIT :
    J'ai lu un peu vite
    Vu la déclaration dans le .h, ce n'est pas ça ton problème.
    Le paramètre que tu trouve "hautement chelou" est un pointeur de fonction (delegate en .net)

    Ton pinvoke devrait ressembler à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public delegate void CardDetectCallback(string str, int i);
     
    [DllImport("DriverDll.dll", SetLastError=true)]
    static extern int CardDetect(bool debug, CardDetectCallback callback);

  3. #3
    Membre éprouvé Avatar de jmnicolas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2007
    Messages : 427
    Points : 976
    Points
    976
    Par défaut
    Malheureusement quand j'appelle la méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CardDetect(false, null)
    j'obtiens toujours la même exception à propos du point d'entrée introuvable.
    Merci de t'intéresser à mon problème.
    The greatest shortcoming of the human race is our inability to understand the exponential function. Albert A. Bartlett

    La plus grande lacune de la race humaine c'est notre incapacité à comprendre la fonction exponentielle.

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

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Mais tu ne dois pas passer null, c'est un callback.
    Vu le nom de la fonction il doit s'agir d'une fonction qui va détecter la présence d'une carte et, quand elle la trouvera, elle appellera la fonction callback en lui passant le nom de la carte trouvée.

    Cependant, si l'exception est toujours entry point not found en passant un callback, c'est probablement que le nom de la fonction n'est pas le bon (cf. ma première réponse)

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

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    En effet, il est très possible que tu ais plus tard un problème sur les paramètres (c'est assez fréquent avec les appels "P/Invoke") mais ici, le message d'exception est clair : le fonction n'est pas trouvée dans la DLL et, à ce stade, aucun check sur les paramètres n'est effectué (en C, contrairement au C++, il n'y a pas de check de signature dans la décoration du nom).

    Normalement, si le code C a bien été compilé avec le .h associé, l'exportation avec la déclaration extern "C" supprime la décoration du nom C (différent de la décoration du nom C++ mais existant néanmoins).

    Pour vérifier cela, le mieux est d'ouvrir ta DLL avec le "Dependency WAlker" (c'est vieux, mais c'est pratique pour controler ce genre de cas) et de vérifier de visu quels sont les fonctions exportées par ta DLL.

    As tu la main sur la source C de la DLL ? Si c'est le cas, le mieux est d'ajouter un fichier d'export à la DLL C (fichier .DEF si ma mémoire est bonne mais à vérifier, je ne suis pas sur de moi sur ce coup).

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  6. #6
    Membre éprouvé Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Points : 1 188
    Points
    1 188
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Pour vérifier cela, le mieux est d'ouvrir ta DLL avec le "Dependency WAlker" (c'est vieux, mais c'est pratique pour controler ce genre de cas) et de vérifier de visu quels sont les fonctions exportées par ta DLL.

    As tu la main sur la source C de la DLL ? Si c'est le cas, le mieux est d'ajouter un fichier d'export à la DLL C (fichier .DEF si ma mémoire est bonne mais à vérifier, je ne suis pas sur de moi sur ce coup).
    Bonjour,

    Je suis tout à fait d'accord avec BlueDeep, j'ai fait à une époque un wrapper pour une appli en C que je controlais en c#, et j'ai utilisé dependancy walker avec la fonction "copier la signature de la fonction", que tu colles dans ton DllImport avec peu de modifications.

    Il existe un petit outil (dont j'ai complétement oublié le nom) qui génère le code à utiliser en C# (VB aussi). Tu lui fournis ta dll, il l'analyse et te fournis toutes les fonctions exportables, et tu choisis la fonction que tu souhaites appeler à partir de ton code et te génère le code C#. S'il y a des gens qui ont une mémoire plus grande que la mienne...

    Bon dév
    Un âne se croit savant parce qu'on le charge de livres (proverbe américain)

    N'oubliez pas de avant de
    Pas de question techniques par MP, c'est contre la philosophie du forum

  7. #7
    Membre éprouvé Avatar de jmnicolas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2007
    Messages : 427
    Points : 976
    Points
    976
    Par défaut
    Bon après vérification avec le fournisseur de la DLL, celle-ci avait un problème
    La nouvelle version fonctionne correctement.
    Je marque ce sujet comme résolu.
    The greatest shortcoming of the human race is our inability to understand the exponential function. Albert A. Bartlett

    La plus grande lacune de la race humaine c'est notre incapacité à comprendre la fonction exponentielle.

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

Discussions similaires

  1. problème dllImport avec tableau de char[] en paramètre E/S
    Par moulefrite dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/12/2008, 10h07
  2. [SWT] Problème de paramètre GridData
    Par yolepro dans le forum SWT/JFace
    Réponses: 4
    Dernier message: 06/12/2002, 10h37
  3. passage en paramètre d'un array dynamique 2D
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 27/11/2002, 19h47
  4. Réponses: 4
    Dernier message: 28/09/2002, 00h00
  5. Paramètre requete SQL (ADOQuery)
    Par GaL dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/07/2002, 11h24

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