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++Builder Discussion :

Erreur lors de l'appel d'une DLL créée avec Visual


Sujet :

C++Builder

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    274
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 274
    Points : 64
    Points
    64
    Par défaut Erreur lors de l'appel d'une DLL créée avec Visual
    J'ai crée une dll avec visual c++ et je veux l'utiliser dans Borland c++ 6
    dans cette dll j'ai la fonction affiche() qui ecrit le fameux hello word!!!
    le message d'erreur suivant apparait:
    [Linker Error] Unresolved external 'affiche()' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\UNIT1.OBJ
    j'ai crée la meme dll averc Borland et c'est le meme message d'erreur qui apparait.

    j'ai bien ajouté le .lib.

    qu'est ce que je peux faire.

  2. #2
    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
    Comment est déclarée et définie la fonction affiche() ?
    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.

  3. #3
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    274
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 274
    Points : 64
    Points
    64
    Par défaut
    void affiche()
    {
    printf ("salut\n");
    }

  4. #4
    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
    Dans un fichier c++, je suppose ?
    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.

  5. #5
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    274
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 274
    Points : 64
    Points
    64
    Par défaut
    En créant la dll j'ai les fichier .cpp, .h, .dll et le .lib

    j'ai mis ces fichier dans le repertoire courant de l'application qui va appeler la dll.

    dans le .cpp il y a le code déja donné.
    dans le .h il y a la declation de la fonction: void affiche()

  6. #6
    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
    L'interface C++ des fonctions est propriétaire et donc incompatible.
    Pour utiliser des DLLs d'un compilateur à l'autre, il faut que les fonctions exposées aient une interface C.

    Pour cela, il faut leur appliquer le modificateur extern "C" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Affiche.h
     
    #ifndef EXTERN_C
    #ifdef __cplusplus
    #define EXTERN_C extern "C"
    #else
    #define EXTERN_C extern
    #endif
    #endif
     
    EXTERN_C void affiche();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //Affiche.c
    #include <stdio.h>
    #include "Affiche.h"
     
    EXTERN_C void affiche()
    {
    printf ("salut\n");
    }

    Ensuite, il faut probablement d'autres spécifications pour dire "Cette DLL exporte des fonctions" et pour dire "Cette fonction se trouve dans une DLL".
    Je sais comment on fait sous Visual, mais j'ignore comment le faire sous Borland...
    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.

  7. #7
    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
    Sous Visual, on utilise __declspec(dllexport) ou __declspec(dllimport), souvent regroupés avec une macro.

    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
    // Affiche.h
     
    #ifdef BUILDING_AFFICHEDLL //Définir cette macro dans les options du projet de la DLL
    #define AFFICHEDLL_API __declspec(dllexport)
    #else
    #define AFFICHEDLL_API __declspec(dllimport)
    #endif
     
    #ifndef EXTERN_C
    #ifdef __cplusplus
    #define EXTERN_C extern "C"
    #else
    #define EXTERN_C extern
    #endif
    #endif
     
    EXTERN_C AFFICHEDLL_API void affiche();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //Affiche.c
    #include <stdio.h>
    #include "Affiche.h"
     
    EXTERN_C AFFICHEDLL_API void affiche()
    {
    printf ("salut\n");
    }
    Par contre, j'ignore si __declspec() marche sous Borland...
    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.

Discussions similaires

  1. Erreur lors de l'appel d'une DLL en C depuis Java
    Par rinuom dans le forum Général Java
    Réponses: 1
    Dernier message: 30/04/2012, 19h23
  2. Erreur lors de l'appel d'une procédure stockée
    Par aperrin dans le forum JDBC
    Réponses: 1
    Dernier message: 04/01/2008, 13h54
  3. [forward] Erreur lors de l'appel d'une méthode
    Par GLDavid dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 03/07/2007, 17h10
  4. Erreur lors de l'appel d'une fonction
    Par larimoise dans le forum MATLAB
    Réponses: 6
    Dernier message: 21/04/2007, 11h02
  5. Erreur lors de l'appel d'une page executée avec AJAX
    Par jt-tronix dans le forum Langage
    Réponses: 3
    Dernier message: 08/11/2006, 17h56

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