Condividi tramite


Macro e funzioni per la gestione delle DLL

Nome Descrizione
AFX_EXT_CLASS] Esporta classi.
AFX_MANAGE_STATE Proteggere una funzione esportata in una DLL.
AfxOleInitModule Fornisce supporto OLE da una normale DLL MFC collegata dinamicamente a MFC.
AfxNetInitModule Fornisce il supporto dei socket MFC da una normale DLL MFC collegata dinamicamente a MFC.
AfxGetAmbientActCtx Ottiene lo stato corrente del flag di stato per modulo.
AfxGetStaticModuleState Imposta lo stato del modulo prima dell'inizializzazione e ripristina lo stato del modulo precedente dopo la pulizia.
AfxInitExtensionModule Inizializza la DLL.
AfxSetAmbientActCtx impostare il flag di stato per modulo, che influisce sul comportamento WinSxS di MFC.
AfxTermExtensionModule Consente a MFC di pulire la DLL dell'estensione MFC quando ogni processo si disconnette dalla DLL.

AFX_EXT_CLASS

Le DLL dell'estensione MFC usano la macro AFX_EXT_CLASS per esportare le classi. I file eseguibili che si collegano alla DLL dell'estensione MFC usano la macro per importare le classi.

Osservazioni:

Con la AFX_EXT_CLASS macro, è possibile usare gli stessi file di intestazione usati per compilare la DLL dell'estensione MFC con i file eseguibili che si collegano alla DLL.

Nel file di intestazione per la DLL aggiungere la AFX_EXT_CLASS parola chiave alla dichiarazione della classe come indicato di seguito:

class AFX_EXT_CLASS CMyClass : public CDocument
{
// <body of class>
};

Per altre informazioni, vedere Esportare e importare usando AFX_EXT_CLASS.

Requisiti

Header:<afxv_dll.h>

AFX_MANAGE_STATE

Chiamare questa macro per proteggere una funzione esportata in una DLL.

Sintassi

AFX_MANAGE_STATE(AFX_MODULE_STATE* pModuleState )

Parametri

pModuleState
Puntatore a una AFX_MODULE_STATE struttura.

Osservazioni:

Quando questa macro viene richiamata, pModuleState è lo stato effettivo del modulo per il resto dell'ambito contenitore immediato. Al termine dell'ambito, lo stato del modulo effettivo precedente verrà ripristinato automaticamente.

La AFX_MODULE_STATE struttura contiene dati globali per il modulo, ovvero la parte dello stato del modulo di cui viene eseguito il push o l'estrazione.

Per impostazione predefinita, MFC utilizza il gestore delle risorse dell'applicazione principale per caricare il modello di risorsa. Se si dispone di una funzione esportata in una DLL, ad esempio una che avvia una finestra di dialogo nella DLL, il modello di risorsa viene archiviato nel modulo DLL. Assicurarsi di cambiare lo stato del modulo per l'handle corretto da usare. È possibile cambiare lo stato aggiungendo il codice seguente all'inizio della funzione:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

Questa macro scambia lo stato del modulo corrente con lo stato restituito da AfxGetStaticModuleState fino alla fine dell'ambito corrente.

Per altre informazioni sugli stati del modulo e MFC, vedere Gestione dei dati sullo stato dei moduli MFC e Nota tecnica 58.

Nota

Quando MFC crea un contesto di attivazione per un assembly, usa AfxWinInit per creare il contesto e AFX_MANAGE_STATE per attivarlo e disattivarlo. Si noti anche che AFX_MANAGE_STATE è abilitato per le librerie MFC statiche, nonché le DLL MFC, per consentire l'esecuzione del codice MFC nel contesto di attivazione appropriato selezionato dalla DLL utente. Per altre informazioni, vedere Supporto per i contesti di attivazione nello stato del modulo MFC.

Requisiti

Header:<afxstat_.h>

AfxOleInitModule

Per il supporto OLE da una NORMALE DLL MFC collegata dinamicamente a MFC, chiamare questa funzione nella funzione della DLL CWinApp::InitInstance MFC regolare per inizializzare la DLL OLE MFC.

Sintassi

void AFXAPI AfxOleInitModule( );

Osservazioni:

La DLL OLE MFC è una DLL di estensione MFC; affinché una DLL di estensione MFC venga cablata in una CDynLinkLibrary catena, deve creare un CDynLinkLibrary oggetto nel contesto di ogni modulo che lo usa. AfxOleInitModule crea l'oggetto CDynLinkLibrary nel contesto della DLL MFC regolare in modo che venga collegato alla CDynLinkLibrary catena di oggetti della NORMALE DLL MFC.

Se si compila un controllo OLE e si usa COleControlModule, non è consigliabile chiamare AfxOleInitModule perché la InitInstance funzione membro per COleControlModule le chiamate AfxOleInitModule.

Requisiti

Intestazione: <afxdll_.h>

AfxNetInitModule

Per il supporto dei socket MFC da una normale DLL MFC collegata dinamicamente a MFC, aggiungere una chiamata a questa funzione nella funzione della CWinApp::InitInstance DLL MFC regolare per inizializzare la DLL MFC Sockets.

Sintassi

void AFXAPI AfxNetInitModule( );

Osservazioni:

La DLL socket MFC è una DLL di estensione MFC; affinché una DLL di estensione MFC venga cablata in una CDynLinkLibrary catena, deve creare un CDynLinkLibrary oggetto nel contesto di ogni modulo che lo usa. AfxNetInitModule crea l'oggetto CDynLinkLibrary nel contesto della DLL MFC regolare in modo che venga collegato alla CDynLinkLibrary catena di oggetti della NORMALE DLL MFC.

Requisiti

Header:<afxdll_.h>

AfxGetAmbientActCtx

Usare questa funzione per ottenere lo stato corrente del flag di stato per modulo, che influisce sul comportamento WinSxS di MFC.

Sintassi

BOOL AFXAPI AfxGetAmbientActCtx();

Valore restituito

Valore corrente del flag di stato del modulo.

Osservazioni:

Quando il flag è impostato (ovvero l'impostazione predefinita) e un thread entra in un modulo MFC (vedere AFX_MANAGE_STATE), viene attivato il contesto del modulo.

Se il flag non è impostato, il contesto del modulo non viene attivato alla voce.

Il contesto di un modulo viene determinato dal relativo manifesto, spesso incorporato nelle risorse del modulo.

Requisiti

Header:<afxcomctl32.h>

AfxGetStaticModuleState

Chiamare questa funzione per impostare lo stato del modulo prima dell'inizializzazione e ripristinare lo stato del modulo precedente dopo la pulizia.

Sintassi

AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState( );

Valore restituito

Puntatore a una AFX_MODULE_STATE struttura.

Osservazioni:

La AFX_MODULE_STATE struttura contiene dati globali per il modulo, ovvero la parte dello stato del modulo di cui viene eseguito il push o l'estrazione.

Per impostazione predefinita, MFC utilizza il gestore delle risorse dell'applicazione principale per caricare il modello di risorsa. Se si dispone di una funzione esportata in una DLL, ad esempio una che avvia una finestra di dialogo nella DLL, il modello di risorsa viene archiviato nel modulo DLL. Assicurarsi di cambiare lo stato del modulo per l'handle corretto da usare. È possibile cambiare lo stato aggiungendo il codice seguente all'inizio della funzione:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

Questa macro scambia lo stato del modulo corrente con lo stato restituito da AfxGetStaticModuleState fino alla fine dell'ambito corrente.

Per altre informazioni sugli stati del modulo e MFC, vedere Gestione dei dati sullo stato dei moduli MFC e Nota tecnica 58.

Requisiti

Header:<afxstat_.h>

AfxInitExtensionModule

Chiamare questa funzione in una DLL di DllMain estensione MFC per inizializzare la DLL.

Sintassi

BOOL AFXAPI AfxInitExtensionModule( AFX_EXTENSION_MODULE& state,  HMODULE hModule );

Parametri

state
Riferimento alla AFX_EXTENSION_MODULE struttura Structure che conterrà lo stato del modulo DLL dell'estensione MFC dopo l'inizializzazione. Lo stato include una copia degli oggetti della classe di runtime inizializzati dalla DLL dell'estensione MFC come parte della normale costruzione di oggetti statici eseguita prima DllMain dell'immissione.

hModule
Handle del modulo DLL dell'estensione MFC.

Valore restituito

TRUE se la DLL dell'estensione MFC è stata inizializzata correttamente; in caso contrario, FALSE.

Osservazioni:

Ad esempio:

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 crea una copia dell'HMODULE della DLL e acquisisce le classi di runtime della DLL (CRuntimeClass strutture) e anche le relative object factory (COleObjectFactory oggetti) da usare in un secondo momento quando viene creato l'oggetto CDynLinkLibrary . Le DLL di estensione MFC devono eseguire due operazioni nella funzione DllMain :

È possibile chiamare AfxTermExtensionModule per pulire la DLL dell'estensione MFC quando ogni processo si disconnette dalla DLL dell'estensione MFC , che si verifica quando il processo viene chiuso o quando la DLL viene scaricata da una AfxFreeLibrary chiamata.

Requisiti

Header:<afxdll_.h>

AfxSetAmbientActCtx

Usare questa funzione per impostare il flag di stato per modulo, che influisce sul comportamento winSxS di MFC.

Sintassi

void AFXAPI AfxSetAmbientActCtx(BOOL bSet);

Parametri

bSet
Nuovo valore del flag di stato del modulo.

Osservazioni:

Quando il flag è impostato (ovvero l'impostazione predefinita) e un thread entra in un modulo MFC (vedere AFX_MANAGE_STATE), viene attivato il contesto del modulo. Se il flag non è impostato, il contesto del modulo non viene attivato alla voce. Il contesto di un modulo viene determinato dal relativo manifesto, spesso incorporato nelle risorse del modulo.

Esempio

BOOL CMFCListViewApp::InitInstance()
{
   AfxSetAmbientActCtx(FALSE);
   // Remainder of function definition omitted.
}

Requisiti

Header:<afxcomctl32.h>

AfxTermExtensionModule

Chiamare questa funzione per consentire a MFC di pulire la DLL dell'estensione MFC quando ogni processo si disconnette dalla DLL , che si verifica quando il processo viene chiuso o quando la DLL viene scaricata da una AfxFreeLibrary chiamata.

Sintassi

void AFXAPI AfxTermExtensionModule( AFX_EXTENSION_MODULE& state, BOOL bAll = FALSE );

Parametri

state
Riferimento alla AFX_EXTENSION_MODULE struttura che contiene lo stato del modulo DLL dell'estensione MFC.

bAll
Se TRUE, pulire tutti i moduli DLL dell'estensione MFC. In caso contrario, pulire solo il modulo DLL corrente.

Osservazioni:

AfxTermExtensionModule eliminerà qualsiasi risorsa di archiviazione locale collegata al modulo e rimuoverà tutte le voci dalla cache della mappa messaggi. Ad esempio:

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
}

Se l'applicazione carica e libera le DLL dell'estensione MFC in modo dinamico, assicurarsi di chiamare AfxTermExtensionModule. Poiché la maggior parte delle DLL dell'estensione MFC non viene caricata in modo dinamico (in genere, sono collegate tramite le librerie di importazione), la chiamata a AfxTermExtensionModule in genere non è necessaria.

Le DLL dell'estensione MFC devono chiamare AfxInitExtensionModule nel relativo DllMainoggetto . Se la DLL esporta CRuntimeClass oggetti o dispone di risorse personalizzate, è necessario creare anche un CDynLinkLibrary oggetto in DllMain.

Requisiti

Header:<afxdll_.h>

Vedi anche

Macro e globali
AfxMessageBox
Gestione dei dati sullo stato dei moduli MFC