Exportar (0) Imprimir
Expandir todo
Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original

Con dllimport y dllexport en las clases de C++

Usted puede declarar clases de C++ con el atributo dllimport o dllexport. Estos formularios implican que la clase completa sea importada o exportada. Las clases exportadas de esta manera se denominan clases exportables.

El siguiente ejemplo define una clase exportable. Todas sus funciones miembro y todos sus datos estáticos son exportados:

#define DllExport   __declspec( dllexport )

class DllExport C {
   int i;
   virtual int func( void ) { return 1; }
};

Tenga en cuenta que está prohibido el uso explícito de los atributos dllimport y dllexport a los miembros de una clase exportable.

Cuando usted declara una clase dllexport, todas sus funciones miembro y datos estáticos son exportados. 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 es llamado siempre por el destructor de la clase base, los 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, asesegurese de exportar la clase.

Al declarar una clase dllimport, todas las funciones miembro y los datos estáticos son importados. 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.

Todas las clases base de una clase exportable deben ser exportables. Si no, se genera una advertencia del compilador. Por otra parte, todos los miembros accesibles que también son clases deben ser exportables. 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.

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).

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft