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 :

Création DLL explicite avec une classe


Sujet :

C++

  1. #1
    Membre expérimenté Avatar de Bob.Killer
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    336
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 336
    Par défaut Création DLL explicite avec une classe
    Bonjour,

    je travail sous visual studio 2005 et donc sous windows.

    Je voudrais savoir si on peut créer une dll contenant une classe avec une lisaison explicite ?

    explicite : sans avoir à lier avec un .lib dans l'exécutable, mais grace à LoadLibrary, GetProcAddress, FreeLibrary.

    merci !

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    À moins de n'employer que des fonctions virtuelles, tu ne peux.
    Il te faut également exporter une fonction libre qui instancie un objet et retourne un pointeur.

    C'est ce que fait COM/OLE avec ces interfaces et la fonction DllGetClassObject() que doit implémenter toute DLL COM/OLE.
    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 expérimenté Avatar de Bob.Killer
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    336
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 336
    Par défaut
    oki thx pour ta réponse rapide

  4. #4
    Membre expérimenté Avatar de Bob.Killer
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    336
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 336
    Par défaut
    bon j'ai réussi à compiler mon projet avec visual studio 2005, mais avec g++ j'ai quelque problème :s

    savez vous déjà si cela est possible ? et si oui comment car il n'y a pas beaucoup de documents sur internet pour la compilation d'une dll avec g++...

    merci d'avance !

  5. #5
    Membre expérimenté Avatar de Bob.Killer
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    336
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 336
    Par défaut
    j'ai trouvé une page qui va pouvoir m'aider je pense

    pour ceux que ça interesse :
    http://www.mingw.org/MinGWiki/index.php/sample%20DLL

    je teste ça tout de suite !

  6. #6
    Membre expérimenté Avatar de Bob.Killer
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    336
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 336
    Par défaut
    Bon je vais encore poser une question, et là je seche complet...

    (je bosse sous windows)

    maintenant je peux soit tout compiler sous Visual Studio 2005, soit tout compiler sous g++

    mais si je tente d'utiliser la dll compiler sous visual avec mon exe compilé sous g++, et inversement ça plante méchament...

    je pensais qu'une dll compiler sous n'importe quel langage pouvait être utilisé avec n'importe quel langage

    (je pense peu être savoir d'ou ça vient : les 2 dlls compilées sous g++ et Visual ne fond pas du tout le même poid, donc visual n'externaliserait pas qq truc ?)

    merci de tenter de me répondre !

  7. #7
    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
    Ca dépend de l'utilisation que tu fais.

    Par exemple si tu utilises des classes de la STL dans ce que tu exportes, ça risque de planter car l'implémentation n'est probablement pas la même pour VC++ et MinGW. En gros ta DLL va renvoyer un std::string sous la forme {taille, pointeur}, et, pas de bol, dans ton EXE les std::string sont sous la forme {pointeur, taille}.

    Ce n'est qu'un exemple des erreurs qu'on peut avoir en mixant les compilos.

  8. #8
    Membre expérimenté Avatar de Bob.Killer
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    336
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 336
    Par défaut
    ouai bizarre...

    cela concerne juste le C++ ?

    car j'ai déjà vu des programmes pouvant utiliser des dlls compilé par n'importe quelle compilateur...

    y'aurait pas un truc du genre à ajouter : __stdcall ou __cdecl ?

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    De plus, les noms de fonctions C++ ne sont pas standardisés sous Windows, seuls les noms C le sont.
    C'est pourquoi toutes les fonctions doivent posséder une interface C (c'est pour ça qu'en C++, on les déclare extern "C") pour être utilisées d'un compilateur à l'autre.

    Et je plussoie Laurent, il est très déconseillé de passer des types de la STL à travers les frontières d'une DLL.
    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.

  10. #10
    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
    Tu peux tenter un débogage avec Visual Studio 2005 (exécute ta DLL, et lorsqu'il te demandera quel EXE utiliser, fournis lui celui compilé avec MinGW).

    Ca limitera déjà les recherches.

  11. #11
    Membre expérimenté Avatar de Bob.Killer
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    336
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 336
    Par défaut
    oki, en gros si je veux faire une dll complétement portable par rapport à n'importe quel compilo, faut que je la fasse entièrement en C, prout alors...

  12. #12
    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
    Pas entièrement en C, seule l'interface exportée doit l'être.

    Et puis là on parlait de fonctions, à mon avis il n'y a aucun problème à exporter des classes.

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Si, justement.
    L'interface d'une classe est entièrement en C++...
    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.

  14. #14
    Membre expérimenté Avatar de Bob.Killer
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    336
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 336
    Par défaut
    ouai bon j'ai fait quelques tests...

    donc les fonctions en C pas de soucis sur leurs exports/imports à partir de n'importe quel exe (g++ ou visual)

    par contre les classes ne vont pas du tout... même en utilisant pas du tout la std, ça plante...

    j'en conclut donc que pour avoir des dlls utilisable partout il faut qu'elle soit en C et non C++

  15. #15
    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
    Si, justement.
    L'interface d'une classe est entièrement en C++...
    Oui mais quel genre de problèmes ça peut causer entre compilos différents ? Tu pensais aux décorations de noms ?

  16. #16
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    C'est ça. Les noms C++ diffèrent d'un compilateur à l'autre (alors que les noms C sont standardisés sous Windows).
    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.

  17. #17
    Membre éprouvé
    Inscrit en
    Décembre 2006
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 103
    Par défaut
    Personnellement, je n'est jamais réussi à créer une DLL contenant une classe avec g++

  18. #18
    Membre expérimenté Avatar de Bob.Killer
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    336
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 336
    Par défaut
    oki, donc pour mes classes en dll ça réduit un peu le champ d'action niveau compilateur

    on va utiliser la bonne vieille méthode C, c'est vraiment dommage, c'est si beau la programmation objet !

  19. #19
    Membre expérimenté Avatar de Bob.Killer
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    336
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 336
    Par défaut
    re...

    je crois avoir trouvé une page internet qui parle de ce problème, mais c'est en anglais et je capte malheureusement pas tout

    http://www.nabble.com/Shareable-bina...-t2334475.html

    si quelqu'un comprend !

  20. #20
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par Laurent Gomila
    Oui mais quel genre de problèmes ça peut causer entre compilos différents ?
    Les alignements peuvent être différents, le mécanisme des fonctions virtuelles peut être différent, tout comme celui de l'héritage multiple. L'un peut implémenter l'EBCO, pas l'autre,...

    En gros, il faut standardiser l'ABI (application binary interface) pour que ça marche. Il me semble qu'il y avait eu un effort dans ce sens sous Linux, je ne sais pas ce que ça a donné. Sous windows, c'est COM qui sert de standardisation des binaires, avec toutes les lourdeurs introduites par un binding C++ pensé après coup.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/10/2014, 16h53
  2. [Mapping] Création de vue avec une classe implémentant "AuxiliaryDatabaseObject"
    Par nighthammer dans le forum Hibernate
    Réponses: 0
    Dernier message: 06/08/2012, 15h32
  3. Utilisation iterator avec une classe perso
    Par SteelBox dans le forum C++
    Réponses: 19
    Dernier message: 07/03/2005, 11h30
  4. [C#][WebServices] Appel methode avec une classe en paramètre
    Par bran_noz dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/09/2004, 16h41
  5. [Débutant][Conception] Erreur avec une classe interne
    Par Devil Redneck dans le forum Général Java
    Réponses: 5
    Dernier message: 11/06/2004, 15h45

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