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 :

DLL et Heritage


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut DLL et Heritage
    Bonjour,

    Je developpe une DLL avec un POO :

    Voici le code de la DLL :
    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
    class Mere {
       Mere() {};
       virtual bool Test() { return true; }
    };
    class Fille : public Mere { //Classe derive
       Fille() {};
       bool Test() { return false; }
    };
    //Exportation d'un fonction pour la creation d'un objet
    extern "C" bool __declspec(dllexport) __cdecl newClass(Mere* mere);
     
    bool __declspec(dllexport) __cdecl newClass(Mere* mere) {
    	acq = new Fille();	
        return ( acq != NULL) ;
    }
    Puis voici le code qui appelle la DLL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //charge la library
    HINSTANCE dll = LoadLibrary( TEXT("mydll.dll") );
    //Definie la fonction
    typedef bool (*newClassFunc)(Mere* mere);
    Mere* mere = NULL;
    //Recupere l'adresse de la focntion dans la DLL
    newClassFunc newClass = (newClassFunc)GetProcAddress(dll,"newClass");
    newClass(mere);
    bool res = mere.Test(); //Plantage
    Donc il y a plantage sur la derniere ligne. Je sais pourquoi il plante car l'objet mere dans mon prog est en fait une classe fille. Donc si vous piger mon pb et que vous avez une solution pour faire une sorte d'héritage depuis un DLL, Merci d'avance

  2. #2
    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
    Que cherches-tu à faire ? Comment tu vas utiliser cette dll ? Dans quel contexte ?
    T'a beaucoup de rainsons possibles au plantage de ton code, à commencer par ce que tu as donné (mere n'est pas affecté...).
    Tu veux faire une sorte de factory ?
    Note que :
    - la dll devra être compilée avec le même compilo (version etc...) que le programme
    - il est très conseillé de partager la même CRT entre les dll, donc se lier à la CRT sous forme de DLL
    - ton code provoque un comportement indéfini du point de vue C++ car tu dupliques la classe Mere : ton programme la compile, et la dll aussi. C'est donc 2 classes Mere différentes que tu tentes de mélanger. Il te faut placer ta classe Mere dans une dll à part, l'exporter de ta dll, et l'importer dans ton exe et ta dll cliente.

    Je déplace vers le forum C++ où on a déjà parlé de ça.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 82
    Par défaut
    T'a beaucoup de rainsons possibles au plantage de ton code
    Je dirais même plus, il y a tellement d'erreurs (parce que tapé rapidement probablement) qu'on a du mal à comprendre ce que tu cherches à faire.

    Si j'arrive correctement à lire entre les lignes, tu cherches à créer un nouvel objet en appelant la méthode newClass de ta dll. Tel que c'est écrit, ça ne marchera pas : tu passes un pointeur sur Mere à ta méthode, auquel tu assignes un nouvel objet. A la sortie de la méthode, le pointeur côté appelant ne pointe pas sur ton nouvel objet car le pointeur a été passé par copie à la méthode.
    Ca peut être une raison du plantage, en plus de celles citées par Aurélien.

  4. #4
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut Re: DLL et Heritage
    Citation Envoyé par themadmax

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    bool __declspec(dllexport) __cdecl newClass(Mere* mere) {
       acq = new Fille();   
        return ( acq != NULL) ;
    }
    Déjà ce code ne peut pas fonctionner. A aucun moment tu n'utilises le paramètre mere!!

    "acq" on ne sais pas d'ou ça sort.

    Tu voulais peut-être faire ça:

    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
     
     
    class Mere {
     
    		public:
       Mere() {};
       virtual bool Test() { return true; }
    };
    class Fille : public Mere { //Classe derive
     
    public:
       Fille() {};
       bool Test() { return false; }
    }; 
     
    extern "C" bool __declspec(dllexport) __cdecl newClass(Mere** mere); 
     
    bool __declspec(dllexport) __cdecl newClass(Mere** mere) {
     
       (*mere) = new Fille();
       if((*mere))
         return true;
       return false;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    HINSTANCE dll = LoadLibrary( TEXT("mydll.dll") );
    //Definie la fonction
    typedef bool (*newClassFunc)(Mere** mere); 
     
    Mere* mere = NULL;
    //Recupere l'adresse de la focntion dans la DLL
     
    newClassFunc newClass = (newClassFunc)GetProcAddress(dll,"newClass");
     
    if(newClass(&mere)){
      bool res = mere->Test();
    }
    attention, car si tu décharges ta dll avant la fin du programme, alors "mere" ne pointera plus sur rien.
    Il faut sinon utiliser COM (je parle sous win, sous linux je ne sais pas).

    D'ailleurs faudra m'expliquer comment tu arrives à compiler un tel code!

Discussions similaires

  1. [CR] Infos sur l'utilisation de dll
    Par step dans le forum SAP Crystal Reports
    Réponses: 11
    Dernier message: 09/08/2002, 11h35
  2. Declarer une dll Delphi ?
    Par DelphiCool dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/07/2002, 10h07
  3. Débug de DLL
    Par Bayard dans le forum C++Builder
    Réponses: 3
    Dernier message: 22/07/2002, 15h08
  4. Equivalent à ExeName pour une DLL
    Par Smortex dans le forum Langage
    Réponses: 7
    Dernier message: 16/07/2002, 21h07
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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