Determinar el método de exportación que se debe utilizar

Para determinar el método que se debe utilizar para exportar funciones (un archivo .def o la palabra clave __declspec(dllexport)), responda a las siguientes preguntas:

  • ¿Va a seguir agregando funciones exportadas adicionales?

  • ¿Quién va a utilizar el archivo DLL? Por ejemplo, ¿es un archivo DLL de un tercero utilizado por muchos archivos ejecutables que no se puede volver a generar o es un archivo DLL utilizado sólo por aplicaciones que se puede volver a generar fácilmente?

Ventajas y desventajas de utilizar archivos .DEF

La exportación de funciones en un archivo .def permite controlar cuáles son los ordinales de exportación. Cuando agregue funciones exportadas adicionales al archivo DLL, podrá asignarles valores ordinales más altos (más altos que cualquier otra función exportada). Cuando lo haga, las aplicaciones que utilizan una vinculación implícita no tienen que volver a vincularse a la nueva biblioteca de importación que contiene las funciones nuevas. Esto es muy importante, por ejemplo, cuando diseña un archivo DLL de terceros para que lo utilicen muchas aplicaciones. Puede seguir mejorando el archivo DLL agregando funcionalidad adicional a la vez que garantiza que las aplicaciones existentes seguirán funcionando correctamente con el nuevo archivo DLL. Los archivos DLL de MFC se generan utilizando archivos .def.

Otra ventaja de utilizar un archivo .def es que puede exportar funciones con el atributo NONAME, que sólo coloca el ordinal en la tabla de exportaciones del archivo DLL. En el caso de archivos DLL con muchas funciones exportadas, el uso del atributo NONAME puede reducir el tamaño del archivo DLL. Para obtener más información sobre cómo escribir una instrucción de definición de módulo, vea Reglas para instrucciones de definición de módulos. Para obtener más información acerca de la exportación de ordinales, vea Exportar funciones desde un archivo DLL por ordinal en lugar de por nombre.

La principal desventaja de utilizar un archivo .def es que, si exporta funciones de un archivo de C++, tendrá que colocar los nombres representativos en el archivo .def o definir las funciones exportadas con vinculación de C estándar mediante extern "C" para evitar la creación de nombres representativos por parte del compilador.

Si tiene que colocar los nombres representativos en el archivo .def, puede obtenerlos mediante la herramienta DUMPBIN o con la opción /MAP del vinculador. Tenga en cuenta que los nombres representativos producidos por el compilador serán específicos del compilador. Si coloca los nombres representativos producidos por el compilador de Visual C++ en un archivo .def, las aplicaciones que se vinculan al archivo DLL también deberán generarse con la misma versión de Visual C++, de forma que los nombres representativos de la aplicación que hace la llamada coincidan con los nombres exportados del archivo .def del archivo DLL.

Ventajas y desventajas de utilizar __declspec(dllexport)

El uso de __declspec(dllexport) es conveniente, ya que no tiene que ocuparse de mantener un archivo .def y obtener los nombres representativos de las funciones exportadas. Por ejemplo, este método es adecuado si está diseñando un archivo DLL para usarlo con una aplicación que controla. Si vuelve a generar el archivo DLL con nuevas exportaciones, también tiene que reconstruir la aplicación, porque los nombres representativos de las funciones de C++ exportadas podrían cambiar si vuelve a compilar con una versión distinta del compilador.

¿Qué desea hacer?

¿Qué más desea saber?

Vea también

Conceptos

Exportar desde un archivo DLL