Stato dei moduli di una DLL MFC regolare collegata a MFC in modo dinamico

La possibilità di collegare dinamicamente una NORMALE DLL MFC alla DLL MFC consente alcune configurazioni molto complesse. Ad esempio, una NORMALE DLL MFC e il file eseguibile che lo usa possono collegare in modo dinamico alla DLL MFC e a qualsiasi DLL di estensione MFC.

Questa configurazione presenta un problema relativo ai dati globali MFC, ad esempio il puntatore all'oggetto corrente CWinApp e gestisce le mappe.

Prima di MFC versione 4.0, questi dati globali risiedevano nella DLL MFC stessa ed erano condivisi da tutti i moduli nel processo. Poiché ogni processo che usa una DLL Win32 ottiene la propria copia dei dati della DLL, questo schema ha fornito un modo semplice per tenere traccia dei dati per processo. Inoltre, poiché il modello AFXDLL presupponeva che ci sarebbe stato un CWinApp solo oggetto e un solo set di mappe di handle nel processo, questi elementi potrebbero essere rilevati nella DLL MFC stessa.

Tuttavia, con la possibilità di collegare dinamicamente una DLL MFC normale alla DLL MFC, è ora possibile avere due o più CWinApp oggetti in un processo, e anche due o più set di mappe di handle. In che modo MFC tiene traccia di quali elementi usare?

La soluzione consiste nell'assegnare a ogni modulo (applicazione o normale DLL MFC) la propria copia di queste informazioni sullo stato globale. Pertanto, una chiamata a AfxGetApp nella NORMALE DLL MFC restituisce un puntatore all'oggetto CWinApp nella DLL, non quello nel file eseguibile. Questa copia per modulo dei dati globali MFC è nota come stato del modulo ed è descritta nella nota tecnica MFC 58.

La routine della finestra comune MFC passa automaticamente allo stato corretto del modulo, quindi non è necessario preoccuparsi di esso in alcun gestore di messaggi implementato nella normale DLL MFC. Tuttavia, quando il file eseguibile chiama nella normale DLL MFC, è necessario impostare in modo esplicito lo stato del modulo corrente su quello per la DLL. A tale scopo, usare la macro AFX_MANAGE_STATE in ogni funzione esportata dalla DLL. A tale scopo, aggiungere la riga di codice seguente all'inizio delle funzioni esportate dalla DLL:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

Scegliere l'argomento su cui visualizzare maggiori informazioni

Vedi anche

Creare DLL C/C++ in Visual Studio