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 :

export de fonctions d'une DLL en C (ou problème d'import, j'en sais rien)


Sujet :

C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 17
    Points : 7
    Points
    7
    Par défaut export de fonctions d'une DLL en C (ou problème d'import, j'en sais rien)
    Bonjour à tous !

    J'ai besoin d'aide pour exporter les fonction d'une DLL que j'ai créé.
    ou les importer dans un autre programme, je sais pas trop :S

    en gros, j'ai ça :

    fichier.h
    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
     
    #ifdef MADLL_EXPORTS
    #define MADLL_API __declspec(dllexport)
    #else
    #define MADLL_API __declspec(dllimport)
    #endif
     
    #ifdef ___cplusplus
    extern "C"
    {
    #endif
     
    	MADLL_API int Init(int Ma_Variable);
     
    #ifdef ___cplusplus
    }
    #endif
    fichier .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include "Mon_Fichier.h"
    int Init(int Ma_Variable)
    {
    // mon code qui fait qques trucs
    }
    fichier .def
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ; fichier.def : déclare les paramètres de module pour la DLL.
     
    LIBRARY      "mon_Projet"
     
    EXPORTS
    Init = ?Init@@YAHHHHHHHH_N00@Z
    Tout cela sous visual studio.net 2003.
    Tout ce que j'ai essayé me donne des erreurs, là j'en suis à "liaison DLL incohérente" depuis que j'ai modifié mon .h pour ce qu'il y a au dessus, mais ce n'est qu'un warning ! :/
    Lorsque je regarde la DLL avec "quick view plus", j'obtient mes fonctions "décoré" (dûes au __declspec(dllexport)) et mes fonctions "normales" (dûes au .def)

    donc "logiquement", la DLL est bonne ?!

    quand j'essaye de l'inclure à un programme pour la tester, j'obtient une erreur LNK2001, symbole externe non résolu!
    là je sèche.
    je fourni bien le .h, le .lib, je copie la DLL dans le répertoire du projet, ainsi que dans \system32\.
    mais il ne veux pas l'utiliser....

    Est-ce que quelqu'un saurait m'aider ?
    SVP

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Tu ne peux pas avoir les 2, la fonction décorée et la non-décorée car tu n'as qu'une seule qui existe, et c'est celle non décorée, d'où la liaison incohérente.

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    tout à fait d'accord, mais cela ne m'inquiete pas trop (sauf si vous me dites que cela pose un réel problème) car les entry point sont les mêmes

    Ordinal Entry Point Name
    0000 0001126c ?Close@@YAHXZ
    0001 000113d9 ?Init@@YAHHHHHHHH_N00@Z
    0002 000112fd ?Write_And_Verify@@YAHPAD@Z
    0003 0001126c Close
    0004 000113d9 Init
    0005 000112fd Write_And_Verify
    donc je ne pense pas que ce soit bloquant (bien que pas très propres j'admet)

    En fait, depuis que je cherche, je désespère sur ce sujet, donc çela ne ma fait pas peur d'avoir deux fois.
    à moins qu'il n'existe une solution pour ne l'avoir qu'une seule fois, et que cela marche

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Le symbole manquant, c'est la fonction décorée ou l'autre ? et attention car même si le symbole est dans le .lib, il n'est pas forcément accessible, il faut qu'il y en ait 2 avec une petite différence sur le 2ème.

  5. #5
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    Bonne question ! je ne sais pas trop en fait !

    voilà en gros le programme de "test" de ma DLL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "Mon_Fichier.h"
    #include "afxwin.h" 
    #using <mscorlib.dll>
    using namespace System;
     
    int _tmain()
    {
        Init(1);
     
        return 0 ;
    }
    et l'erreur est : LNK2001 symbole externe non résolu
    "int __cdecl Init (int)" ( ?Init@@YAHHHHHHHH_N00@Z
    )

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Et sans le .def de la bibliothèque, c'est la même erreur ? Tu as bien ajouté le .lib à l'édition des liens ?

  7. #7
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    "sans le .def" ?
    c'est à dire ?
    ne pas le renseigner ?


    pour le .lib, oui, il est bien ajouté, c'est pour ça que je ne sais pas si c'est à l'exportation ou l'importation que j'ai un pb.

    y-a-t-il un moyen de l'analyser pour savoir ce qu'il contient ?
    car Visual studio l'ouvre comme un fichier binaire

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Tu n'inclus pas le fichier .def à la compilation. Il devrait y avoir un logiciel fourni avec VS qui permet de visualiser les dépendances et les fonctions exoprtées.

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je pense qu'il y a un problème dans ta compilation de la DLL: La fonction Init est déclarée en extern "C", mais elle est définie sans...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    Médinoc :
    je ne vois pas comment la définir autrement !
    si je la définie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    extern "C" int Init (....)
    {
    }
    j'ai " error C2732: les spécifications de la liaison contredisent les spécifications antérieures pour 'Init'"

    si j'essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #ifdef ___cplusplus
    #define EXTC extern "C"
    {
    #endif
    int Init (....)
    {
    }
    #ifdef ___cplusplus
    }
    #endif
    j'ai le même warning qu'avant :
    "warning C4273: 'Init'*: liaison DLL incohérente"

    Miles :
    j'ai essayé en excluant le .def, cela ne change rien :S
    par contre, je viens de regarder un peu plus le fichier lib, je ne vois pas les fonction non décorée !

  11. #11
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    Médinoc :
    en mettant
    extern "C" int Init (....)

    dans le .h ET le .cpp, en enlevant les
    #ifdef ___cplusplus
    #define EXTC extern "C"
    {
    #endif

    cela passe sans erreur.

  12. #12
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est quoi le #define EXTC extern "C" ???

  13. #13
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    j'ai qque chose qui marche !!!!
    je regarde de plus près.

    ça me fait chi*r, je sais pas ce que j'ai fait exactement :S

    je cherche et je vous le dit !

    merci de votre aide et à tout de suite dès que je sais pourquoi !

  14. #14
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Miles
    C'est quoi le #define EXTC extern "C" ???
    j'avais tapé ça sur le site de microsoft.
    c'est une macro pour pas taper 'extern "C" ' devant chaque fonction, tu met juste EXTC (ou le nom que tu as mis à la macro) et ça remplace par 'extern "C" ' à la compilation.

  15. #15
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    MAis comme tu l'as écrit, ça ne sert à rien, tu définis une macro, OK, mais tu ne l'utilises pas, tu fais un {} sans mettre le ETXC devant.

  16. #16
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    bon, j'ai toujours les
    "warning C4273: 'Init'*: liaison DLL incohérente"

    mais cela fonctionne. va savoir !

    le .def est exclu de la génération.

    le .c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include "stdafx.h"
    #include "stdio.h"
    #include <string>
    #include "MemoryChip_Write.h"
    #include <conio.h> 
     
    extern "C" int Init(int Ma_Variable)
    {//...}
    le .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #ifdef MADLL_EXPORTS
    #define MADLL_API __declspec(dllexport)
    #else
    #define MADLL_API __declspec(dllimport)
    #endif
     
    extern "C" MADLL_API int Init(int Ma_Variable);
    --------------------------------------------------------------------
    Quand au programme de test :
    le Monfichier.h rajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern "C" __declspec(dllimport) int Init(int Ma_Variable);
    le .c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include "stdafx.h"
    #include "Monfichier.h"
    #using <mscorlib.dll>
    using namespace System;
     
    int _tmain()
    {
        Init(1,2,3,4,5,6,7,true,false,true);
        return 0;
    }

    Avec tout ça, ça fonctionne.
    tout du moins, ça s'execute et fait qques petites choses, je me suis aperçu de conneries que j'avais faites dans ma DLL

    merci bien à tous les deux !!

  17. #17
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Miles
    MAis comme tu l'as écrit, ça ne sert à rien, tu définis une macro, OK, mais tu ne l'utilises pas, tu fais un {} sans mettre le ETXC devant.
    effectivement !!! boulette

    ça rassure de voir un truc qui marche, quand on est au fond, y'a pas plus déprimant !

  18. #18
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Pour le warning, regarde sur la MSDN, ça devrait te donner une piste

  19. #19
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le .h :
    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
    #ifdef MADLL_EXPORTS
    #define MADLL_API __declspec(dllexport)
    #else
    #define MADLL_API __declspec(dllimport)
    #endif
     
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    MADLL_API int Init(int Ma_Variable);
     
    #ifdef __cplusplus
    }
    #endif
    Comme ça, le .h peut être inclus aussi bien dans un programme C qu'un programme C++.

    Ainsi, tu n'as plus besoin de recopier le code dans un autre fichier .h : Il te suffit d'inclure le fichier .h de ta DLL.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 01/02/2013, 14h39
  2. [VB]exporter fonction dans une DLL
    Par SubZero2 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 05/04/2006, 15h59
  3. [DLL] problème pour appeler une fonction d'une DLL
    Par bigboomshakala dans le forum MFC
    Réponses: 34
    Dernier message: 19/07/2004, 11h30
  4. [VStudio 6] pb avec fonctions dans une DLL
    Par MogDeChNord dans le forum MFC
    Réponses: 8
    Dernier message: 08/01/2004, 08h57
  5. [VB6] Ajouter un commentaire à une fonction d'une DLL
    Par Ace303 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 05/06/2003, 08h14

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