Pregunta

Dada una DLL con las siguientes clases:

#define DLLAPI __declspec(...)

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

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

¿Mi clase "Derivada" será visible fuera del dll incluso si la palabra clave "DLLAPI" no se aplica a la definición de clase (al menos, no directamente)?

¿Es visible la función "D()"?

Gracias

¿Fue útil?

Solución

clase derivada no será exportada por el archivo DLL. Las clases no heredan exportadora. Añadir DLLAPI a eso también.

Nota también que miembros de la clase por defecto a la accesibilidad privada, por lo que ninguno de los métodos debe ser accesible. Sin embargo, yo veo Base :: B () que se exportan en mi prueba. La cabecera de C ++ en el código DLL que utilizan la bandera haría el error, pero me pregunto si Ajustado el encabezado de ahí, si se puede engañar a él.

De todos modos, si se hizo una instancia de un Derivado dentro de su DLL (a través de otro punto de entrada), la tabla virtual debería funcionar, por lo que si lo hizo:

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

que le invoca Derivado :: B ().

Otros consejos

Puede averiguar a través de una consola de comandos de Visual Studio escribiendo

link /dump /exports <yourdll>

Si se exportan, verá "nombres representativos" para las funciones. Para ver lo que son en formato legible por humanos, copiar y pegar uno y hacer

undname <decorated name>

No, derivado no será visible fuera de la DLL. Con el fin de exportar la clase derivada, se tendría que aplicar la macro DLLAPI a las clases derivadas también.

Hay que hacer la base y clases derivadas exportable,

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.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top