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 :

Chaine de responsabilite et dll


Sujet :

C++

  1. #1
    Fry
    Fry est déconnecté
    Membre confirmé Avatar de Fry
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 150
    Par défaut Chaine de responsabilite et dll
    bonjour

    J ai fait un code permettant d implementer une chaine de responsabilite avec le message sous forme de template donc chaque maillon doit connaitre le type du message.
    Le probleme est qu' a present je veu que chaque maillon soit dans une dll et que le message parcour les dll...

    le pb c'est que je sais comment recuperer un pointeur sur un object contenu dans une dll mais pas comment construire mon object en lui passant le type pour recupere ensuite le pointeur


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    // j ai une erreur a la compilation 
    extern "C" __declspec(dllexport) template<class T> Handler<T>* GetHandler(void);
     
    // sans creer les object dans la dll le code fonctionne:
    	// Avec Template chaine
    	HandlerManager< std::string> inst;
    	inst.AddHandler( new ConcreteHandler1<std::string>("ok1") );
    	inst.AddHandler( new ConcreteHandler2<std::string>("ok2") );
    	inst.AddHandler( new ConcreteHandler3<std::string>("ok3") );
    	inst.SendRequest("ok3");
    	inst.Clean();
    comment passer le type a la fonction qui se trouve dans la dll et qui doit construire l'object et renvoyer le pointeur?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 35
    Par défaut
    les tempates sont compilés pour chaque type que tu aura déclaré dans ton code...
    Tu ne peux pas inclure une classe template dans une dll et l'instancier avec un type particulier. La seule possibilité est de déclaré ton template entièrement dans le header de la DLL...

  3. #3
    Fry
    Fry est déconnecté
    Membre confirmé Avatar de Fry
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 150
    Par défaut
    effectivement

    je pense que je vai definir moi meme le type dont j ai besoin avant de compiler la dll comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    extern "C" __declspec(dllexport)  Handler< std::string >* GetHandler(void);

  4. #4
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Je ne sais pas trop comment fonctionne ton HandlerManager, mais si tu ne le rend pas template, et fait dériver ConcreteHandler d'une classe non template ConcreteHandlerBase, ça pourrait donner un truc comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       HandlerManager inst; 
       inst.AddHandler( new ConcreteHandler1<std::string>("ok1") ); 
       inst.AddHandler( new ConcreteHandler2<std::string>("ok2") ); 
       inst.AddHandler( new ConcreteHandler3<std::string>("ok3") ); 
       inst.SendRequest("ok3"); 
       inst.Clean();
    en exportant HandlerManager et ConcreteHandlerBase d'une dll utilisée par ton exe / les autres dll, il ne devrait pas y avoir de problèmes.
    Sinon tu ne peux pas exporter un template d'une dll (car ça n'a pas de sens), mais tu peux exporter des instanciations de template pour un type particulier (donc exporter ConcreteHandler<std::string>, ...).

  5. #5
    Fry
    Fry est déconnecté
    Membre confirmé Avatar de Fry
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 150
    Par défaut
    en fait le template du HandlerManager sert a autoriser l'utilisation de n'importe que type de message ayant surcharge l'operateur ==

    donc en fixant le type du message je peu ajouter un maillon contenu dans une dll mais si je met le handlerManager dans une dll ca rique de reporter le probleme si il y a plusieur dll

    effectivement j exporte des instanciation avec un type de message particulier le but etait de faire passer une commande entre une chaine de dll et qu il soit traite par la bonne dll

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DLL2_API Handler<std::string>* GetHandler(void)
    {
    	Handler<std::string>* inst = new ConcreteHandler1<std::string>("dll1");
    	return inst;
    }
    sinon pour la gestion de la memoire est ce que je peu liberer l'object creer dans la dll directement dans le programme appelant ou est ce que je dois ecrire une fonction clean interne a la dll que j appel ensuite?

  6. #6
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Oui tu peux en compilant pour que la dll et l'exe utilisent la même CRT.

  7. #7
    Fry
    Fry est déconnecté
    Membre confirmé Avatar de Fry
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 150
    Par défaut
    comment faire et qu'est que le CRT?
    [edit] visiblement ca plante pas [/edit]

    Autrement pour partager une classe commune en singleton entre les differentes dll, y a t-il une autre solution que de passer un pointeur?

  8. #8
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    C Runtime Library
    c'est la lib standard, le code qui est derrière fstream, cout, etc...
    Faut configurer pour utiliser ça sous forme de dll, sinon c'est dupliqué pour chaque dll/exe compilé.
    prorpiétés->C/C++->Génération de code->Bibliothèque runtime : DLL.

    Pour la partage, si tes dll ne sont pas liées dynamiquement à ton exe (chargement plus tard qu'au lancement de l'exe, bref pas un plugin quoi), tu peux simplement exporter ta classe, tout comme tu exporte GetHandler dans ton exemple.

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/03/2011, 20h03
  2. [Chaîne de responsabilités] Design pattern chaine de responsabilité
    Par Luffy_San dans le forum Design Patterns
    Réponses: 3
    Dernier message: 13/02/2008, 08h49
  3. DLL .NET pour vb6 : Tableau de chaine
    Par BacChusx dans le forum Windows Forms
    Réponses: 2
    Dernier message: 16/10/2007, 11h32
  4. Réponses: 4
    Dernier message: 20/10/2006, 16h19
  5. result: chaine de caractère pour une DLL
    Par Sephiroth Lune dans le forum Langage
    Réponses: 7
    Dernier message: 27/07/2004, 23h05

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