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 :

utilisation d'un objet dans une bibliotheque dynamique


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Par défaut utilisation d'un objet dans une bibliotheque dynamique
    Bonjour.
    J'ai un projet dans lequel j'utilise des librairies dynamiques.(pour un systeme de plugin).
    Mon souci viens du codage d'une librairie. Dans cette librairie, je déclare une classe, ses méthodes etc ... pas de soucis.
    J'ai ensuite une fonction "a part" dans la librairie, qui prend un argument un pointeur sur l'objet défini dans la librairie, et une autre pointeur, sur un autre objet.

    Avec chacun de ces pointeurs, j'utilise des méthodes des objets.
    Ca compile parfaitement.
    En revanche a l'exécution, j'ai une erreur "unknwown symbol" lors de l'ouverture de la librairie.(je n'ai pas d'erreur si je ne fais qu'utiliser un attribut de l'objet).

    Si je commente la ligne ou j'utilise la méthode de l'objet "a part", je n'ai plus d'erreur d'exécution (en laissant la ligne ou j'utilise la méthode de l'objet défini dans la librairie).


    Ma question est donc : comment faire pour qu'une fonction d'une librairie dynamique puisse utiliser les méthoses d'un objet passé en parametre ?

    J'epsere etre clair, je vous donnerais les listing de code si nécessaire.

    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    ton os est windows ? linux ? autres ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Par défaut
    Mon OS est linux, pardon de ne pas l'avoir précisé.
    J'allais donner l'url du lien que j'ai utilisé pour commencer ce travail quand j'ai vu ton pseudo... c'est donc ton tuto

    J'ai aussi suivi celui ci http://www.linux.com/howtos/C++-dlop...solution.shtml avant de lire le tiens.

    Je pourrais montrer du code ce soir une fois chez moi

  4. #4
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    montre le code oui

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Par défaut
    ok, donc dans mon projet (un bot irc en fait), j'ai un fichier "plugin.hpp" (jamais reussi à diviser en .cpp/.h), le voici :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    #ifndef PLUGIN_HPP
     
    #define PLUGIN_HPP
    #include "message.h"
    #include "ircprotocol.h"
    #include <vector>
    #include <string>
    using namespace std;
    class Plugin;
    typedef enum {
    IN_LOOP,IN_COMMAND_HANDLER,IN_TYPE_HANDLER,IN_BEFORE_TREATMENT,IN_ALL_MSGS,OUT_ALL_MSGS
    } func_type;
    typedef bool (*PluginFunction)(Message*,Plugin *,IRCProtocol*);
    typedef Plugin *(*plugin_constructor)();
    typedef void (*plugin_destructor)(Plugin*);
    typedef struct 
    {
    	string name;
    	void * handle;
    	Plugin* object;
    	plugin_constructor creator;
    	plugin_destructor destructor;
    } pPlugin;
    typedef struct 
     
    {
    	void * handle;
    	string highlightedWord;
    	Plugin* object;
    	func_type type;
    	string symbole;
    	PluginFunction function ;
     
    }StructFunctionStorage;
     
    class Plugin {
    protected:
    	string author;
    	string description;
    	string version;
    	string name;
    public:
       Plugin()
    	{
    		this->author = "";
    		this->description = "";
    		this->version = "";
    		this->name = "";
    	};
       virtual ~Plugin(){};
    	virtual vector<StructFunctionStorage> getFunctions()=0;
    	string getAuthor()
    	{
    		return this->author;
    	};
    	string getDescription()
    	{
    		return this->description;
    	};
    	string getVersion()
    	{
    		return this->version;
    	};
    	string getName()
    	{
    		return this->name;
    	};
    	bool checkMembers()
    	{
    		if ( this->getAuthor() == "" )
    			return false;
    		if ( this->getDescription() == "" )
    			return false;
    		if ( this->getVersion() == "" )
    			return false;
    		if ( this->getName() == "" )
    			return false;
    		return true;
    	};
    };
    #endif
    J'ai ensuite un fichier "ping.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
     
     
    #ifndef PING_H
     
    #define PING_H
    #include "../plugin.hpp"
    #include <iostream>
    using namespace std;
     
    class Ping : public Plugin
    {
    public:
    	Ping();
    	vector<StructFunctionStorage> getFunctions();
    };
     
    #endif
    et son .cpp correspondant :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    #include "ping.h"
     
    Ping::Ping()
    {
    	this->author = "eponyme";
    	this->description = "Make the bot answer \"pong\" to \"ping\" message";
    	this->version = "0.1";
    	this->name = "ping";
    }
     
    vector<StructFunctionStorage> Ping::getFunctions()
    {
    	vector<StructFunctionStorage> funcs;
    	funcs.push_back((StructFunctionStorage){NULL,"",this,IN_ALL_MSGS,"pong",NULL});
    	return funcs;
    }
     
    extern "C"
    {
    	Plugin *contruct()
    	{
    		Plugin* toto = new Ping();
    		toto->getFunctions();/*test pour voir si j'etais bien capable d'utiliser un objet créé*/
    		return toto;
    	}
    	void destroy(Plugin*p)
    	{
    		delete p;
    	}
    	bool pong (Message*m,Plugin*p,IRCProtocol*i)
    	{
    		p->getFunctions();
    		//m->getSplit();
                   return true; //modifier !
    	}
    }
    C'est dans la derniere fonction, "pong" que ca plante. si je decommente le "m->getSplit()" ,alors je ne peux plus ouvrir ma librairie (comment on dit DLL sous linux ?

    Je sais que mon fichier "plugin.hpp" est un peu "crade", notemment a cause de tous les typedef mis n'importe ou. C'est temporaire, mais j'ai tellement "d'inclusion croisées" que j'étais content que ca fonctionne de cette facon

    N'hésite pas a me demander d'autre description de classes si tu le souhaite.

    Merci pour ton aide

    epo

  6. #6
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    comment ca tu peux plus l'ouvrir ? il fait quoi ?

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par eponyme
    C'est dans la derniere fonction, "pong" que ca plante. si je decommente le "m->getSplit()" ,alors je ne peux plus ouvrir ma librairie
    Essayes de faire un graphe sur un bout de papier (c'est dingue ce que la programmation objet peut bouffer en papier ), avec les relations des objets entre eux... qui utilise quoi et comment.

    Si un objet ObA d'une librairie LibA, utilise un objet ObB, alors ou bien ObB est dans la même librairie (LibA), ou dans une autre librairie dont LibA dépend.

    Dans le cas des plug-ins, en général c'est:
    library-with-plugin-definition.dll
    plugin1.dll (qui utilise library-with-plugin-definition.dll)
    plugin2.dll (qui utilise library-with-plugin-definition.dll)

    program.exe (qui utilise library-with-plugin-definition.dll, et peut charger plugin1.dll et plugin2.dll)

    Tu as plus qu'à remplacer dll avec so , ca marche pareil.

    A noter que si la définition du plug-in n'introduit pas de code, alors le simple .h peut suffire. Mais dans ton cas, Message et IRCProtocol semblent venir d'ailleurs !

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

Discussions similaires

  1. Utiliser MPI dans une bibliotheque
    Par caribou.lf dans le forum Threads & Processus
    Réponses: 4
    Dernier message: 28/07/2011, 14h29
  2. [PHP 5.3] Utiliser un objet dans une vue
    Par leccux dans le forum Langage
    Réponses: 9
    Dernier message: 31/12/2010, 13h44
  3. utilisation d'un objet dans une variable session
    Par hammag dans le forum Langage
    Réponses: 1
    Dernier message: 28/04/2009, 14h59
  4. utilisation d'objet dans une class
    Par turican2 dans le forum Langage
    Réponses: 4
    Dernier message: 19/02/2009, 15h43
  5. [delphi 5,6,7] utiliser un objet dans une procédure
    Par wizdom dans le forum Langage
    Réponses: 3
    Dernier message: 27/01/2006, 15h38

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