Exportar desde un archivo DLL mediante archivos DEF

Un archivo de definición de módulo (.def) es un archivo de texto que contiene una o varias instrucciones de módulo que describen distintos atributos de un archivo DLL. Si no utiliza la palabra clave __declspec(dllexport) para exportar las funciones del archivo DLL, el archivo DLL requerirá un archivo .def.

Un archivo .def mínimo debe contener las siguientes instrucciones de definición de módulo:

  • La primera instrucción del archivo debe ser la instrucción LIBRARY. Esta instrucción identifica el archivo .def como perteneciente a un archivo DLL. A la instrucción LIBRARY le sigue el nombre del archivo DLL. El vinculador coloca este nombre en la biblioteca de importación del archivo DLL.

  • La instrucción EXPORTS muestra los nombres y, opcionalmente, los valores ordinales de las funciones exportadas por el archivo DLL. Para asignar a la función un valor ordinal debe escribir a continuación del nombre de la función el signo @ (arroba) y un número. Cuando especifique valores ordinales, deberán estar dentro del intervalo de 1 a N, donde N es el número de funciones exportadas por el archivo DLL. Si desea exportar funciones por ordinal, vea Exportar funciones desde un archivo DLL por ordinal en lugar de por nombre, así como este tema.

Por ejemplo, un archivo DLL que contiene el código para implementar un árbol de búsqueda binaria podría tener la siguiente apariencia:

LIBRARY   BTREE
EXPORTS
   Insert   @1
   Delete   @2
   Member   @3
   Min   @4

Si utiliza el Asistente para archivos DLL de MFC para crear un archivo DLL de MFC, el asistente creará un archivo .def de estructura y lo agregará automáticamente al proyecto. Agregue a este archivo los nombres de las funciones que se van a exportar. Para archivos DLL que no estén basados en MFC, deberá crear personalmente el archivo .def y agregarlo al proyecto.

Si va a exportar funciones de un archivo de C++, tendrá que colocar los nombres representativos en el archivo .def o definir las funciones exportadas con vinculación C estándar utilizando extern "C". 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 deben 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.

Si está generando un archivo DLL de extensión y exportando mediante un archivo .def, coloque el código siguiente al principio y al final de los archivos de encabezado que contienen las clases exportadas:

#undef AFX_DATA
#define AFX_DATA AFX_EXT_DATA
// <body of your header file>
#undef AFX_DATA
#define AFX_DATA

Estas líneas garantizan que se exportan (o importan) las variables MFC utilizadas internamente o agregadas a las clases desde el archivo DLL de extensión. Por ejemplo, al derivar una clase mediante DECLARE_DYNAMIC, la macro se expandirá para agregar una variable miembro CRuntimeClass a la clase. Si no incluye estas cuatro líneas, el archivo DLL puede compilarse o vincularse incorrectamente, o causar un error cuando se vincule la aplicación cliente al archivo DLL.

Al generar el archivo DLL, el vinculador utiliza el archivo .def para crear un archivo de exportación (.exp) y un archivo de biblioteca de importación (.lib). El vinculador utiliza después el archivo de exportación para generar el archivo DLL. Los ejecutables que se vinculan implícitamente al archivo DLL se vinculan a la biblioteca de importación cuando se generan.

Tenga en cuenta que MFC utiliza archivos .def para exportar funciones y clases desde MFCx0.dll.

¿Qué desea hacer?

¿Sobre qué desea obtener más información?

Vea también

Conceptos

Exportar desde un archivo DLL