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 :

déclarer une classe à exporter dans un fichier .def


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2008
    Messages : 354
    Par défaut déclarer une classe à exporter dans un fichier .def
    Bonjour,
    J'ai développé une DLL et je veux l'utiliser dans une deuxième DLL.
    Lorsque j'ouvre la première DLL en utilisant Dependency, je vois toutes les classes et les méthodes de ma DLL.
    Maintenant je veux que meme en utilisant Dependency, les méthodes et les classes de la première DLL ne seront pas lisibles aux utilisateurs.
    Lorsque j'ai cherché dans le net, j'ai trouvé ce lien qui indique qu'on peut utiliser un ficheir .def pour cacher les méthodes à exporter
    http://stackoverflow.com/questions/8...nctions-in-dll
    J'ai pu utiliser cette méthode pour les fonctions mais j'ai pas trouvé comment je peux déclarer une classe à exporter dans un fichier .def.
    Merci pour vos aides

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Les fonctions (et les classes) qui doivent etre exportées depuis une dll doivent etre déclarées avecl le fameux declspec("dllexport") lors de la compilation.

    D'autre part, pour éviter le recours au fichier def lors de l'utilisation, les classes et fonctions importées d'une dll externe doivent être déclarées avec le tout aussi fameux declspec("dllimport").

    Le plus facile pour t'assurer que les bonnes fonctions et classe seront effectivement correctement exportées (respectivement importées lors de l'utilisation) est donc de recourir au préprocesseur de manière à les déclarer avec la bonne spécification.

    L'exemple minimal serait proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef BUILD_MYDLL
        #define MY_DLL_INTERFACE declspecs("dllexport")
    #else
        #define MY_DLL_INTERFACE declspecs("dllimport")
    #endif
    où MY_DLL_INTERFACE et BUILD_MYDLL seraient des symboles à exclusivement utilisés dans la dll que tu veux créer et où
    BUILD_MYDLL serait en outre passé en paramètre lors de la compilation (la ligne de commande de gcc ressemblerait donc à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -DBUILD_MYDLL //la suite
    )

    La déclaration d'une classe devant être intégralement exportée ressemblerait alors à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class MY_DLL_INTERFACE MyClass
    {
        // son contenu
    };
    Le fait d'avoir forcé l'exportation de la classe permettra à l'outil de création de fichiers def de retrouver l'ensemble des fonctions membres dont ta classe est composée et qui doivent être exportées

    NOTA: si les DLL en C++ sont une manière géniale de fournir des plugins à des applications, il faut garder en tête le fait que, contrairement aux DLL's écrites (et compilées) en C, une DLL écrite (et compilée) en C++ ne sera utilisable que par une application C++ ayant été compilée avec la même version du même compilateur et en utilisant les mêmes options que la dll, car l'ABI relative aux dll n'est pas standardisée
    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

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2008
    Messages : 354
    Par défaut
    Merci koala01 pour vos explications. J'ai fait ma DLL comme tu as montré mais mon problème est que lorsque j'utilise le logiciel Dependency je peux voir toutes les méthodes à exporter de ma DLL.
    Donc ce que je veux exactement est de cacher les méthodes de ma DLL. même en utilisant Dependency, on ne peut pas voir les méthodes et les classes de cette DLL.

    Lorsque j'ai cherché dans l'internet j'ai trouvé qu'on peut les cacher en utilisant un fichier .Def. Mon problème maintenant c'est, y a t il une autre méthode qui permet de crypter ou bien de cacher les méthodes d'une DLL en utilisant Dependency sinon comment je peux déclarer les classes à exporter dans un fichier .def

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Euh ... Si je ne me trompe pas, si elles apparaissent dans Dependency, c'est que ces fonctions et classes sont exportées, et il semble donc logique que l'utilisateur puisse les voir.
    Si tu veux que l'utilisateur ne voie pas certaines fonctions ou classes, tu as juste à ne pas les exporter (donc pas de __declspec(dllexport)).
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Mais comment veux tu utiliser ta dll si tu ne donne pas un moyen à l'utilisateur d'appeler au moins certaines fonctions

    A partir du moment où tu veux permettre à un utilisateur d'utiliser ta dll, il faut bien qu'il sache comment le faire, et donc quelle fonction appeler, et comment, non

    Autrement, quel serait l'intérêt
    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

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2008
    Messages : 354
    Par défaut
    Oui ce sont des méthodes exportées.
    Comme j'ai mentionné dans la première discussion, j'ai développée deux DLL, une fait appel à la deuxième. la première je la connais et je connais toutes ses méthodes et je veux pas que l'utilisateur sait ce qu'elle contient et la deuxième sera utiliser par l'utilisateur.
    Pour moi, Je veux pas que les méthodes de la première DLL soient claires aux utilisateurs. En fait, l'utilisateur connait seulement les méthodes de la deuxième DLL
    Le lien suivant explique exactement ce que je veux faire et dans ce lien j'ai trouvé la solution d'utilisation d'un fichier .def

    http://stackoverflow.com/questions/8...nctions-in-dll

    Merci

Discussions similaires

  1. Réponses: 6
    Dernier message: 21/07/2009, 11h37
  2. lier une classe JAVA dans un fichier JSP
    Par zezitinho dans le forum NetBeans
    Réponses: 6
    Dernier message: 21/11/2008, 10h38
  3. Definition d'une classe python dans plusieurs fichiers
    Par wfargo dans le forum Général Python
    Réponses: 3
    Dernier message: 05/12/2006, 23h03

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