Stato dei moduli di una DLL regolare collegata a MFC in modo dinamico
La possibilità di collegare in modo dinamico una DLL regolare a una DLL MFC consente di ottenere alcune configurazioni molto complesse.Una DLL regolare e l'eseguibile che la utilizza possono, ad esempio, essere entrambi collegati in modo dinamico alla DLL MFC e a qualsiasi DLL di estensione.
Questa configurazione crea un problema relativo ai dati globali di MFC, ad esempio il puntatore all'oggetto CWinApp corrente e le mappe degli handle.
Nelle versioni di MFC precedenti alla 4.0 questi dati globali risiedevano nella DLL MFC stessa ed erano condivisi da tutti i moduli del processo.Poiché ciascun processo che utilizza una DDL Win32 ottiene la propria copia dei dati della DLL, questo schema consentiva di tenere traccia facilmente dei dati a livello di singolo processo.Inoltre, poiché il modello AFXDLL presupponeva l'esistenza di un unico oggetto CWinApp e di un unico set di mappe di handle nel processo, questi elementi potevano essere controllati nella DLL MFC stessa.
Tuttavia, grazie alla possibilità di collegare in modo dinamico una DLL regolare a una DLL MFC, è ora possibile disporre di due o più oggetti CWinApp in un processo e anche di due o più insiemi di mappe di handle.Di seguito viene spiegato come MFC tiene traccia degli elementi da utilizzare.
Il problema viene risolto assegnando a ciascun modulo, applicazione o DLL regolare, la propria copia delle informazioni di stato globali.In tal modo, una chiamata a AfxGetApp nella DLL regolare restituisce un puntatore all'oggetto CWinApp nella DLL, non a quello nell'eseguibile.Questa copia dei dati globali di MFC per modulo è detta stato del modulo e viene descritta nella Nota tecnica 58 di MFC.
Poiché la routine comune della finestra di MFC passa automaticamente allo stato del modulo corretto, non occorre preoccuparsene negli eventuali gestori di messaggi implementati nella DLL regolare.Quando l'eseguibile effettua una chiamata nella DLL regolare, è necessario impostare in modo esplicito lo stato del modulo corrente su quello relativo alla DLL.A tal fine, utilizzare la macro AFX_MANAGE_STATE in ogni funzione esportata dalla DLL,aggiungendo la seguente riga di codice all'inizio delle funzioni esportate dalla DLL:
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))