Share via


Puntos de entrada de funciones exportadas de un archivo DLL

En el caso de las funciones exportadas de un archivo DLL, use la macro AFX_MANAGE_STATE para mantener el estado global adecuado al cambiar del módulo DLL al archivo DLL de la aplicación que realiza la llamada.

Cuando se llama a esta macro, se establece pModuleState, un puntero a una estructura AFX_MODULE_STATE que contiene datos globales para el módulo, como estado efectivo del módulo para el resto del ámbito contenedor de la función. Al salir del ámbito que contiene la macro, el estado del módulo efectivo anterior se restaura automáticamente.

Este cambio se logra mediante la construcción de una instancia de una clase AFX_MODULE_STATE en la pila. En su constructor, esta clase obtiene un puntero al estado del módulo actual y lo almacena en una variable miembro y, a continuación, establece pModuleState como el nuevo estado del módulo efectivo. En su destructor, esta clase restaura el puntero almacenado en su variable miembro como estado de módulo efectivo.

Si tiene una función exportada, como la que inicia un cuadro de diálogo en su DLL, tiene que agregar el código siguiente al principio de la función:

AFX_MANAGE_STATE(AfxGetStaticModuleState())

Esto intercambia el estado del módulo actual con el estado devuelto desde AfxGetStaticModuleState hasta el final del ámbito actual.

Si no se usa la macro AFX_MANAGE_STATE, se producirán problemas con los recursos de las DLL. De forma predeterminada, MFC usa el manipulador de recursos de la aplicación principal para cargar la plantilla de recursos. Esta plantilla se almacena realmente en la DLL. La causa principal es que la macro AFX_MANAGE_STATE no ha cambiado la información de estado del módulo de MFC. El manipulador de recursos se recupera del estado del módulo de MFC. No cambiar el estado del módulo hace que se use el manipulador de recursos incorrecto.

No es necesario poner AFX_MANAGE_STATE en todas las funciones de la DLL. Por ejemplo, se puede llamar a InitInstance mediante el código MFC de la aplicación sin AFX_MANAGE_STATE porque MFC desplaza automáticamente el estado del módulo antes de InitInstance y luego lo vuelve a cambiar después de que InitInstance vuelve. Lo mismo sucede con todos los manipuladores de la asignación de mensajes. Las DLL de MFC normales tienen realmente un procedimiento especial de ventana maestra que cambia automáticamente el estado del módulo antes de enrutar cualquier mensaje.

Consulte también

Administración de los datos de estado de los módulos MFC