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 :

Charger une classe contenue dans un .dll


Sujet :

Langage C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 35
    Points : 31
    Points
    31
    Par défaut Charger une classe contenue dans un .dll
    Bonjour à tous,
    Je cherche à charger une classe qui serait compilée dans une .dll.
    J'ai trouvé pas mal de sources sur internet me permettant de compiler en .dll, de charger des fonctions. Mais je ne trouve rien pour charger une classe.
    Pourriez-vous m'orienter vers des documents m'expliquant comment faire?
    Merci.

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Points : 705
    Points
    705

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 35
    Points : 31
    Points
    31
    Par défaut
    J'avais un peu parcouru ces documents. En fait, le problème qui se pose est qu'il est à chaque fois question d'inclure les header de la dll dans le programme principal.
    J'aimerais pouvoir rajouter des modules complémentaires à mon programme sous forme d'une dll contenant des classes dérivée de celles déjà existantes. Le programme étant déjà compilé à l'avance, il n'est pas possible de rajouter ces header à ses sources.

    J'ai à peu prés compris qu'on ne pouvait qu'appeler des fonctions de dll. J'ai donc pensé qu'il me suffirait d'appeler une fonction qui me retourne un pointeur vers la classe contenue dans la .dll. Mais quelques problèmes se posent à moi...

    Voilà ce que j'ai fais pour l'instant.
    main.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
    #ifndef DEF_MAIN
    #define DEF_MAIN
     
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
     
    class parentDLL
    {
    	public :
    		parentDLL() {};
    		virtual int getI() {std::cout << "erreur" << std::endl;};
    };
     
    #endif
    main.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
    #include "main.h"
     
    int main(int argc, char *argv[])
    {
    	parentDLL* dll = new parentDLL;
    	HINSTANCE DLLHandle;
    	typedef parentDLL*(*pointeur_versDLL)();
    	pointeur_versDLL pointeur_fonction;
    	DLLHandle = LoadLibrary("dll.dll");
    	pointeur_fonction = (pointeur_versDLL)GetProcAddress(DLLHandle,"getDllHinstance");
     
    	dll = pointeur_fonction();  //C'est ici que j'ai une erreur.
    	std::cout << dll->getI() << std::endl;
     
    	delete dll;
     
    	return 1;
    }
    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
    20
    21
    #ifndef DEF_DLL
    #define DEF_DLL
     
    #define DllImport   __declspec(dllimport)
     
    #include "main.h"
     
    class myDLL : parentDLL
    {
    	public:
    		myDLL();
    		virtual int getI();
     
    	private :
    		int i;
    };
     
    myDLL* DllImport getDllHinstance();
     
     
    #endif
    et dll.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
    #include "dll.h"
     
    #define DllExport   __declspec(dllexport)
     
    myDLL::myDLL ()
    {
    	i = 42;
    }
     
    int myDLL::getI()
    {
    	return i;
    }
     
    myDLL* DllExport getDllHinstance()
    {
    	return new myDLL;
    }

    Ca compile sans problème, mais lorsque je lance mon programme, j'ai droit à une instruction située à ... et qui emploie d'aldresse ... qui ne peut pas être "read". Je me suis planté quelque part. C'est vraiment du bidouillage, mais pour l'instant j'en suis là...

    C'est la méthode qui n'est pas la bonne, où une erreur bête de pointeur?

    Merci

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Points : 705
    Points
    705
    Par défaut
    Citation Envoyé par NLS le pingouin Voir le message
    J'aimerais pouvoir rajouter des modules complémentaires à mon programme sous forme d'une dll contenant des classes dérivée de celles déjà existantes.
    C'est bien le but ! Tu dois par contre connaitre les classes desquelles tu dérive.
    Généralement dans ce genre de dll tu fais une fonction type qui te permet de récupérer un objet que tu connais.

    Par exemple tu définis une classe A dans ton programme principal (classe qui peut être abstraite). Ta dll contient une classe B dérivée de ta classe A, ainsi qu'une fonction (le point d'entrée de la dll) qui te retourne un objet B sous la forme d'un pointeur vers un objet de classe A.
    Ton programme connaissant la classe A (et le nom de la fonction permettant de récupérer un objet) peut utiliser ton objet B (comme un objet de classe A)...

    Est-ce que c'est un peu plus clair ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 35
    Points : 31
    Points
    31
    Par défaut
    Ok, j'avais bien compris tout ça, mais je m'étais planté en définissant et initialisant mon pointeur vers le parent de la classe définie dans le DLL. Merci d'avoir confirmer ma méthode.

    J'avais un peu mal compris le système de pointeur de fonctions. J'ai dû dépoussiérer le bouquin de Stroustrup qui trainait dans un coin, et tout à fonctionné correctement.

    Si des gens rencontrent le même problème, voilà ce qu'il faudrait faire :
    le nouveau main.cpp devrait plutôt ressembler à ç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
    #include "main.h"
     
    int main(int argc, char *argv[])
    {
    	HINSTANCE DLLHandle;
    	typedef parentDLL*(*pointeur_versDLL)();
    	pointeur_versDLL pointeur_fonction;
    	DLLHandle = LoadLibrary("dll.dll");
    	pointeur_fonction = (pointeur_versDLL)GetProcAddress(DLLHandle,"getDllHinstance");
     
    	parentDLL* dll = pointeur_fonction();// Problème ici!
    	std::cout << dll->getI() << std::endl;
     
    	delete dll;
     
    	return 1;
    }
    Et il semble qu'il ne soit pas trop prudent de rajouter :
    dans les fonctions de la .dll. Si j'ai bien compris, la dll peut être appelée par des programmes en C aussi bien qu'en C++. GetProcAdress étant codé en C, ça peut résoudre bien des problèmes.

    Voili voilà. Merci encore Fallbot.

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

Discussions similaires

  1. Exploiter le nom d'une classe contenu dans une variable
    Par 84mickael dans le forum Langage
    Réponses: 2
    Dernier message: 15/06/2006, 14h23
  2. Réponses: 4
    Dernier message: 08/03/2006, 19h07

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