Con dllimport y dllexport en las clases de C++
Específicos de Microsoft
Puede declarar las clases de C++ con el atributo de dllimport o de dllexport .Estos formularios implican que la clase completa se importada o exportada.Las clases exportaron esta forma se denominan clases pueden exportar.
El ejemplo siguiente se define una clase exportable.Todas las funciones miembro y se exportan los datos estáticos:
#define DllExport __declspec( dllexport )
class DllExport C {
int i;
virtual int func( void ) { return 1; }
};
Observe que explícito utilice de dllimport y los atributos de dllexport en los miembros de una clase exportable está prohibido.
clases de dllexport
Al declarar una clase dllexport, todas las funciones miembro y exportar miembros de datos estáticos.Debe proporcionar las definiciones de todos estos miembros en el mismo programa.Si no, se genera un error del vinculador.La única excepción a esta regla se aplica a las funciones virtuales puras, que no es necesario proporcionar definiciones explícitas.Sin embargo, dado que el destructor de una clase abstracta se llama siempre al destructor de la clase base, destructores virtuales puros deben proporcionar siempre una definición.Observe que estas reglas son las mismas para las clases nonexportable.
Si exporta los datos de tipo de clase o de funciones que las clases de retorno, se seguras de exportar la clase.
clases de dllimport
Al declarar una clase dllimport, todas las funciones miembro y importan los miembros de datos estáticos.A diferencia del comportamiento de dllimport y de dllexport en tipos de los nonclass, los miembros de datos estáticos no pueden especificar una definición en el mismo programa en la que una clase de dllimport está definido.
herencia y clases de Exportable
Todas las clases base de una clase exportable deben ser pueden exportar.Si no, se genera una advertencia del compilador.Por otra parte, todos los miembros accesibles que también son clases deben ser pueden exportar.esta regla permite que una clase de dllexport heredar de una clase de dllimport , y una clase de dllimport heredar de una clase de dllexport (aunque este último no se recomienda).En general, todo lo accesible al cliente del archivo DLL (según las reglas de acceso de C++) debe formar parte de la interfaz exportable.Esto incluye miembros de datos privados a los que se hace referencia en funciones inline.
Importación/exportación selectivas miembro
Porque funciona el miembro y los datos estáticos dentro de una clase tienen implícitamente vinculación externa, puede declararlos con el atributo de dllimport o de dllexport , a menos que se exporte toda la clase.Si se importa o se exporta la clase completa, la declaración explícita de funciones miembro y los datos mientras se prohíbe dllimport o dllexport .Si declara un miembro de datos estático dentro de una definición de clase como dllexport, una definición debe aparecer en cualquier lugar dentro del mismo programa (que con vinculación externa de los nonclass).
De igual forma, puede declarar funciones miembro con los atributos de dllimport o de dllexport .En este caso, debe proporcionar una definición de dllexport en alguna parte dentro del mismo programa.
Vale la pena comentar varios aspectos importantes con respecto la importación y la exportación selectivas miembro:
Importación/exportación selectivas de miembro está concebida para proporcionar una versión de la interfaz de clase exportada que es más restrictiva; es decir, uno para el que se puede diseñar DLL que expone menos características públicas y privadas que el lenguaje permitiría de otra manera.También es útil para ajustar la interfaz exportable: cuando se sabe que el cliente, por definición, no puede tener acceso a alguna datos privados, no necesita exportar toda la clase.
Si exporta una función virtual de una clase, debe exportar todos, o al menos proporcione las versiones que el cliente puede utilizar directamente.
Si tiene una clase en la que está utilizando la importación/exportación selectivas miembro con funciones virtuales, las funciones deben estar en la interfaz exportable o el define (visible al cliente).
Si define un miembro como dllexport pero no lo incluye en la definición de clase, se genera un error del compilador.Debe definir el miembro en el encabezado de la clase.
Aunque la definición de miembros de clase como dllimport o dllexport pueda, no puede invalidar la interfaz especificada en la definición de clase.
Si define una función miembro en un lugar distinto del cuerpo de la definición de clase en la que se declaró, se genera una advertencia si la función se define como dllexport o dllimport (si esta definición difiere de la especificada en la declaración de clase).