TN011: Uso de MFC como parte de un archivo DLL

Esta nota describe los archivos DLL estándar, que permite utilizar la biblioteca MFC como parte de una biblioteca de vínculos dinámicos (DLL) de Windows. Se supone que está familiarizado con las DLL de Windows y cómo construirlas. Para obtener información acerca de extensión de MFC DLL, que permiten crear extensiones a la biblioteca MFC, consulte Versión de DLL de MFC.

Interfaces DLL

Los archivos DLL estándar asume las interfaces entre la aplicación y el archivo DLL se especifican en funciones de C-como normales o clases explícitamente exportadas. No se puede exportar interfaces de clase MFC.

Si un archivo DLL y una aplicación desean utilizar MFC, ambos tienen una opción para utilizar la versión de las bibliotecas MFC compartida o tener una copia de la biblioteca MFC estáticamente enlazada en ellos. En versiones anteriores de Visual C++ 4.0, las bibliotecas de vínculos estáticos MFC eran diferentes para aplicaciones y archivos DLL. Con la versión actual de MFC, la aplicación y el archivo DLL puede utilizar una de las versiones estándar de la biblioteca MFC. No es una biblioteca independiente para archivos DLL en esta versión (MFC hace la elección en tiempo de ejecución).

Los archivos DLL estándar tiene varias ventajas:

Limitaciones de API

Algunas capacidades MFC no son aplicables a la versión de la DLL, ya sea por limitaciones técnicas o porque los servicios son prestados normalmente por la aplicación. Estas limitaciones se enumeran a continuación:

Generando el archivo DLL

Al compilar archivos DLL estándar que se vinculan estáticamente a MFC, deben definirse los símbolos "_USRDLL" y "_WINDLL". El código DLL también debe ser compilado con los siguientes modificadores del compilador:

Al compilar archivos DLL estándar que vincula dinámicamente a MFC, debe definir los símbolos anteriores y utilizar los modificadores del compilador arriba. Además, debe definir el símbolo "_AFXDLL" y su código de DLL debe ser compilado con:

Las interfaces (API) entre la aplicación y el archivo DLL deben exportarse explícitamente. Se recomienda que defina sus interfaces que bajo ancho de banda, apegarse a las interfaces c siempre que sea posible. Interfaces c más directas son más fáciles de mantener que las clases de C++ más complejas.

Coloque su API en un encabezado independiente que se puede incluir archivos de c y C++ (así no limitar a sus clientes DLL para programadores de C++). Ver el encabezado TRACEAPI.H en la muestra de conceptos avanzados de MFC DLLTRACE para obtener un ejemplo. Para exportar sus funciones, escribirlos en la sección de exportación del archivo de definición de módulo (.DEF) o incluir dllexport en las definiciones de función. Utilizar __declspec (dllimport) para importar estas funciones en el cliente ejecutable.

Debe agregar la macro AFX_MANAGE_STATE en el inicio de todas las funciones exportadas en archivos DLL estándar que vincula dinámicamente a MFC para establecer el estado actual del módulo en el uno para el archivo DLL. Esto se hace agregando la siguiente línea de código al principio de funciones exportadas desde el archivo DLL:

nbsp; & nbsp;

AFX_MANAGE_STATE (AfxGetStaticModuleState ())

nbsp; & nbsp;

WinMain - > DllMain

La biblioteca MFC define el punto de entrada estándar de Win32 DllMain que inicializa el objeto derivado de CWinApp como en una aplicación MFC normal. Colocar todos inicialización específica de la DLL en la función miembro InitInstance como en una aplicación MFC normal.

Tenga en cuenta que el mecanismo de CWinApp::Run no se aplica a un archivo DLL, ya que la aplicación posee la bomba principal de mensajes. Si el archivo DLL abre cuadros de diálogo no modales o tiene una ventana de marco principal propia, bomba de mensaje principal de la aplicación debe llamar a una rutina exportada por el archivo DLL que llama CWinApp:: PreTranslateMessage.

Vea el ejemplo DLLTRACE para uso de esta función.

La función de miembro ExitInstance de tu CWinApp clase derivada se llamará desde la MFC proporciona la función DllMain antes de que se descarga el archivo DLL.

¿Qué hacer para vincular todos juntos

Con archivos DLL estándar que se vinculan estáticamente a MFC, debe vincular el archivo DLL con esta biblioteca (NAFXCWD.LIB o NAFXCW.LIB) junto con la versión de los tiempos de ejecución de c llamado ' LIBCMT.LIB'. Estas bibliotecas están predefinidas y pueden instalarse especificando les cuando ejecute la instalación de Visual C++.

Código de ejemplo

Consulte el programa de ejemplo de MFC avanzados conceptos DLLTRACE para obtener un ejemplo completo. Esto incluye una DLL sencilla llamada ' TRACER.DLL' que implementa las banderas AFX traza de diálogo (véase técnica nota 7). También tiene una sencilla aplicación Hola que llama a la DLL para utilizar el cuadro de diálogo.

Varios lo interesante observar:

El siguiente extracto de TRACEAPI.H ilustra lo que se necesita para una API que se define en un archivo DLL estándar vinculado estáticamente a MFC:

# ifdef __cplusplus
extern "C" {}
#endifnbsp; / * __cplusplus * /

struct TracerData
{
    BOOL bEnabled;
    UI&NT banderas;
};

BOOL exporta mucho de PASCAL PromptTraceFlags (FAR TracerData * lpData);

# ifdef __cplusplus
}
# endif

En este ejemplo, la declaración está encerrada en un bloque de "extern"C"{}" para usuarios de C++. Esto tiene varias ventajas. En primer lugar, hace su API DLL utilizable por las aplicaciones cliente no C++. En segundo lugar, reduce el overhead de DLL desde C++ nombre mutilación no se aplicarán al nombre exportado. Por último, hace más fácil agregar explícitamente a una.DEF archivo (para la exportación por ordinal) sin tener que preocuparse por mutilación de nombre.

Todas las funciones de API están "Lejos de exportación PASCAL". Aunque no estrictamente necesarias para las DLL de Win32, estas definiciones se han mantenido por portar espalda fácil para Windows de 16 bits. Las macros lejano, PASCALy Exportar todos ampliar a nada en Win32.

Las estructuras utilizadas por la API no se derivan de clases MFC y están completamente definidas en el encabezado de la API. Esto reduce la complejidad de la interfaz entre la aplicación y la DLL y, una vez más, hace la DLL utilizable por programas de c.

Los punteros de datos utilizados la API son explícitos punteros de lejano . Nuevamente, lejano, no es realmente necesario para Win32, pero es útil si va a compilar el código para Windows de 16 bits en algún momento en el futuro.

&Notas técnicas por número |nbsp; Notas técnicas por categoría

Index