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 :

dllexport, vector<MyClass> -> C2923


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Points : 93
    Points
    93
    Par défaut dllexport, vector<MyClass> -> C2923
    Bonjour,

    J'écris une petite bibliothèque j'ai 2 classes dedans :

    Code layer_part.h : 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
    #pragma once
     
    #include <string>
    #include <vector>
    #include "Polygon.h"
     
    class __declspec(dllexport) Layer_part
    {
    private:
    	std::string _filter;
    	int _order;
    	std::vector<Polygon> _vectPoly;
    public:
    	Layer_part(void);
    	Layer_part(std::string expr_filter, int order);
    	~Layer_part(void);
     
    	void addPolygon(int fill_color, std::string column_filter, int order);
    };
    et
    Code Polygon.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #pragma once
     
    #include <string>
     
    class __declspec(dllexport) Polygon
    {
    private:
    	int _color;
    	std::string _filter;
    	int _order;
    public:
    	Polygon();
    	Polygon(int fill_color, std::string column_filter, int order);
    	~Polygon(void);
    };

    à la compilation, la déclaration du vecteur donne les erreurs suivantes :

    - error C2923: 'std::vector'*: 'Polygon' n'est pas un argument de type modèle valide pour le paramètre '_Ty'

    - warning C4251: 'Layer_part::_vectPoly'*: class 'std::vector<_Ty>' nécessite une interface DLL pour être utilisé(e) par les clients de class 'Layer_part'

    Je ne comprend pas

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Points : 93
    Points
    93
    Par défaut
    Bon,

    Pour l'erreur, je l'ai corrigée en renommant ma classe "Polygon" en "Polygon_data".
    Il y avait sans doute un conflit de nom mais pourquoi alors n'ai-je pas eu plutôt une erreur du type "ambiguous symbol" ...
    bref.

    Pour les warnings, j'ai lu plusieurs choses mais j'en comprend trop peu que pour pouvoir les résoudres proprement.
    De plus j'ai lu qu'elle peuvent donner lieu à de sales problèmes à l'exécution

  3. #3
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Pour les warnings, c'est simple:

    std::vector n'est pas dans une dll, mais une librairie....
    Si ta DLL est compilée avec la std 7.2, le std::vector aura une certaine signature.
    Si un EXE utilisant ta DLL compile avec la std 8.0, le std::vector pourrait avoir une autre signature... => bug, crash et consorts

    Il n'existe que deux moyens propres de passer outre ce warning:

    1. Rendre cette instance particuliere de std::vector implémentée / exportée de ta DLL:
    template __declspec(dllexport) std::vector<Polygon>;
    A noter qu'il faudra faire de même avec std::string

    2. Cacher l'implémentation (et donc l'utilisation de std::string & std::vector)
    Ca se fait dans une classe 'Data' non exportée, et visible seulement depuis l'intérieur de ta DLL;
    Bien sur, il en va de même pour les paramètres, de toute manière, passer un std::string en paramètre d'une fonction....

    Ensuite, attention de ne pas utiliser __declspec(dllexport), mais bien une macro qui fera soit export soit import selon qu'on compile la DLL ou qu'on l'utilise !
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Points : 93
    Points
    93
    Par défaut
    Bonjour,

    Merci pour ta réponse.

    Tout ceci est assez nouveau pour moi et je voudrais être sûr de bien comprendre.

    Ce que tu me suggères, c'est donc de faire c'est :
    Soit de déclarer mon vecteur comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __declspec(dllexport) std::vector<Polygon> _vectPoly
    Soit de regrouper mes variables d'instances provenant de la std:: dans une classe "invisible de l'extérieur" et de la mettre cette classe en variable d'instance de ma classe Polygon

    En ce qui concerne la macro, dois-je la faire dans les 2 cas ?
    Je n'ai jamais écris de macro, peux-tu me donner un exemple ou à défaut un lien vers un exemple ?.

    Un grand merci

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Ghurdyl Voir le message
    Bonjour,

    Merci pour ta réponse.

    Tout ceci est assez nouveau pour moi et je voudrais être sûr de bien comprendre.

    Ce que tu me suggères, c'est donc de faire c'est :
    Soit de déclarer mon vecteur comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __declspec(dllexport) std::vector<Polygon> _vectPoly
    Soit de regrouper mes variables d'instances provenant de la std:: dans une classe "invisible de l'extérieur" et de la mettre cette classe en variable d'instance de ma classe Polygon
    Oui, c'est bien cela... ou dans tout endroit non exporté où le std::vector<Polygon> serait opportun
    En ce qui concerne la macro, dois-je la faire dans les 2 cas ?
    Oui, parce que l'exportation doit avoir lieu lors de la compilation et que l'importation de la dll doit avoir lieu lorsque tu utilise la dll...

    Tu pourrais aussi t'amuser à écrire deux en-têtes différents (l'un pour la compilation qui utilise dllexport et l'autre pour l'utilisation qui utilise dllimport), mais c'est se faire du mal inutilement
    Je n'ai jamais écris de macro, peux-tu me donner un exemple ou à défaut un lien vers un exemple ?.
    il suffit de demander: regarde ma prose dans cette discussion

    Tout y est indiqué
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Points : 93
    Points
    93
    Par défaut
    D'accord merci

    c'est tout à fait clair maintenant

    merci beaucoup

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

Discussions similaires

  1. [Struts] logic:iterate avec un Vector
    Par laurentb dans le forum Struts 1
    Réponses: 18
    Dernier message: 03/03/2004, 14h42
  2. vector et erase()
    Par gytr2 dans le forum SL & STL
    Réponses: 6
    Dernier message: 02/03/2004, 12h45
  3. equivalent Vector du jsp
    Par Djib dans le forum ASP
    Réponses: 4
    Dernier message: 05/12/2003, 08h07
  4. "vector" provoque "syntax error", malgré
    Par seenkay dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 24/08/2003, 03h21
  5. Réponses: 2
    Dernier message: 11/07/2003, 18h24

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