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 :

Création d'une Dll à partir d'une famille de classe


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Avril 2014
    Messages : 105
    Par défaut Création d'une Dll à partir d'une famille de classe
    Bonjour tout le monde,

    Désolé : je suis entrain de bombarder le forum en ce moment, mais j'essaye de comprendre les Dlls and co en ce moment et n'étant pas informaticien de formation, je peux vous dire que certains passages sont relativement cotons.

    Ici c'est plus une question de méthode qu'un réel problème.

    Bon sur internet on trouve plein d'explications sur la conception de classe, l’héritage, les espaces nom and co...

    Sur internet aussi on trouve aussi plein de tutoriels sur comment concevoir sa première Dll (que ce soit une classe ou une famille de fonctions) : ça je pense l'avoir compris, je défini DLLLAFAMILLE_EXPORTS dans mon préprocesseur et puis :

    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
    18
    #pragma once
    #include <iostream>
     
    #ifdef DLLLAFAMILLE_EXPORTS
    #define StrategyImportExport __declspec(dllexport)
    #else
    #define StrategyImportExport __declspec(dllimport)
    #endif
     
     
    namespace NameSpaceA {
    	class StrategyImportExport Mere
    	{
    	public:
    		Mere();
    		~Mere();
    	};
    }
    Là, sous ms visual, il me crée un .lib et un .dll et je peux utiliser par la suite (avec le .h) dans un nouveau projet où évidemment je ne déclarerai pas DLLLAFAMILLE_EXPORTS dans les préprocessus.

    Jusqu'à là j'ai bon?


    Sur internet ce que l'on trouve moins, c'est comment créer proprement un DLL à partir d'une famille de n classes (qui dépendent les unes des autres). Alors supposons que j'ai crée des classes qui obéissent à un diagramme suivant (le plus exhaustif qui soit) :


    Nom : ClassDiagram.jpg
Affichages : 190
Taille : 171,8 Ko


    D'après vous, que vaut-il mieux faire :
    • Créer une macro globale dans header le plus en amont : du coup ici dans classeMere et un autre dans classeTierse (est-ce qu'elle peu dans ce cas avoir le même nom) + création d'un proprocessus unique exporter chacune des classes que je souhaite en mettant un StrategyImportExport devant le nom de la classe?
    • Créer un macro par classe (mais dont le nom change d'une classe à l'autre), associer à chacune d'une maccro un nom défini ou pas dans le pré-processus (en fonction que l'on souhaite l'exporter ou pas).
    • Ou sinon une autre solution? Vous feriez quoi?


    Merci d'avance pour vos conseils!

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Que tu exportes 1 ou 1M de classes c'est pareil : il faut qu'elle soit dllexport à la compilation pour être exportée et dllimport pour être importée.
    Partant de là, la logique et le bon sens veut qu'on utilise la même macro pour toutes les classes.
    Et quand tu crées une lib exportée, il y a généralement des fichiers de configuration qui définissent ce genre de trucs et sont utilisés partout où nécessaire.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Avril 2014
    Messages : 105
    Par défaut
    Voilà une réponse simple et concise.

    Merci.

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 489
    Par défaut
    On va commencer par le début : Faire une Dll avec une API C++ (avec des classes) et non C, c'est totalement foireux.
    Pour vous servir de votre machin.dll dans un exécutable, il vous faudra utiliser le même compilateur, voir la même version du compilateur et les mêmes options de compilation que ceux qui ont été utilisés pour générer "machin.dll".
    C'est dans la pratique, quasi totalement inutilisable.

    Après, si vous voulez faire un jouet, c'est vous qui voyez.

    Je confirme ce qu'a écrit @Bousk, une seule MACRO fera largement l'affaire.

    Après, on peut affiner la stratégie des header pour que la Dll soit plus utilisable (aussi bien avec un API C que C++, pour le coup).

    Un header général à la Dll mais "privé", qui contiendra la MACRO et qui sera inclus par tous les headers des classes publiques de l'API.
    Un header général publique, "le header de la lib", qui inclura toutes les classes publiques de la lib, formant l'API de la lib.

    L'utilisateur n'aura donc cas inclure le header général publique pour avoir accès à toute l'API de la lib et à rien d'autres.

  5. #5
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Avril 2014
    Messages : 105
    Par défaut
    Et bien Bacelar Merci pour cette info!

    Du coup tu me conseilles quoi? Faire des librairies statiques?

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 489
    Par défaut
    Je me suis un peu embrouillé avec les header privé/public.

    On peut s'arranger juste avec un header chapeau public qui définit la MACRO et inclus les classes publiques.
    Les header des classes publiques incluant aussi cet header "chapeau".

    Les librairies statiques on les mêmes problèmes de portabilité que les librairies dynamiques, mais en plus, même avec une API C.

    Mais le mode d'usage n'est pas le même, la librairie n'a pas à changer durant l'exploitation de l'exécutable.

    Si tu n'a pas la bonne version de la librairie au moment de la compilation de la librairie, il n'y a qu'à régénérer la librairie statique et puis c'est tout, mais si c'est pour avoir à distribuer la librairie sans les sources, ça va coincer.

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

Discussions similaires

  1. [Lazarus] [Linux] Erreur lors de la création d'une instance de classe héritée
    Par timmalos dans le forum Lazarus
    Réponses: 2
    Dernier message: 10/05/2011, 12h59
  2. Restreindre paramètre template à une famille de classes
    Par kidpaddle2 dans le forum Langage
    Réponses: 16
    Dernier message: 30/06/2010, 17h18
  3. Sérialisation XML d'une famille de classes
    Par darkfrag dans le forum C#
    Réponses: 3
    Dernier message: 09/06/2008, 16h21
  4. [WPF] Plantage lors de la création d'une instance de classe
    Par tomlev dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 14/09/2007, 14h31
  5. Réponses: 13
    Dernier message: 27/02/2007, 11h31

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