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 :

Chargement d'une DLL


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 24
    Par défaut Chargement d'une DLL
    Bonjour,

    Je souhaiterais savoir si il est possible de charger dynamiquement une dll (loadlibrary) au sein d'un executable, et d'utiliser ensuite ses ressources (classes) sans spécifier un pointeur vers chaque fonction de cette dll avant de les utiliser.

    autrement dit après avoir charger ma DLL dynamiquement, mon programme peut il avoir prit totalement connaissance de toutes les méthodes de ma DLL?

    merci pour votre aide ! ;-)

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Non.
    Mais tu peux obtenir des pointeurs de fonction plus facilement qu'en faisant GetProcAddress() à chaque fois:
    Il te suffit d'une seule fonction retournant:
    • soit un objet contenant des pointeurs de fonction
    • soit un objet d'une classe avec des fonctions virtuelles (ce qui revient au même)

    Et hop, toutes les fonctions virtuelles/pointeurs de fonctions sont disponibles à partir d'un seul objet...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 24
    Par défaut
    décidement medinoc toujours là ! merci à toi

    tu voudrais dire donc qu'il faut que je créé une classe dans ma dll qui contient les pointeurs de fonction que je veux importer dans mon programme, et une fonction qui renvoie cet objet dans mon programme?

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Une structure avec des pointeurs de fonction, oui.

    Ou bien directement des classes avec toutes les fonctions virtuelles, quand c'est approprié.

    Tu peux même faire les deux: Une structure de pointeurs pour toutes les fonctions "libres", et des classes dont les fonctions sont virtuelles quand il est question de faire de l'orienté-objet...

    Le système COM/OLE sous Windows utilise des classes dont toutes les fonctions sont virtuelles, surnommées "Interfaces COM".
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 24
    Par défaut
    merci pour ta reponse.

    j'ai créer une fonction (dans ma DLL) qui instancie une classe de cette DLL et renvoie l'adresse de cet objet dans mon programme (ok l'adresse n'est pas nulle).

    mais après je ne peux pas faire:

    PointeurObjetDLL->MethodObjetDLL().

    Et en fesant un Getprocadress sur MethodObjetDLL() (ce que je prefererai ne pas faire pour chaque methodes), celle ci n'a pas acces au attributs de ObjetDLL. ->probleme violation d'acces.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    La méthode en question doit être virtuelle.
    Généralement, pour des objets ainsi exposés (comme les objets COM), toutes les méthodes sont virtuelles (encore que certaines peuvent aussi être inline).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 24
    Par défaut
    Merci beaucoup médinoc, ca y ai jaccede au methode virtuelle grace a l'objet retourné!!

    simplement quelle est la difference entre virtuel et inline?

    merci encore a toi !

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    • Inline: La méthode est définie directement dans le header et est directement "collée" à chaque appel au lieu d'être "appelée". C'est plus facile à optimiser, mais vite encombrant si les fonctions sont grandes.
      Généralement, les accesseurs à un objet sont inline. De plus, les templates sont forcément inline.
    • Virtuelle: La méthode est accédée par un pointeur de fonction "caché". Typiquement, ces pointeurs sont regroupés dans une table pour chaque classe, et chaque objet de la classe possède un pointeur vers cette table.
    • Ni l'un ni l'autre: La méthode est accédée statiquement et doit se trouver dans une bibliothèque statique ou un fichier source du même projet.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    simplement quelle est la difference entre virtuel et inline?
    Ca n'a rien à voir, mais là le résultat est le même. Disons qu'il faut un moyen à ton programme de retrouver le corps de la fonction.
    Le fait de la déclarer virtuelle fait que ta classe va avoir une v-table avec des pointeurs vers toutes les fonctions virtuelles, donc elle va pouvoir retrouver celles-ci dans la DLL.
    Le fait de la déclarer inline supprime le problème : comme le code se trouve dans l'en-tête, qui est inclus par ton programme, il n'y a plus besoin d'aller chercher la fonction dans la DLL (mais du coup celle-ci est dupliquée).

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Merci, Laurent : Mon explication était trop technique et maintenant que j'ai vu la tienne (plus simple et plus appropriée), j'ai l'impression que la mienne est inutile
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 24
    Par défaut
    merci encore

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

Discussions similaires

  1. [VB] Problème de chargement d'une DLL
    Par Elijha dans le forum Windows Forms
    Réponses: 3
    Dernier message: 10/05/2006, 09h24
  2. Chargement d'une DLL
    Par olive_le_malin dans le forum MFC
    Réponses: 15
    Dernier message: 16/12/2005, 17h09
  3. Réponses: 4
    Dernier message: 03/11/2005, 13h57
  4. Contexte de chargement d'une DLL
    Par Guillemot dans le forum Windows
    Réponses: 2
    Dernier message: 10/07/2005, 09h34
  5. Chargement d'une DLL et utilisation du multithread
    Par Maitre Kanter dans le forum Langage
    Réponses: 6
    Dernier message: 07/09/2004, 23h18

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