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

SL & STL C++ Discussion :

[DLL & STL] Comment utiliser std::string dans une DLL


Sujet :

SL & STL C++

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 23
    Points : 18
    Points
    18
    Par défaut [DLL & STL] Comment utiliser std::string dans une DLL
    Salut

    Je suis en train de faire une petite dll.
    Mais j'ai un probleme lorsque la fonction que j'exporte a un std::string comme parametre (j'imagine que le meme probleme doit se produire pour les autres classes de la STL).
    J'avais enlevé le warning 4251 (d'apres des conseils sur un site) qui semble avoir un raport avec mon probleme.

    Au chargement de la DLL, si j'ai le malheur d'utiliser la fonction sendMessage( std::string message ), j'ai un beau message box
    Le point d'entrée de procedure .sendMessage@cConnection@@QAE_NV?$basic_string@DU?$char_traits@D@std@@V$allocator@D@2@@std@@@Z" est introuvable dans la bibliotheque de liaison dynamique Client DLL.dll.
    Comment dois-je faire ?
    Dois-je forcement exporter std::string ? (et au passage, comment je le fait ? )

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Déjà, tu devrais utiliser un "name undecorator" (celui qui est approprié à ton compilo) pour obtenir le prototype exact de cette fonction: Il faut être un expert geek pour reconnaitre soi-même le prototype d'une fonction C++ à partir de son nom...
    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
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Non, tu dois exporter ta fonction, là elle n'est pas accessible de l'extérieur.

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Tu ne peux pas utiliser la STL dans les protoypes de fonctions exportées. Pourquoi ? Parce que ta dll compilée va utiliser sa propre instanciation de std::string, et l'exe qui l'utilise la sienne. Et le compilo ne va y avoir que de feux.
    Il faut aussi exporter l'instanciation des conteneurs STL utilisés, ce qui n'est souvent pas possible, et dépendant du compilo.
    Pour ce cas très particulier, il faudrait peut être mieux utiliser les char*.
    Sinon tu peux plus ou moins ignorer tout ça, mais en fonction des options des compilation, ça peut passer, ou se vautrer.
    Cela dit je ne suis pas sûr que ce soit la cause de ton erreur. Sous quel nom est exportée ta fonction ? (regarde avec dependency walker)

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Si on compile avec le même compilateur, ça doit passer, non ?

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    J'avoue debuter dans l'univers mysterieux des DLL, je ne comprend trop pas les termes "name undecorator" ainsi que "dependency walker".

    "name undecorator", c'est surement pour changer le nom avec lequel il est exporté (le truc super moche avec des @ de partout) par un truc plus lisible. Ca serai effectivement pratique : comment on le met en place (j'utilise visual studio 2003).

    Pour repondre à Miles : je pense que la fonction est exporté, dumoins je l'exporte comme les autres fonctions.
    L'application compile (donc il retrouve la fonction dans la lib). C'est à l'execution lors du chargment de la dll que j'ai le message box d'erreur.

    J'ai pensé utiliser les char*, mais c'est beurk
    La FAQ de developpez.com est du meme avis d'ailleur. (et ta signature aussi )

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Miles
    Si on compile avec le même compilateur, ça doit passer, non ?
    si l'exe et la dll partagent la même crt (désolé Ruffi ), oui. Mais c'est du forcing, car ça n'empêche pas que l'exe et la dll auront chacun leur version de std::string. Mais comme elles seront identiques, ça passe... Pour être fiable, il faut que l'un des 2 (la dll typiquement) exporte sa spécialisation de template que l'autre va utiliser. Mais c'est assez limité ( http://support.microsoft.com/kb/168958/en-us )
    http://www.unknownroad.com/rtfm/VisualStudio/warningC4251.html

    Par exemple, j'avais une fois installé QT3 en démo pour m'y essayé. QT3 était livré (en démo) compilé avec VC++ 6, et moi je bossais avec VC++ 7.1. Les 2 compilos ont une STL très différente. Du coup, si je passais une std::string de VC++ 7.1 à une fonction QT3 (std::string VC++ 6), boum, plantage. Le compilo lui n'y voyait rien du tout.

    Citation Envoyé par Ruffi
    J'avoue debuter dans l'univers mysterieux des DLL, je ne comprend trop pas les termes "name undecorator" ainsi que "dependency walker".

    "name undecorator", c'est surement pour changer le nom avec lequel il est exporté (le truc super moche avec des @ de partout) par un truc plus lisible. Ca serai effectivement pratique : comment on le met en place (j'utilise visual studio 2003).
    dependency walker, c'est simplement un logiciel bien pratique dès qu'on parle de dll:
    http://www.dependencywalker.com/

    name undecorator, heu, je dirais que c'est un logiciel capable à partir du nom décoré = mangled (le truc super moche avec des @ de partout) de te sortir un com compréhensible. dependency walker sait le faire pour VC++ (petit bouton C++), mais pas pour les autres (car le name mangling est spécifique à chaque compilo )

    Pour repondre à Miles : je pense que la fonction est exporté, dumoins je l'exporte comme les autres fonctions.
    L'application compile (donc il retrouve la fonction dans la lib). C'est à l'execution lors du chargment de la dll que j'ai le message box d'erreur.
    c'est poru ça qu'il faut regarder avec dependency walker ce qu'exporte ta dll. Encore mieux : lance dependency walker sur ton exe, il te dira tout seul ce qui va pas.

    J'ai pensé utiliser les char*, mais c'est beurk
    La FAQ de developpez.com est du meme avis d'ailleur. (et ta signature aussi )
    tu as bien raison, mais là on sort du cadre du C++ (dll), et y'a des contraintes techniques (la STL / les templates se marient mal avec les dll). La solution simple c'est d'utiliser des libs statiques au lieu de dlls.

  8. #8
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Grace au dependancy walker : bool cConnection::sendMessage(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)

    Pour le coup, je vien de retester mon programme... et ça marche
    Alors, pourquoi ça marchait pas hier, mystere et boule de gomme : aurais-je oublié de mettre la derniere version de la DLL (pourtant, je suis persuadé de l'avoir verifié plusieurs fois), ou etait-ce sous l'effet de la fatigue que je commencai a pas trop savoir se que je faisait.

    D'apres ce que vous m'avez dit, la DLL ne marchera qu'avec des programmes créé avec un compilateur utilisant la meme version de la STL que visual 2003. Pour tout les autres, il faudra donc la recompiler.

    En tout cas, je vous remerci car pour le coup je comprend un peu mieu le fonctionement des dll.

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/05/2006, 11h34
  2. comment utiliser les fonctions d'une dll
    Par sebled dans le forum MFC
    Réponses: 3
    Dernier message: 24/02/2006, 16h59
  3. Réponses: 4
    Dernier message: 16/02/2006, 16h28
  4. utilisation de classe dans une DLL
    Par _stef_ffff_f34 dans le forum Windows
    Réponses: 1
    Dernier message: 10/02/2006, 16h03

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