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

Langage C++ Discussion :

Exporter et utiliser une classe depuis une DLL


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Exporter et utiliser une classe depuis une DLL
    Bonjour, je voudrais savoir comment exporter une classe qui est dans une DLL et ensuite pouvoir l'utiliser dans un programme.

    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
    // madll.cpp contient la classe
     
    #define DllExport __declspec (dllexport)
     
    class DllExport Test
    {
      public: int Carre(int n)
      {
        return n*n;
      }
    }
     
    // monprogramme.cpp utilise la classe
     
    #define DllImport __declspec (dllimport)
     
    class DllImport Test;
    Dedans je voudrais à un moment donné pouvoir faire :
    Test t;
    t.Carre(5);


    Voilà, je voudrais simplement faire ceci, je ne sais pas comment m'y prendre sans qu'il y ai des tonnes d'erreurs.

    Je vous remercie par avance, bonne journée

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut, et bienvenue sur le forum.

    Le sujet a déjà été traité à maintes reprises, mais bon...

    Ce qu'il faut, c'est être en mesure de faire la distinction entre l'étape de compilation de la dll elle-même et celle de l'utilisation de la dll.

    Le plus simple pour y arriver est d'utiliser les directives conditionnelles du préprocesseur préprocesseur.

    L'idée générale est de définir un terme (considéré comme unique) qui prendra une valeur particulière au moment de la compilation de la dll et une valeur différente lorsqu'on utilisera cette dll.

    Nous nous aiderons en cela de la possibilité qui nous est offerte de définir un "token" directement dans l'instruction de compilation ( sous Gcc, cette possibilité nous est offerte en rajoutant un "flag" -DUN_TERME_PARTICULIER)

    Nous veillerons également à ce que ce "UN_TERME_PARTICULIER" soit aussi unique que possible de manière à éviter les mauvaises compréhensions de la part du compilateur et donc le risque qu'il croie que l'on est occupé à compiler la dll alors que nous sommes en fait occupés à... vouloir l'utiliser.

    Comme "token" à définir dans l'instruction de compilation, il est courent de choisir un terme proche de BUILD_MY_DLL dans lequel nous remplacerions MY_DLL par... le nom de la dll à créer.

    La compilation des différents fichiers d'implémentation de la dll se ferait donc avec une commande proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -c monfichier.c -DBUILD_MY_DLL -o monfichier.o
    Maintenant que nous avons à peu pres fait le tour de la manière de préciser au compilateur que nous compilons la dll, nous pouvons nous attaquer au fichier qui permettra de choisir entre l'exportation (qui doit avoir lieu lorsque l'on compile la dll) et l'importation (qui doit avoir lieu lorsque l'on utilise la dll).

    Comme il est souvent nécessaire d'avoir plusieurs fichiers d'implémentation, le plus facile est de mettre l'ensemble du mécanisme permettant le choix dans un fichier d'en-tête séparé, qu'il nous "suffira" d'inclure dans les différents fichiers.
    nous pouvons décider d'appeler ce fichier, par exemple config_dll.h et il prend une forme proche de
    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
    #ifndef CONFIG_DLL_H // le garde anti inclusion multiple
    #define CONFIG_DLL_H
    /* si le symbole existe, c'est que nous compilons la dll... nous devons
     * donc exporter les différents types et fonctions
     * sinon, c'est que nous utilisons la dll, et nous devons donc importer
     * les différents types et fonctions
     * le terme choisi pour prendre la valeur adéquate pourrait etre 
     * MY_DLL_APY dans lequel on remplacerait MY_DLL par le nom de la dll
     * en cours de compilation ou d'utilisation
     */
    #if defined(BUILD_MY_DLL) 
        #define MY_DLL_API __declspec(dllexport)
    #else
        #define MY_DLL_API __declspec(dllimport)
    #endif  //fin du test conditionnel
     
    #endif //fin du garde anti inclusion multiple
    Il "suffira" ensuite d'inclure ce fichier d'en-tête dans tous les fichiers où l'on retrouve des symboles devant être exportés, comme par exemple
    fichier1.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include "config_dll.h"
    #ifndef FICHIER1_H
    #define FICHIER1_H
    /* L'idéal est de présenter les symboles à exportés sous une forme compatible
     * avec le C
     */
    extern "C"
    {
    /* la déclaration d'une fonction devant être exportée */
    void MY_DLL_API foo(/* paramètres éventuels */);
    }
     
    #endif
    fichier1.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /* config_dll.h est inclus "d'office" lorsque l'on inclu fichier1.h grace
     * au jeu des inclusions en cascades
     */
    #include "fichier1.h"
    externe "C"
    {
        void MY_DLL_API foo(/* paramètres éventuels */)
        {
            /* ce qui doit être fait */
        }
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/07/2011, 11h51
  2. Modifier une variable d'une classe depuis une autre classe
    Par Kezado dans le forum Général Java
    Réponses: 8
    Dernier message: 23/09/2010, 14h52
  3. Eval d'une propriété d'une classe dans une classe
    Par bizet dans le forum ASP.NET
    Réponses: 4
    Dernier message: 28/10/2008, 09h43
  4. Réponses: 2
    Dernier message: 13/05/2008, 10h02

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