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 :

DLL et classe en dynamique


Sujet :

Langage C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 98
    Points : 75
    Points
    75
    Par défaut DLL et classe en dynamique
    Bonjour
    J'ai parcouru (vite fait je l'avoue) les sujets existants sans trouver ma solution alors voila :

    Je construit une DLL en C++ que je vais utiliser dans un main en C++.
    Je souhaite exporter une classe depuis ma DLL et l'utiliser DYNAMIQUEMENT dans mon main.

    Est ce possible?
    Comment faire?

    J'ai tatonné autour des getProcAddresse et en jouant avec les décorations externe "C" ou pas; sans succes.

    Y a t'il un autre moyen de charger des symboles (des classes en particulier)? Comment?

    Merci pour vos conseils.

    Habituellement, je n'exporte que des fonctions dans mes DLLs et ca se passe bien. Là j'ai besoin d'utiliser les classes directement.

  2. #2
    screetch
    Invité(e)
    Par défaut
    un moyen de faire ca est d'étendre une classe abstraite et d'exposer une fonction de création et une fonction de destruction de ta DLL

    commun :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class NinjaKoolKlass
    {
    public:
      virtual ~NinjaKoolKlass() { }
      virtual void job1() = 0;
      virtual void job2(int p1, int p2) = 0;
    };
    dans la DLL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class KoolKlass : public NinjaKoolKlass
    {
      virtual void job1() { printf("Hello "); }
      virtual void job2(int p1, int p2) { printf("world!\n") };
    };
     
    extern "C" __declspec(dllexport) NinjaKoolKlass* createKoolKlass() { return new KoolKlass; }
    extern "C" __declspec(dllexport) void destroyKoolKlass(NinjaKoolKlass* obj) { return delete obj; }
    dans le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    LoadLibrary("KoolKlass.dll");
    createKoolKlass = GetProcAdress("createKoolKlass");
    destroyKoolKlass = GetProcAdress("destroyKoolKlass");
    NinjaKoolKlass* object = createKoolKlass();
    object->job1();
    object->job2();
    destroyKoolKlass(object);

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Je pense que la partie plugin pourrais t'intéresser.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 98
    Points : 75
    Points
    75
    Par défaut
    Ok,
    Merci à vous
    Je vais essayer la méthode de screetch!

    C'est à peu pres ce que j'ai actuellement sauf que je n'ai pas la classe abstraite NinjaKoolKlass et que j'attaque directement dans KoolKlass.

    J'obtiens alors des erreurs de link du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    main.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: int __thiscall KoolKlass::job1(void)" (__imp_?job1@oolKlass@@QAEHXZ)
    L'ajout de l'interface va t'il fondamentalement changer les choses?

  5. #5
    screetch
    Invité(e)
    Par défaut
    ca t'évite d'avoir un lien fort vers l'implémentation
    le programme ne connait que la classe abstraite, tandis que la DLL (plugin) fournit l'implémentation

    si tu n'as pas la classe abstraite, le programme a besoin de l'implémentation pour fonctionner (meme si celle-ci lui est donnée plus tard dans un LoadLibrary)

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 98
    Points : 75
    Points
    75
    Par défaut
    Nickel ca marche!

    Merci beaucoup

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

Discussions similaires

  1. Instanciation de class en dynamique
    Par Sakapatate dans le forum Langage
    Réponses: 3
    Dernier message: 19/10/2006, 15h45
  2. Création de frame depuis des Dll de classes
    Par ogasse dans le forum Delphi
    Réponses: 2
    Dernier message: 31/08/2006, 12h51
  3. Dll de classe et variable
    Par SkYsO dans le forum Langage
    Réponses: 5
    Dernier message: 10/03/2006, 09h25
  4. Trouver le Type d'une classe template dynamiquement ?
    Par Serge Iovleff dans le forum Langage
    Réponses: 3
    Dernier message: 23/09/2005, 16h48
  5. DLL et classes
    Par Sunchaser dans le forum C++Builder
    Réponses: 7
    Dernier message: 04/02/2005, 01h30

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