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_MODULEStructure 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:

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