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 :

pb: "passage" d'une std::map à une method dans une lib externe


Sujet :

SL & STL C++

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Août 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 2
    Points : 1
    Points
    1
    Par défaut pb: "passage" d'une std::map à une method dans une lib externe
    Bonjour

    mon problème est le suivant:
    Quand je crée une std::map dans un executable, et que je la passe (par valeur ou référence) à une méthode d'un objet compilé dans une DLL externe, je n'arrive pas à accéder à tous les élements de la map (ça plante à partir du deuxième).
    Voila un bout de code minimal qui illustre mon pb:
    main.cpp: l'"application".
    dll.h et dll.cpp : la dll qui contient l'objet et la méthode en question
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #pragma warning( disable: 4786 )
     
    #include <map>
    #include <iostream>
    #include <string>
    #include "dll.h"
     
    int main ()
    {
    	std::map<const std::string, std::string>  l_map;
    	std::map<const std::string, std::string>::iterator it;
    	int i;
     
    	l_map["1"] = "2";
    	l_map["3"] = "4";
    	l_map["5"] = "6";
     
    	for (it = l_map.begin(); it != l_map.end(); it++)
    	{
    		std::cout << (*it).first << ": " << (*it).second << "\n";
    	} // là, tout s'affiche bien.
     
    	CDll obj;
    	obj.f(l_map);
     
    	std::cin >> i;
    	return 0;
    }
    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
    #pragma warning( disable: 4786 )
     
    #include <map>
    #include <iostream>
    #include <string>
     
    #ifdef DLL_EXPORTS
    #define DLL_API __declspec(dllexport)
    #else
    #define DLL_API __declspec(dllimport)
    #endif
     
    class DLL_API CDll
    {
    public:
    	void f(std::map<const std::string, std::string>& p_map);
    };
    dll.cpp________________________
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "dll.h"
     
    void CDll::f(std::map<const std::string, std::string>& p_map)
    {
    	std::map<const std::string, std::string>::iterator it;
     
    	for (it = p_map.begin(); it != p_map.end(); it++)
    	{
    		std::cout << "DLL: " <<(*it).first << ": " << (*it).second << "\n";
    	} // là, ça plante au deuxième passage
    }
    Le même code tout dans un exe ne pose pas de problème.
    Une idée?

    Merci d'avance.

  2. #2
    Nouveau Candidat au Club
    Inscrit en
    Août 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 2
    Points : 1
    Points
    1
    Par défaut il semble que le pb vienne de map
    Bonjour encore ;-)

    un bout de "solution"
    il semblerait que le pb concerne seulement les map (j'ai pas essayé les list)
    si on passe un vector de pair de string (vector<pair<string, string> > ça marche.
    On perd alors les aventages de tri de la map, mais comme dans mon cas je me'en fiche (ouf ;-) ) ça marche.
    Mais bon, ça ne résoud pas vraiment ce pb.

    Peut etre que ça vient de l'implémentation de la stl map de microsoft visual 6.
    J'ai pas encore essayé avec d'autres compilateur...

  3. #3
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    DLL et exécutable ont bien été compilés avec exactement la même version de la STL ? Sinon ça peut poser problème, dans la mesure où l'implémentation de la STL peut varier complétement entre deux versions différentes.

  4. #4
    Membre confirmé Avatar de toxcct
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 434
    Points : 511
    Points
    511
    Par défaut
    Citation Envoyé par ledzzep
    dll.h________________________________________
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class DLL_API CDll
    {
    public:
        void f(std::map<const std::string, std::string>& p_map);
    };
    mon intervention n'a rien a voir avec la repose que tu attends, mais d'un point de vue des access, tu devrais également changer la signature de ta méthode en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        void CDll::f(const std::map<const std::string, std::string>& p_map) const;
    ...dans la mesure ou ni la classe, ni le parametre ne sont altérés...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Bonjour à tous,

    J'ai plus ou moins le même problème avec l'utilisation des DLL. En fait, dans mon cas, j'ai une fonction de la DLL qui me retourne une multimap<string,string>.
    En effet, lors de l'appel de la fonction DLL dans mon .exe, j'ai un plantage (Violation de partage).

    J'ai regardé pas mal de forum qui précisent en effet que certains objets STL ne sont pas compatibles avec une utilisation en DLL. Apparemment, le problème serait lié à l'utilisation de méthodes STL statiques dans l'implémentation des types incompatibles (multimap).
    Par contre, je n'ai pas trouvé un site (microsoft) officiel qui précise les objets incompatibles avec une utilisation en DLL.

    Si quelqu'un à donc une idée à ce sujet ou un article, n'hésitez pas.

    Lucas

  6. #6
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    En plus d'être compilées avec les mêmes version, si on ne veut pas avoir des contraintes sur les allocations mémoire, il faut utiliser une runtime C elle aussi dans une DLL, et non liée statiquement. Avec visual studio, c'est l'option de compilation "[debug] multithread dll"

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    En ce qui me concerne ma DLL et mes EXE sont tous 2 en Multithreaded DLL.

    En lisant tous les sujets concernant les DLL vs STL, j'ai un peu peur. LE problème c'est que j'ai une librairie DLL qui utilise beaucoup les std::string et ostringstream et tout fonctionne très bien. Le premier bug découvert concerne les multimap. J'ai vu que seul le symbole vector peut être utilisé. J'ai testé et effectivement c'est ok.

    Ma question est la suivante :
    Y a-t-il un risque qu'un jour cela me "pete à la gueule" ? (excusez l'expression...)

    On travaille sur un projet assez conséquent et il y a déjà une petite centaine de .exe qui utilisent sans problème cette librairie... Faut-il donc que je songe à tout refaire sans utiliser la STL (ce qui est bien dommageable) ?

    Merci,

    Lucas

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut, et bienvenue sur le forum...

    Ce qu'il faut en fait, c'est t'assurer que les différents points d'entrée de ta dll (pour faire simple: toutes les fonctions exportées par ta dll que tu peux appeler d'en dehors de celle-ci) soient "aussi peu soumis aux aléas des versions de compilateur" que possible.

    En gros, tout ce qui devrait entrer ou sortir de ta dll devrait n'être que types primitifs et pointeurs vers ceux-ci de manière à éviter les risques inhérents aux implémentation différentes de la STL selon la version (ou l'origine) du compilateur.

    Cela ne t'empêche nullement de travailler avec la S(T)L pour toute la logique effective, mais cela demande de penser à "convertir" la valeur de retour ou l'argument en (pointeur sur) un type primitif au moment opportun

Discussions similaires

  1. Acceder a la fonction membre d'une classe, dans une std::map
    Par student_php dans le forum Débuter
    Réponses: 2
    Dernier message: 10/05/2011, 20h38
  2. Réponses: 2
    Dernier message: 20/06/2006, 08h22
  3. Libérer des pointeurs dans une std::map
    Par GaldorSP dans le forum SL & STL
    Réponses: 2
    Dernier message: 09/07/2005, 14h42

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