2009-08-12 7 views
5

Étant donné une DLL avec les classes suivantes:__declspec (dllimport/dllexport) et l'héritage

#define DLLAPI __declspec(...) 

class DLLAPI Base 
{ 
    public: 
    virtual void B(); 
}; 

class Derived : public Base 
{ 
    public: 
    virtual void B(); 
    virtual void D(); 
}; 

Est-ce que mon « dérivé » classe visible en dehors de la dll même si le mot-clé « DLLAPI » est pas appliquée au définition de classe (au moins, pas directement)?

La fonction "D()" est-elle visible par?

Merci

Répondre

4

La classe dérivée ne sera pas exportée par votre DLL. Les classes n'héritent pas de l'exportation. Ajoutez DLLAPI à cela aussi.

Notez également que les membres de la classe par défaut à l'accessibilité privée, donc aucune de vos méthodes ne doit être accessible. Cependant, je vois Base :: B() exporté dans mon test. L'en-tête C++ dans le code utilisant DLL marquerait l'erreur, mais je me demande si vous avez modifié l'en-tête là-bas, si vous pouviez le tromper.

Quoi qu'il en soit, si vous avez instancier un Derived dans votre DLL (via un autre point d'entrée), la table virtuelle doit encore travailler, donc si vous avez fait:

Base* b = getTheDerived(); b->B(); 

vous souhaitez invoquez Derived :: B ().

3

Vous pouvez trouver à partir d'un shell de commande Visual Studio en tapant

link /dump /exports <yourdll> 

S'ils sont exportés, vous verrez « noms décorés » pour les fonctions. Pour voir ce qu'ils sont en format lisible par l'homme, copier-coller et faire un

undname <decorated name> 
1

Non, Derived ne sera pas visible à l'extérieur de la DLL. Pour exporter la classe dérivée, vous devez également appliquer la macro DLLAPI aux classes dérivées.

Questions connexes