Macros y funciones para administrar DLL
Nombre | Descripción |
---|---|
AFX_EXT_CLASS ] |
Exporta clases. |
AFX_MANAGE_STATE |
Proteja una función exportada en una DLL. |
AfxOleInitModule |
Proporciona compatibilidad con OLE para una DLL de MFC normal vinculada dinámicamente con MFC. |
AfxNetInitModule |
Proporciona compatibilidad con sockets de una DLL de MFC regular vinculada dinámicamente con MFC. |
AfxGetAmbientActCtx |
Obtiene el estado actual de la marca de estado por módulo. |
AfxGetStaticModuleState |
Establece el estado del módulo antes de la inicialización y restaura el estado del módulo anterior después de la limpieza. |
AfxInitExtensionModule |
Inicializa la DLL. |
AfxSetAmbientActCtx |
Establezca la marca de estado por módulo, que afecta al comportamiento de WinSxS de MFC. |
AfxTermExtensionModule |
Permite que MFC limpie la DLL de extensión de MFC cuando cada proceso se desasocie de la DLL. |
AFX_EXT_CLASS
Los archivos DLL de extensión MFC usan la macro AFX_EXT_CLASS
para exportar clases; los ejecutables que se vinculan al archivo DLL de extensión MFC usan la macro para importar clases.
Comentarios
Con la macro AFX_EXT_CLASS
, los mismos archivos de encabezado que se utilizan para compilar la DLL de extensión de MFC se pueden usar con los ejecutables que se vinculan a la DLL.
En el archivo de encabezado de la DLL, agregue la AFX_EXT_CLASS
palabra clave a la declaración de la clase de la siguiente manera:
class AFX_EXT_CLASS CMyClass : public CDocument
{
// <body of class>
};
Para más información, consulte Exportar e importar mediante AFX_EXT_CLASS
.
Requisitos
Encabezado:<afxv_dll.h>
AFX_MANAGE_STATE
Llame a esta macro para proteger una función exportada en una DLL.
Sintaxis
AFX_MANAGE_STATE(AFX_MODULE_STATE* pModuleState )
Parámetros
pModuleState
El valor de este parámetro se corresponde con un puntero que apunta a una estructura AFX_MODULE_STATE
.
Comentarios
Cuando se invoca esta macro, pModuleState
es el estado del módulo efectivo para el resto del ámbito contenedor inmediato. Al salir del ámbito, el estado del módulo efectivo anterior se restaurará automáticamente.
La estructura AFX_MODULE_STATE
contiene datos globales para el módulo, es decir, la parte del estado del módulo que se inserta o se saca.
De forma predeterminada, MFC usa el manipulador de recursos de la aplicación principal para cargar la plantilla de recursos. Si tiene una función exportada en una DLL, como una que inicia un cuadro de diálogo en la DLL, la plantilla de recursos se almacena en el módulo de DLL. Asegúrese de cambiar el estado del módulo para que se use el manipulador correcto. Puede cambiar el estado al agregar el código siguiente al inicio de la función:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
Esta macro intercambia el estado del módulo actual con el estado devuelto desde AfxGetStaticModuleState
hasta el final del ámbito actual.
Para obtener más información sobre los estados del módulo y MFC, consulte Administración de datos de estado de los módulos MFC y la Nota técnica 58.
Nota:
Cuando MFC crea un contexto de activación para un ensamblado, usa AfxWinInit
para crear el contexto y AFX_MANAGE_STATE
activarlo y desactivarlo. Tenga en cuenta también que AFX_MANAGE_STATE
está habilitado para bibliotecas MFC estáticas, así como DLL de MFC, con el fin de permitir que el código MFC se ejecute en el contexto de activación adecuado seleccionado por la DLL de usuario. Para más información, consulte Compatibilidad con los contextos de activación en el estado del módulo MFC.
Requisitos
Encabezado:<afxstat_.h>
AfxOleInitModule
Para la compatibilidad de OLE con una DLL de MFC normal vinculada dinámicamente con MFC, llame a esta función en la función CWinApp::InitInstance
de la DLL de MFC normal con el fin de inicializar la DLL de MFC.
Sintaxis
void AFXAPI AfxOleInitModule( );
Comentarios
La DLL de OLE de MFC es una DLL de extensión de MFC; para que una DLL de extensión de MFC se conecte a una cadena CDynLinkLibrary
, debe crear un objeto CDynLinkLibrary
en el contexto de cada módulo que lo utilizará. AfxOleInitModule
crea el objeto CDynLinkLibrary
en el contexto de la DLL de MFC normal para que se conecte a la cadena de objetos CDynLinkLibrary
de la DLL de MFC normal.
Si va a compilar un control OLE y usa COleControlModule
, no debe llamar a AfxOleInitModule
porque la función miembro InitInstance
para COleControlModule
llama a AfxOleInitModule
.
Requisitos
Encabezado:<afxdll_.h>
AfxNetInitModule
Para la compatibilidad con sockets de MFC de una DLL de MFC normal vinculada dinámicamente a MFC, agregue una llamada a esta función en la función CWinApp::InitInstance
de la DLL de MFC normal a fin de inicializar la DLL de sockets de MFC.
Sintaxis
void AFXAPI AfxNetInitModule( );
Comentarios
La DLL de sockets de MFC es una DLL de extensión de MFC; para que una DLL de extensión de MFC se conecte a una cadena CDynLinkLibrary
, debe crear un objeto CDynLinkLibrary
en el contexto de cada módulo que la utilizará. AfxNetInitModule
crea el objeto CDynLinkLibrary
en el contexto de la DLL de MFC normal para que se conecte a la cadena de objetos CDynLinkLibrary
de la DLL de MFC normal.
Requisitos
Encabezado:<afxdll_.h>
AfxGetAmbientActCtx
Use esta función para obtener el estado actual de la marca de estado por módulo, que afecta al comportamiento de WinSxS de MFC.
Sintaxis
BOOL AFXAPI AfxGetAmbientActCtx();
Valor devuelto
Valor actual de la marca de estado del módulo.
Comentarios
Cuando se establece la marca (que es el valor predeterminado) y un subproceso entra en un módulo MFC (consulte AFX_MANAGE_STATE
), se activa el contexto del módulo.
Si no se establece la marca, el contexto del módulo no se activa en la entrada.
El contexto de un módulo se determina a partir de su manifiesto, a menudo incrustado en los recursos del módulo.
Requisitos
Encabezado:<afxcomctl32.h>
AfxGetStaticModuleState
Llame a esta función para establecer el estado del módulo antes de la inicialización y para restaurar el estado del módulo anterior después de la limpieza.
Sintaxis
AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState( );
Valor devuelto
El valor de este parámetro se corresponde con un puntero que apunta a una estructura AFX_MODULE_STATE
.
Comentarios
La estructura AFX_MODULE_STATE
contiene datos globales para el módulo, es decir, la parte del estado del módulo que se inserta o se saca.
De forma predeterminada, MFC usa el manipulador de recursos de la aplicación principal para cargar la plantilla de recursos. Si tiene una función exportada en una DLL, como una que inicia un cuadro de diálogo en la DLL, la plantilla de recursos se almacena en el módulo de DLL. Asegúrese de cambiar el estado del módulo para que se use el manipulador correcto. Puede cambiar el estado al agregar el código siguiente al inicio de la función:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
Esta macro intercambia el estado del módulo actual con el estado devuelto desde AfxGetStaticModuleState
hasta el final del ámbito actual.
Para obtener más información sobre los estados del módulo y MFC, consulte Administración de datos de estado de los módulos MFC y la Nota técnica 58.
Requisitos
Encabezado:<afxstat_.h>
AfxInitExtensionModule
Llame a esta función en una DLL de extensión de MFC DllMain
para inicializar la DLL.
Sintaxis
BOOL AFXAPI AfxInitExtensionModule( AFX_EXTENSION_MODULE& state, HMODULE hModule );
Parámetros
state
Una referencia a la estructura AFX_EXTENSION_MODULE
Structure que contendrá el estado del módulo DLL de extensión de MFC después de la inicialización. El estado incluye una copia de los objetos de clases de runtime inicializados por la DLL de extensión de MFC como parte de la construcción normal de objetos estáticos ejecutada antes de que se ingrese DllMain
.
hModule
Un manipulador del módulo DLL de extensión de MFC.
Valor devuelto
TRUE
si la DLL de extensión de MFC se inicializa correctamente; de lo contrario, FALSE
.
Comentarios
Por ejemplo:
static AFX_EXTENSION_MODULE NVC_MFC_DLLDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("NVC_MFC_DLL.DLL Initializing!\n");
// MFC extension DLL one-time initialization
if (!AfxInitExtensionModule(NVC_MFC_DLLDLL, hInstance))
return 0;
...
AfxInitExtensionModule
realiza una copia del HMODULE de DLL y captura las clases de runtime (estructurasCRuntimeClass
) de la DLL y también sus generadores de objetos (objetosCOleObjectFactory
) para usarlos más adelante cuando se crea el objeto CDynLinkLibrary
.
Las DLL de extensión de MFC deben realizar dos cosas en su función DllMain
:
Llame a
AfxInitExtensionModule
y compruebe el valor devuelto.Cree un objeto
CDynLinkLibrary
si la DLL va a exportar objetosCRuntimeClass
Structure o tiene sus propios recursos personalizados.
Puede llamar a AfxTermExtensionModule
para limpiar la DLL de extensión de MFC cuando cada proceso se desasocie de la DLL de extensión de MFC (lo que sucede cuando el proceso finaliza o cuando la DLL se descarga de una llamada a AfxFreeLibrary
).
Requisitos
Encabezado:<afxdll_.h>
AfxSetAmbientActCtx
Use esta función para establecer la marca de estado por módulo, que afecta al comportamiento de WinSxS de MFC.
Sintaxis
void AFXAPI AfxSetAmbientActCtx(BOOL bSet);
Parámetros
bSet
Nuevo valor de la marca de estado del módulo.
Comentarios
Cuando se establece la marca (que es el valor predeterminado) y un subproceso entra en un módulo MFC (consulte AFX_MANAGE_STATE
), se activa el contexto del módulo.
Si no se establece la marca, el contexto del módulo no se activa en la entrada.
El contexto de un módulo se determina a partir de su manifiesto, a menudo incrustado en los recursos del módulo.
Ejemplo
BOOL CMFCListViewApp::InitInstance()
{
AfxSetAmbientActCtx(FALSE);
// Remainder of function definition omitted.
}
Requisitos
Encabezado:<afxcomctl32.h>
AfxTermExtensionModule
Llame a esta función para permitir a MFC limpiar la DLL de extensión de MFC cuando cada proceso se desasocie de la DLL (lo que sucede cuando se sale del proceso o cuando la DLL se descarga de una llamada a AfxFreeLibrary
).
Sintaxis
void AFXAPI AfxTermExtensionModule( AFX_EXTENSION_MODULE& state, BOOL bAll = FALSE );
Parámetros
state
Una referencia a la estructura AFX_EXTENSION_MODULE
que contiene el estado del módulo DLL de extensión de MFC.
bAll
Si es TRUE, limpie todos los módulos DLL de extensión de MFC. De lo contrario, limpie solo el módulo DLL actual.
Comentarios
AfxTermExtensionModule
eliminará cualquier almacenamiento local adjunto al módulo y quitará las entradas de la caché de asignación de mensajes. Por ejemplo:
static AFX_EXTENSION_MODULE NVC_MFC_DLLDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("NVC_MFC_DLL.DLL Initializing!\n");
// MFC extension DLL one-time initialization
if (!AfxInitExtensionModule(NVC_MFC_DLLDLL, hInstance))
return 0;
new CMyDynLinkLibrary(NVC_MFC_DLLDLL);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("NVC_MFC_DLL.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(NVC_MFC_DLLDLL);
}
return 1; // ok
}
Si la aplicación carga y libera las DLL de extensión de MFC dinámicamente, asegúrese de llamar a AfxTermExtensionModule
. Dado que la mayoría de los archivos DLL de extensión MFC no se cargan dinámicamente (normalmente, se vinculan a través de sus bibliotecas de importación), la llamada a AfxTermExtensionModule
normalmente no es necesaria.
Las DLL de extensión de MFC deben llamar a AfxInitExtensionModule
en su DllMain
. Si la DLL exporta objetos CRuntimeClass
o tiene sus propios recursos personalizados, también debe crear un objeto CDynLinkLibrary
en DllMain
.
Requisitos
Encabezado:<afxdll_.h>
Consulte también
Macros y variables globales
AfxMessageBox
Administración de los datos de estado de los módulos MFC