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
:
Chiamare
AfxInitExtensionModule
e controllare il valore restituito.Creare un
CDynLinkLibrary
oggetto se la DLL esporta oggettiCRuntimeClass
Structure o dispone di risorse personalizzate.
È 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 DllMain
oggetto . 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