2009-08-12 16 views
5

Dada una DLL con las siguientes clases:__declspec (dllimport/dllexport) y la herencia

#define DLLAPI __declspec(...) 

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

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

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

¿Está visible la función "D()"?

Gracias

Respuesta

4

clase Derivada no será exportada por su DLL. Las clases no heredan la exportación. Agregue DLLAPI a eso también.

Tenga en cuenta también que los miembros de la clase de forma predeterminada a la accesibilidad privada, por lo que ninguno de sus métodos debe ser accesible. Sin embargo, veo que Base :: B() se exporta en mi prueba. El encabezado de C++ en el código que utiliza DLL marcaría el error, pero me pregunto si modificó el encabezado allí, si pudiera engañarlo.

De todos modos, si se hizo una instancia de un Derivado dentro de su DLL (a través de otro punto de entrada), la mesa virtual debe seguir trabajando, por lo que si lo hizo:

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

que le invoca Derivado :: B ()

3

Puede averiguar a través de un intérprete 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> 
1

No, derivada no será visible fuera de la DLL. Para exportar la clase derivada, también debe aplicar la macro DLLAPI a las clases derivadas.