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 :

Instance de classe via DLL


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Instance de classe via DLL
    Bonjour! Je souhaite instancier une classe contenue dans une DLL.

    Le projet dll contient les fichiers dll.h et dllmain.cpp, le projet de "test" lui comporte juste exemain.cpp, voici leur contenu:

    dll.h
    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
    19
     
    #ifndef DLL
    #define DLL
     
    #include <string>
    #include <iostream>
    #include <windows.h>
     
    class perso
    {
        private:
            string name;
     
        public:
            string getName();
            void setName(string pname);
    };
     
    #endif
    dllmain.cpp
    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
     
    #include "dll.h"
     
    void perso::setName(string pname)
    {
        name = pname;
    }
     
    string perso::getName()
    {
        return name;
    }
     
    extern "C" __declspec(dllexport) perso* crtPerso()
    {
        return new perso();
    }
    exemain.cpp
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #include <string>
    #include <iostream>
    #include <windows.h>
     
    using namespace std;
     
    class perso
    {
        private:
            string name;
     
        public:
            string getName();
            void setName(string pname);
    };
     
    int main()
    {
        HMODULE hMod = LoadLibrary("dll.dll");
     
        typedef perso* (*pcrtPerso)();
     
        pcrtPerso crtPerso = (pcrtPerso)GetProcAddress(hMod, "crtPerso");
     
        perso* hercule = crtPerso();
        hercule->setName("Hercule");
    }
    Voici mon problème: lors de la compilation, la dll se charge correctement, l'import de la fonction aussi, et la création d'une nouvelle instance également, cependant la dernière ligne qui appelle la méthode setName semble poser problème puisqu'elle génère l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur 1 error LNK2001: symbole externe non résolu "public: void __thiscall perso::setName(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?setName@perso@@QAEXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) exemain.obj test
    Après recherche sur le net il semblerait qu'il faut créer un .lib et la linker au projet test, ce que j'ai effectué, mais une autre erreur est survenue: les méthodes de la classe semblaient déjà être déclarées. Le compilateur m'indiquait un conflit avec la bibliothèque par défaut et qu'il fallait utiliser l'option: /NODEFAULTLIB:library:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Avertissement 6 warning LNK4098: conflit entre la bibliothèque par défaut 'MSVCRTD' et les autres bibliothèques*; utilisez /NODEFAULTLIB:library test test
    Ce que j'ai effectué, mais cela m'a généré encore plus d'erreurs (env 60), là je ne sais plus où chercher.

    Mes connaissances en C++, POO et création de DLL sont limitées, j'ai réalisé ce projet de test avec beaucoup de tutoriels, je dois certainement mal utiliser les exports et mal concevoir ma DLL.

    Merci d'avance pour votre aide!

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Personne n'a une idée?

  3. #3
    Expert éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 754
    Points : 10 719
    Points
    10 719
    Billets dans le blog
    3
    Par défaut
    De même que tu exportes crtPerso avec __declspec(dllexport), tu dois exporter la dll que cette fonction renvoie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #define EXPORT __declspec(dllexport) // a modifier dans le code client pour faire un import
    class EXPORT perso
    {
    };
    En fait, tous les types qui figurent dans ton interface publique doivent être exportés.

    Ce sujet a été traité maintes fois, effectue une petite recherche sur le forum.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Je te remercie, je ferai plus attention la prochaine fois.

  5. #5
    Expert éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 754
    Points : 10 719
    Points
    10 719
    Billets dans le blog
    3
    Par défaut
    En me relisant, je remarque que j'ai oublié de mettre un petit smiley pour que ma réponse soit mois "abrupte"

Discussions similaires

  1. Accéder au trait d'une classe via son instance
    Par oodini dans le forum Langage
    Réponses: 6
    Dernier message: 15/04/2012, 21h47
  2. Envoyer des instances de classes via TCP
    Par ZouBi dans le forum C++
    Réponses: 8
    Dernier message: 02/08/2008, 18h07
  3. export class via dll probleme ?
    Par cheroua dans le forum C++
    Réponses: 9
    Dernier message: 25/08/2006, 13h28
  4. Réponses: 4
    Dernier message: 28/03/2005, 13h37
  5. Conditions de destruction des instances de classes
    Par elvivo dans le forum Général Python
    Réponses: 4
    Dernier message: 29/12/2004, 18h16

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