Condividi tramite


Punti di ingresso della funzione DLL esportati

Annotazioni

La libreria Microsoft Foundation Classes (MFC) continua a essere supportata. Tuttavia, non aggiungiamo più funzionalità né aggiorniamo la documentazione.

Per le funzioni esportate di una DLL, usare la macro AFX_MANAGE_STATE per mantenere lo stato globale corretto quando si passa dal modulo DLL alla DLL dell'applicazione chiamante.

Quando viene chiamato, questa macro imposta pModuleState, un puntatore a una AFX_MODULE_STATE struttura contenente dati globali per il modulo, come stato effettivo del modulo per il resto dell'ambito contenitore della funzione. Dopo aver lasciato l'ambito contenente la macro, lo stato del modulo effettivo precedente viene ripristinato automaticamente.

Questo passaggio viene ottenuto creando un'istanza di una classe AFX_MODULE_STATE nello stack. Nel costruttore, questa classe ottiene un puntatore allo stato del modulo corrente e la archivia in una variabile membro e quindi imposta pModuleState come nuovo stato effettivo del modulo. Nel distruttore questa classe ripristina il puntatore archiviato nella variabile membro come stato effettivo del modulo.

Se si dispone di una funzione esportata, ad esempio quella che avvia una finestra di dialogo nella DLL, è necessario aggiungere il codice seguente all'inizio della funzione:

AFX_MANAGE_STATE(AfxGetStaticModuleState())

In questo modo lo stato del modulo corrente viene scambiato con lo stato restituito da AfxGetStaticModuleState fino alla fine dell'ambito corrente.

Se la macro non viene utilizzata, si verificheranno problemi con le AFX_MANAGE_STATE risorse nelle DLL. Per impostazione predefinita, MFC usa l'handle di risorsa dell'applicazione principale per caricare il modello di risorsa. Questo modello viene effettivamente archiviato nella DLL. La causa principale è che le informazioni sullo stato del modulo di MFC non sono state cambiate dalla AFX_MANAGE_STATE macro. L'handle di risorsa viene recuperato dallo stato del modulo MFC. La mancata commutazione dello stato del modulo porta all'uso di un handle di risorsa sbagliato.

AFX_MANAGE_STATE non deve essere inserito in ogni funzione nella DLL. Ad esempio, InitInstance può essere chiamato dal codice MFC nell'applicazione senza AFX_MANAGE_STATE perché MFC sposta automaticamente lo stato del modulo prima di InitInstance e quindi lo ripristina dopo che InitInstance ritorna. Lo stesso vale per tutti i gestori della mappatura dei messaggi. Le DLL MFC regolari hanno effettivamente una routine speciale della finestra master che cambia automaticamente lo stato del modulo prima di instradare qualsiasi messaggio.

Vedere anche

Gestione dei dati sullo stato dei moduli MFC