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 :

[DLL] DLL et export d'interfaces


Sujet :

C++

  1. #1
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut [DLL] DLL et export d'interfaces
    Bonjour,

    J'ai une interface de base IMonInterfaceTresUtilisee et deux implémentations Deriv1 et Deriv2.

    Deriv1 et Deriv2 sont toutes deux dans des DLLs différentes.
    Elles incluent chacune le même fichier <IMonInterfaceTresUtilisee.h>, et héritent de l'interface.

    Deriv1 et Deriv2 sont exportées par leur DLLs respectives (__declspec(dllexport)) mais pas IMonInterfaceTresUtilisee qui est un simple fichier .h isolé.

    La compilation passe mais j'ai tout de même un joli C4275 non – DLL-interface classkey 'identifier' used as base for DLL-interface classkey 'identifier'.

    Je n'ai pas encore fait le test mais je m'attends au pire : serais-je en mesure d'utiliser ces interfaces dans une tierce application ?

    Comment remédier à cela :
    - Faire une DLL pour cette simple interface ?
    - Dupliquer le fichier dans chacune des DLLs pour pouvoir l'exporter ?

  2. #2
    screetch
    Invité(e)
    Par défaut
    c'est un warning abusif que j'ai retiré dans mes applis.
    il n'est pas toujours abusif mais... souvent. par exemple, deriver de types STL va generer ce warning, ce qui est une erreur.
    Si ton interface ne definit que des methodes virtuelles pures, il n'y a aucun risque.

  3. #3
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Ok ça me rassure, merci. Je confirmerai avec des tests.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    par exemple, deriver de types STL va generer ce warning
    En même temps c'est pas bien !
    Tu donnes cet exemple parce que tu le fais ?

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    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 391
    Par défaut
    Ça me parait bizarre que tu exportes directement une classe dans une DLL si tu utilises des interfaces. Normalement, l'utilité des interfaces dans les DLL est justement de ne pas avoir à exporter la classe par nom: On exporte juste une fonction d'instanciation dynamique (et une fonction de destruction, qui elle, peut être une des fonctions membres) qui retourne un pointeur du type interface...
    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
    Expert confirmé

    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
    Billets dans le blog
    3
    Par défaut
    Oui, c'est de ce que j'allais dire....

    En général, l'utilité de l'interface est de cacher Deriv1 ou Deriv2.

    Quant au warning abusif, je ne pense pas qu'il le soit...
    La norme ne dit rien quant à l'implémentation que doit avoir la STL, et elle peut être implémentée différemment entre plusieurs compilateurs.
    Et rien ne dit que le std::string d'une DLL soit le std::string de l'executable qui utilise cette DLL.

    Si c'est vraiment nécessaire, alors il faut typer le template avec instanciation exportée, et plus de problême (plus de warning d'ailleurs ).

    Maintenant, TOTO dérive de TITI... si TOTO est exportée, TITI doit être aussi exportée (pas forcément par la même DLL d'ailleurs).
    Pour des raisons de RTTI, ca joue *aussi* sur les interface. Il est parfois possible d'enlever le warning avec le __declspec(novtable), et en désactivant le RTTI je crois...
    D'ailleurs, sous VStudio, j'utilise un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define interface   struct __declspec(novtable)

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    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 391
    Par défaut
    Sous Visual, j'utilise directement les macros DECLARE_INTERFACE() et cie de COM, que mes interfaces soient des interfaces COM ou non. D'ailleurs, l'usage de ces macros a le mérite de rendre l'interface utilisable 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.

  7. #7
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    Ok ça me rassure, merci. Je confirmerai avec des tests.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    par exemple, deriver de types STL va generer ce warning
    En même temps c'est pas bien !
    Tu donnes cet exemple parce que tu le fais ?
    oui et je n'en ai pas honte. ca me permet de les changer de namespace...
    j'ai cherché a emuler un typedef templatisé


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    namespace Engine
    {
      template< typename T, typename Alloc >
      class vector<T,Alloc> : public std::vector<T,Alloc>
      {
      };
    }
     
    Engine::vector<int> v;

  8. #8
    screetch
    Invité(e)
    Par défaut
    je pense que j'ai confondu avec le warning C4251
    qui lui est généré a partir des membres (et pas des classes mères)
    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
    #ifndef THREAD_H_
    #define THREAD_H_
     
    #include <vector>
     
    #include <windows.h>
     
    #ifdef BUILDING_THREAD_DLL
    # define THREAD_EXPORT __declspec(dllexport)
    #else
    # define THREAD_EXPORT __declspec(dllimport)
    #endif
     
    class THREAD_EXPORT Thread
    {
    private:
    	std::vector<int> m_params;
    public:
    	Thread(int exitCode);
    	~Thread();
    };
     
    #endif
    http://www.unknownroad.com/rtfm/Visu...ningC4251.html

Discussions similaires

  1. dll : échec d'export
    Par granbapt dans le forum C++
    Réponses: 3
    Dernier message: 01/06/2012, 09h30
  2. Réponses: 40
    Dernier message: 21/06/2007, 17h58
  3. msimg32.dll (dll pour faire des gradiants) VB6 et innosetup
    Par hpfx dans le forum Installation, Déploiement et Sécurité
    Réponses: 4
    Dernier message: 25/04/2006, 20h53
  4. Réponses: 4
    Dernier message: 01/07/2004, 11h53
  5. [VB6] [DLL] DLL à instance unique
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 19/09/2003, 08h07

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