Exportar desde un archivo DLL mediante __declspec(dllexport)
Microsoft introdujo __export en la versión del compilador de 16 bits de Visual C++ para que el compilador pudiera generar automáticamente los nombres de exportación y colocarlos en un archivo .lib. Este archivo .lib puede utilizarse de la misma manera que una biblioteca .lib estática para vincularlo a un archivo DLL.
En las versiones del compilador más recientes, se pueden exportar datos, funciones, clases o funciones miembro de clase desde un archivo DLL mediante la palabra clave __declspec(dllexport). __declspec(dllexport) agrega la directiva de exportación al archivo objeto para que no tenga que utilizar un archivo .def.
Esta conveniencia es más aparente cuando se intenta exportar nombres de función representativos de C++. No hay ninguna especificación estándar para la creación de nombres representativos, por lo que el nombre de una función exportada podría cambiar en distintas versiones de compilador. Si utiliza __declspec(dllexport), sólo será necesario volver a compilar los archivos DLL y los archivos.exe dependientes para realizar los cambios de convención de nomenclatura.
Muchas directivas de exportación, como los ordinales, NONAME y PRIVATE, sólo pueden utilizarse en un archivo .def, y no hay ninguna forma de especificar estos atributos sin un archivo .def. Sin embargo, si utiliza __declspec(dllexport) además de un archivo .def, no se producirán errores de compilación.
Para exportar funciones, la palabra clave __declspec(dllexport) deberá aparecer a la izquierda de la palabra clave de convención de llamada si se especifica una palabra clave. Por ejemplo:
__declspec(dllexport) void __cdecl Function1(void);
Para exportar todos los miembros de datos públicos y las funciones miembro de una clase, la palabra clave deberá aparecer a la izquierda del nombre de clase de la manera siguiente:
class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };
Nota
__declspec(dllexport) no se puede aplicar a una función con la convención de llamada __clrcall.
Al generar el archivo DLL, generalmente crea un archivo de encabezado que contiene los prototipos de función o las clases que va a exportar, y agrega __declspec(dllexport) a las declaraciones del archivo de encabezado. Para hacer que el código sea más legible, defina una macro para __declspec(dllexport) y después utilice la macro con cada símbolo que exporte:
#define DllExport __declspec( dllexport )
__declspec(dllexport) almacena nombres de función en la tabla de exportación del archivo DLL. Si desea optimizar el tamaño de la tabla, vea Exportar funciones desde un archivo DLL por ordinal en lugar de por nombre.
Nota
Al trasladar el código fuente del archivo DLL de Win16 a Win32, reemplace cada instancia de __export por __declspec(dllexport).
Como referencia, busque en el archivo de encabezado Winbase.h de Win32. Este archivo contiene ejemplos del uso de __declspec(dllimport).
¿Qué desea hacer?
Exportar funciones de C++ para utilizarlas en ejecutables en C
Exportar funciones de C para utilizarlas en ejecutables en C o C++