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.