Question

Étant donné une DLL avec les classes suivantes:

#define DLLAPI __declspec(...)

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

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

Est-ce que ma classe « dérivée » être visible à l'extérieur de la dll même si le mot-clé « DLLAPI » est pas appliquée à la définition de classe (au moins, pas directement)?

est la fonction "D ()" visible?

Merci

Était-ce utile?

La solution

classe dérivée ne seront pas exportés par votre DLL. Les classes ne héritent pas l'exportation. Ajouter DLLAPI à cela aussi.

Notez aussi que les membres de la classe par défaut à l'accessibilité privée, donc aucun de vos méthodes doit être accessible. Cependant, je ne vois Base :: B () exportés dans mon test. L'en-tête C dans le code de utilisant DLL signalerais l'erreur, mais je me demande si vous peaufiné l'en-tête là-bas, si vous pouvez 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 auriez invoquez Derived :: B ().

Autres conseils

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, une seule et faire copier-coller

undname <decorated name>

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

Vous devez faire la base et les classes dérivées exportables,

http://msdn.microsoft.com/en-us/library/ 81h27t8c.aspx

All base classes of an exportable class must be exportable. If not, a compiler 
warning is generated.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top